Azure Container Instances に Azure ファイル共有をマウントする

既定では、Azure Container Instances はステートレスです。 コンテナーが再起動されるか、クラッシュまたは停止すると、そのすべての状態が失われます。 コンテナーの有効期間後も状態を保持するには、外部ストアからボリュームをマウントする必要があります。 この記事に示すように、Azure Container Instances では Azure Files で作成された Azure ファイル共有をマウントすることができます。 Azure Files は、Azure Storage でホストされ、業界標準の Server Message Block (SMB) プロトコルを介してアクセスできる、完全に管理されたファイル共有を提供します。 Azure Container Instances で Azure ファイル共有を使用することで、 Azure 仮想マシンで Azure ファイル共有を使用するのと同様のファイル共有機能を提供します。

制限事項

  • Azure Files 共有は、Linux コンテナーにのみマウントできます。 Linux と Windows コンテナー グループの機能サポートの違いについての詳細は、概要に関するページを参照してください。
  • Azure ファイル共有ボリュームのマウントでは、Linux コンテナーを "ルート" として実行している必要があります。
  • Azure ファイル共有ボリュームのマウントは、CIFS サポートに限定されています。

Note

Azure Files 共有をコンテナー インスタンスにマウントすることは、Docker のバインド マウントに似ています。 ファイルまたはディレクトリが存在するコンテナー ディレクトリに共有をマウントする場合、ファイルまたはディレクトリはマウントによって隠され、コンテナーの実行中はアクセスできなくなります。

重要

Azure Virtual Network にコンテナー グループをデプロイする場合は、Azure ストレージ アカウントにサービス エンドポイントを追加する必要があります。

Azure ファイル共有を作成する

Azure Container Instances で Azure ファイル共有を使用するには、まず、ファイル共有を作成する必要があります。 次のスクリプトを実行して、ファイル共有および共有自体をホストするためのストレージ アカウントを作成してください。 ストレージ アカウント名はグローバルに一意にする必要があるため、このスクリプトは、ベース文字列にランダムな値を追加します。

# Change these four parameters as needed
ACI_PERS_RESOURCE_GROUP=myResourceGroup
ACI_PERS_STORAGE_ACCOUNT_NAME=mystorageaccount$RANDOM
ACI_PERS_LOCATION=eastus
ACI_PERS_SHARE_NAME=acishare

# Create the storage account with the parameters
az storage account create \
    --resource-group $ACI_PERS_RESOURCE_GROUP \
    --name $ACI_PERS_STORAGE_ACCOUNT_NAME \
    --location $ACI_PERS_LOCATION \
    --sku Standard_LRS

# Create the file share
az storage share create \
  --name $ACI_PERS_SHARE_NAME \
  --account-name $ACI_PERS_STORAGE_ACCOUNT_NAME

ストレージの資格情報の取得

Azure Container Instances で Azure ファイル共有をボリュームとしてマウントするには、ストレージ アカウント名、共有名、ストレージ アクセス キーの 3 つの値が必要です。

  • ストレージ アカウント名 - 前出のスクリプトを使用した場合、ストレージアカウント名は $ACI_PERS_STORAGE_ACCOUNT_NAME 変数に格納されました。 アカウント名を表示するには、次のように入力します。

    echo $ACI_PERS_STORAGE_ACCOUNT_NAME
    
  • 共有名 - この値は既にわかっています (前出のスクリプトで acishare として定義されています)

  • ストレージ アカウント キー - この値は次のコマンドを使用して確認できます。

    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

Azure CLI を使用して Azure ファイル共有をコンテナー内のボリュームとしてマウントするには、az container create でコンテナーを作成する際に、共有とボリュームのマウント ポイントを指定します。 前述の手順に従った場合、次のコマンドを使ってコンテナーを作成すれば、先ほど作成した共有をマウントすることができます。

az container create \
    --resource-group $ACI_PERS_RESOURCE_GROUP \
    --name hellofiles \
    --image mcr.microsoft.com/azuredocs/aci-hellofiles \
    --dns-name-label aci-demo \
    --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/

--dns-name-label 値は、コンテナー インスタンスを作成する Azure リージョン内で一意である必要があります。 コマンドを実行したときに DNS 名ラベルのエラー メッセージが表示された場合は、前述のコマンドの値を更新してください。

マウントしたボリューム内のファイルの管理

コンテナーが起動したら、Microsoft aci-hellofiles イメージ経由でデプロイされる単純な Web アプリを使用して、指定したマウント パスにある Azure ファイル共有内に小さいテキスト ファイルを作成できます。 az container show コマンドを使用して、Web アプリの完全修飾ドメイン名 (FQDN) を取得します。

az container show --resource-group $ACI_PERS_RESOURCE_GROUP \
  --name hellofiles --query ipAddress.fqdn --output tsv

アプリを使用してテキストを保存したら、Azure portal または Microsoft Azure Storage Explorer などのツールを使用して、ファイル共有に書き込まれる 1 つ以上のファイルを取得および検査することができます。

コンテナーのデプロイとボリュームのマウント - YAML

Azure CLI と YAML テンプレートを使用して、コンテナー グループをデプロイしてコンテナー内にボリュームをマウントすることもできます。 複数のコンテナーから成るコンテナー グループをデプロイするときは、YAML テンプレートによるデプロイ方法が推奨されます。

