Azure Container Instance で Azure Filesをマウントしてみた
はじめに
操作方法ガイドにある ACI ファイル共有をやる方法をやってみました。
仕組みとしてはdockerのマウントに近いらしいです。なるほど?🤔
Azure ファイル共有を作成する
リソースグループは事前に作っておいて、ロケーションはよく使う東日本で設定します。
$ ACI_PERS_RESOURCE_GROUP=aci-sample
ACI_PERS_STORAGE_ACCOUNT_NAME=acisample$RANDOM
ACI_PERS_LOCATION=japaneast
ACI_PERS_SHARE_NAME=acishare
$ az storage account create \
--resource-group $ACI_PERS_RESOURCE_GROUP \
--name $ACI_PERS_STORAGE_ACCOUNT_NAME \
--location $ACI_PERS_LOCATION \
--sku Standard_LRS
The public access to all blobs or containers in the storage account will be disallowed by default in the future, which means default value for --allow-blob-public-access is still null but will be equivalent to false.
{
"accessTier": "Hot",
"allowBlobPublicAccess": true,
"allowCrossTenantReplication": null,
"allowSharedKeyAccess": null,
"allowedCopyScope": null,
"azureFilesIdentityBasedAuthentication": null,
"blobRestoreStatus": null,
"creationTime": "2023-09-29T05:58:13.130612+00:00",
"customDomain": null,
"defaultToOAuthAuthentication": null,
"dnsEndpointType": null,
"enableHttpsTrafficOnly": true,
"enableNfsV3": null,
"encryption": {
"encryptionIdentity": null,
"keySource": "Microsoft.Storage",
"keyVaultProperties": null,
"requireInfrastructureEncryption": null,
"services": {
"blob": {
"enabled": true,
"keyType": "Account",
"lastEnabledTime": "2023-09-29T05:58:13.458706+00:00"
},
"file": {
"enabled": true,
"keyType": "Account",
"lastEnabledTime": "2023-09-29T05:58:13.458706+00:00"
},
"queue": null,
"table": null
}
},
"extendedLocation": null,
"failoverInProgress": null,
"geoReplicationStats": null,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/aci-sample/providers/Microsoft.Storage/storageAccounts/acisample25188",
"identity": null,
"immutableStorageWithVersioning": null,
"isHnsEnabled": null,
"isLocalUserEnabled": null,
"isSftpEnabled": null,
"keyCreationTime": {
"key1": "2023-09-29T05:58:13.177414+00:00",
"key2": "2023-09-29T05:58:13.177414+00:00"
},
"keyPolicy": null,
"kind": "StorageV2",
"largeFileSharesState": null,
"lastGeoFailoverTime": null,
"location": "japaneast",
"minimumTlsVersion": "TLS1_0",
"name": "acisample25188",
"networkRuleSet": {
"bypass": "AzureServices",
"defaultAction": "Allow",
"ipRules": [],
"resourceAccessRules": null,
"virtualNetworkRules": []
},
"primaryEndpoints": {
"blob": "https://acisample25188.blob.core.windows.net/",
"dfs": "https://acisample25188.dfs.core.windows.net/",
"file": "https://acisample25188.file.core.windows.net/",
"internetEndpoints": null,
"microsoftEndpoints": null,
"queue": "https://acisample25188.queue.core.windows.net/",
"table": "https://acisample25188.table.core.windows.net/",
"web": "https://acisample25188.z11.web.core.windows.net/"
},
"primaryLocation": "japaneast",
"privateEndpointConnections": [],
"provisioningState": "Succeeded",
"publicNetworkAccess": null,
"resourceGroup": "aci-sample",
"routingPreference": null,
"sasPolicy": null,
"secondaryEndpoints": null,
"secondaryLocation": null,
"sku": {
"name": "Standard_LRS",
"tier": "Standard"
},
"statusOfPrimary": "available",
"statusOfSecondary": null,
"storageAccountSkuConversionStatus": null,
"tags": {},
"type": "Microsoft.Storage/storageAccounts"
}
$ az storage share create \
--name $ACI_PERS_SHARE_NAME \
--account-name $ACI_PERS_STORAGE_ACCOUNT_NAME
There are no credentials provided in your command and environment, we will query for account key for your storage account.
It is recommended to provide --connection-string, --account-key or --sas-token in your command as credentials.
In addition, setting the corresponding environment variables can avoid inputting credentials in your command. Please use --help to get more information about environment variable usage.
{
"created": true
}
ストレージの資格情報の取得
Azure Container Instances で Azure ファイル共有をボリュームとしてマウントするには、ストレージ アカウント名、共有名、ストレージ アクセス キーの 3 つの値が必要です。
なるほど。
ストレージアカウント名は ACI_PERS_STORAGE_ACCOUNT_NAME、共有名はACI_PERS_SHARE_NAME で先に定義していたので、ストレージアクセスキーを変数に格納します。
$ STORAGE_KEY=$(az storage account keys list --resource-group $ACI_PERS_RESOURCE_GROUP --account-name $ACI_PERS_STORAGE_ACCOUNT_NAME --query "[0].value" --output tsv)
$ echo $STORAGE_KEY
コンテナーのデプロイとボリュームのマウント - CLI
コンテナグループを作ります。
--dns-name-label 値は、コンテナー インスタンスを作成する Azure リージョン内で一意である必要があります。
とあるので、dns-name-labelを好きな値に変更します。
$ az container create \
--resource-group $ACI_PERS_RESOURCE_GROUP \
--name hellofiles \
--image mcr.microsoft.com/azuredocs/aci-hellofiles \
--dns-name-label aci-files-share-25188 \
--ports 80 \
--azure-file-volume-account-name $ACI_PERS_STORAGE_ACCOUNT_NAME \
--azure-file-volume-account-key $STORAGE_KEY \
--azure-file-volume-share-name $ACI_PERS_SHARE_NAME \
--azure-file-volume-mount-path /aci/logs/
{
"confidentialComputeProperties": null,
"containers": [
{
"command": null,
"environmentVariables": [],
"image": "mcr.microsoft.com/azuredocs/aci-hellofiles",
"instanceView": {
"currentState": {
"detailStatus": "",
"exitCode": null,
"finishTime": null,
"startTime": "2023-09-29T06:49:26.481000+00:00",
"state": "Running"
},
"events": [
{
"count": 1,
"firstTimestamp": "2023-09-29T06:49:08+00:00",
"lastTimestamp": "2023-09-29T06:49:08+00:00",
"message": "pulling image \"mcr.microsoft.com/azuredocs/aci-hellofiles@sha256:4f96c56eb2af8224672e1a7fdc1ac4400eadf4d58c118af2c89cdc8a816974ee\"",
"name": "Pulling",
"type": "Normal"
},
{
"count": 1,
"firstTimestamp": "2023-09-29T06:49:11+00:00",
"lastTimestamp": "2023-09-29T06:49:11+00:00",
"message": "Successfully pulled image \"mcr.microsoft.com/azuredocs/aci-hellofiles@sha256:4f96c56eb2af8224672e1a7fdc1ac4400eadf4d58c118af2c89cdc8a816974ee\"",
"name": "Pulled",
"type": "Normal"
},
{
"count": 1,
"firstTimestamp": "2023-09-29T06:49:26+00:00",
"lastTimestamp": "2023-09-29T06:49:26+00:00",
"message": "Started container",
"name": "Started",
"type": "Normal"
}
],
"previousState": null,
"restartCount": 0
},
"livenessProbe": null,
"name": "hellofiles",
"ports": [
{
"port": 80,
"protocol": "TCP"
}
],
"readinessProbe": null,
"resources": {
"limits": null,
"requests": {
"cpu": 1.0,
"gpu": null,
"memoryInGb": 1.5
}
},
"securityContext": null,
"volumeMounts": [
{
"mountPath": "/aci/logs/",
"name": "azurefile",
"readOnly": null
}
]
}
],
"diagnostics": null,
"dnsConfig": null,
"encryptionProperties": null,
"extensions": null,
"id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/aci-sample/providers/Microsoft.ContainerInstance/containerGroups/hellofiles",
"identity": null,
"imageRegistryCredentials": null,
"initContainers": [],
"instanceView": {
"events": [
{
"count": 1,
"firstTimestamp": "2023-09-29T06:49:25.665000+00:00",
"lastTimestamp": "2023-09-29T06:49:25.665000+00:00",
"message": "Successfully mounted Azure File Volume.",
"name": "SuccessfulMountAzureFileVolume",
"type": "Normal"
}
],
"state": "Running"
},
"ipAddress": {
"autoGeneratedDomainNameLabelScope": "Unsecure",
"dnsNameLabel": "aci-files-share-25188",
"fqdn": "aci-files-share-25188.japaneast.azurecontainer.io",
"ip": "20.27.181.177",
"ports": [
{
"port": 80,
"protocol": "TCP"
}
],
"type": "Public"
},
"location": "japaneast",
"name": "hellofiles",
"osType": "Linux",
"priority": null,
"provisioningState": "Succeeded",
"resourceGroup": "aci-sample",
"restartPolicy": "Always",
"sku": "Standard",
"subnetIds": null,
"tags": {},
"type": "Microsoft.ContainerInstance/containerGroups",
"volumes": [
{
"azureFile": {
"readOnly": null,
"shareName": "acishare",
"storageAccountKey": null,
"storageAccountName": "acisample25188"
},
"emptyDir": null,
"gitRepo": null,
"name": "azurefile",
"secret": null
}
],
"zones": null
}
※ちなみに、dns-name-labelを変更しなかった場合はこんなエラーが出ました。
(InternalServerError) Encountered an internal server error. The tracking activity id is '831c5e55-0265-4cdd-adaa-abe97511e1e2', correlation id is '0eaa2cdc-ff7a-481c-b376-d60e85879625'.
Code: InternalServerError
Message: Encountered an internal server error. The tracking activity id is '831c5e55-0265-4cdd-adaa-abe97511e1e2', correlation id is '0eaa2cdc-ff7a-481c-b376-d60e85879625'.
DNS 名ラベルのエラー メッセージが表示された場合は、前述のコマンドの値を更新してください。
とあるけど、実際にはInternalServerErrorだったので、エラーがわかりづらいです。
よく読めって話なんですけどね。
マウントしたボリューム内のファイルの管理
コンテナのFQDNを取得します。
$ az container show --resource-group $ACI_PERS_RESOURCE_GROUP \
--name hellofiles --query ipAddress.fqdn --output tsv
aci-files-share-25188.japaneast.azurecontainer.io
取得したFQDNでアクセスしてみるとこんな画面が表示されます。
適当に入力してみます。
Portalから Azure Files を確認します。ファイルができてますね。
編集でファイルの中を見てみます。先ほどsubmitした文字列がいました。
これでファイル共有はできました。
割と簡単にできました。
おわりに
ACIからAzureFiles へのアクセスは参照権限だけにしたいなーとか
ネットワーク周りどうしようかなーといろいろありますが、基礎はこんな感じですね。
とりあえず消す前にARMのテンプレートは落としておいて、パイプラインで使えるようにはしておこうかと思います。
Discussion