🐈

Azure Container Instance で Azure Filesをマウントしてみた

2023/09/29に公開

はじめに

操作方法ガイドにある ACI ファイル共有をやる方法をやってみました。
仕組みとしてはdockerのマウントに近いらしいです。なるほど?🤔
https://learn.microsoft.com/ja-jp/azure/container-instances/container-instances-volume-azure-files

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