以下の YAML テンプレートは、aci-hellofiles イメージで作成されたコンテナーを 1 つ含むコンテナー グループを定義しています。 コンテナーでは、以前にボリュームとして作成された Azure ファイル共有 acishare がマウントされます。 示されているように、ファイル共有をホストするストレージ アカウントの名前とストレージ キーを入力します。

CLI の例のように、dnsNameLabel 値は、コンテナー インスタンスを作成する Azure リージョン内で一意である必要があります。 必要に応じて、YAML ファイル内の値を更新します。

apiVersion: '2019-12-01'
location: eastus
name: file-share-demo
properties:
  containers:
  - name: hellofiles
    properties:
      environmentVariables: []
      image: mcr.microsoft.com/azuredocs/aci-hellofiles
      ports:
      - port: 80
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
      volumeMounts:
      - mountPath: /aci/logs/
        name: filesharevolume
  osType: Linux
  restartPolicy: Always
  ipAddress:
    type: Public
    ports:
      - port: 80
    dnsNameLabel: aci-demo
  volumes:
  - name: filesharevolume
    azureFile:
      sharename: acishare
      storageAccountName: <Storage account name>
      storageAccountKey: <Storage account key>
tags: {}
type: Microsoft.ContainerInstance/containerGroups

この YAML テンプレートを使ってデプロイするには、上記の YAML を deploy-aci.yaml という名前のファイルに保存し、--file パラメーターを指定して az container create コマンドを実行します。

# Deploy with YAML template
az container create --resource-group myResourceGroup --file deploy-aci.yaml

コンテナーのデプロイとボリュームのマウント - Resource Manager

CLI と YAML によるデプロイに加え、Azure Resource Manager テンプレートを使って、コンテナー グループをデプロイしてコンテナー内にボリュームをマウントすることもできます。

最初に、テンプレートのコンテナー グループ properties セクションに volumes 配列を入力します。

次に、ボリュームをマウントする各コンテナーに対して、コンテナー定義の properties セクションで volumeMounts 配列を設定します。

以下の Resource Manager テンプレートは、aci-hellofiles イメージで作成されたコンテナーを 1 つ含むコンテナー グループを定義しています。 コンテナーでは、以前にボリュームとして作成された Azure ファイル共有 acishare がマウントされます。 示されているように、ファイル共有をホストするストレージ アカウントの名前とストレージ キーを入力します。

前の例のように、dnsNameLabel 値は、コンテナー インスタンスを作成する Azure リージョン内で一意である必要があります。 必要に応じて、テンプレート内の値を更新します。

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "variables": {
    "container1name": "hellofiles",
    "container1image": "mcr.microsoft.com/azuredocs/aci-hellofiles"
  },
  "resources": [
    {
      "name": "file-share-demo",
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2019-12-01",
      "location": "[resourceGroup().location]",
      "properties": {
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "filesharevolume",
                  "mountPath": "/aci/logs"
                }
              ]
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            }
          ],
          "dnsNameLabel": "aci-demo"
        },
        "volumes": [
          {
            "name": "filesharevolume",
            "azureFile": {
                "shareName": "acishare",
                "storageAccountName": "<Storage account name>",
                "storageAccountKey": "<Storage account key>"
            }
          }
        ]
      }
    }
  ]
}

この Resource Manager テンプレートを使ってデプロイするには、上記の JSON を deploy-aci.json という名前のファイルに保存し、--template-file パラメーターを指定して az deployment group create コマンドを実行します。

# Deploy with Resource Manager template
az deployment group create --resource-group myResourceGroup --template-file deploy-aci.json

複数ボリュームのマウント

コンテナー インスタンスに複数のボリュームをマウントするには、Azure Resource Manager テンプレート、YAML ファイル、またはその他のプログラムによる方法を使用してデプロイを行う必要があります。 テンプレートまたは YAML ファイルを使用するには、ファイルの properties セクションで volumes 配列を設定することにより、共有の詳細を指定し、ボリュームを定義します。

たとえば、share1 および share2 という 2 つの Azure Files 共有をストレージ アカウント myStorageAccount に作成した場合、Resource Manager テンプレート内の volumes 配列は次のようになります。

"volumes": [{
  "name": "myvolume1",
  "azureFile": {
    "shareName": "share1",
    "storageAccountName": "myStorageAccount",
    "storageAccountKey": "<storage-account-key>"
  }
},
{
  "name": "myvolume2",
  "azureFile": {
    "shareName": "share2",
    "storageAccountName": "myStorageAccount",
    "storageAccountKey": "<storage-account-key>"
  }
}]

次に、ボリュームをマウントするコンテナー グループ内の各コンテナーに対して、コンテナー定義の properties セクションで volumeMounts 配列を設定します。 たとえば、以下は、前に定義した 2 つのボリューム myvolume1myvolume2 をマウントします。

"volumeMounts": [{
  "name": "myvolume1",
  "mountPath": "/mnt/share1/"
},
{
  "name": "myvolume2",
  "mountPath": "/mnt/share2/"
}]

次のステップ

Azure Container Instances にその他の種類のボリュームをマウントする方法について学習してください。