Azure Container Apps でストレージ マウントを使用する

コンテナー アプリは、さまざまな種類のストレージにアクセスできます。 必要に応じて、1 つのアプリで複数の種類のストレージを利用できます。

ストレージの種類 説明 使用例
コンテナー ファイル システム ローカル コンテナーにスコープ設定された一時ストレージ ローカル アプリ キャッシュを作成する。
一時ストレージ 個々のレプリカにスコープ設定された一時ストレージ レプリカ内のコンテナー間でファイルを共有する。 たとえば、メインのアプリ コンテナーは、サイドカー コンテナーによって処理されるログ ファイルを作成できます。
Azure Files 永続的なストレージ ファイル共有にファイルを書き込んで、他のシステムからデータにアクセスできるようにする。

注意

Azure Container Apps のボリューム マウント機能はプレビュー段階です。

コンテナー ファイル システム

コンテナーは、独自のファイル システムに書き込むことができます。

コンテナー ファイル システムのストレージには、次の特性があります。

  • ストレージは一時的であり、コンテナーがシャットダウンまたは再起動されると消失します。
  • このストレージに書き込まれるファイルは、現在のコンテナーで実行されているプロセスにのみ表示されます。
  • 容量の保証はありません。 使用可能なストレージは、コンテナーで使用可能なディスク領域の量によって異なります。

一時ストレージ

Kubernetes で emptyDir と同等のエフェメラル ボリュームをマウントできます。 一時ストレージは、単一のレプリカにスコープ設定されています。

一時ストレージには、次の特性があります。

  • ファイルはレプリカの有効期間中保持されます。
    • レプリカ内のコンテナーが再起動された場合、ボリューム内のファイルはそのまま残されます。
  • レプリカ内のすべてのコンテナーは、同じボリュームをマウントできます。
  • コンテナーは、複数の一時ボリュームをマウントできます。
  • 容量の保証はありません。 使用可能なストレージは、レプリカで使用可能なディスク領域の量によって異なります。

一時ストレージを構成するには、まずリビジョンで EmptyDir ボリュームを定義します。 次に、リビジョン内の 1 つ以上のコンテナーでボリューム マウントを定義します。

前提条件

要件 手順
Azure アカウント お持ちでない場合は、無料のアカウントを作成してください
Azure Container Apps 環境 コンテナー アプリ環境を作成します

構成

一時ストレージを使用する場合は、Azure CLI を YAML 定義とともに使用して、コンテナー アプリを作成または更新する必要があります。

  1. 一時ストレージを使用するように既存のコンテナー アプリを更新するには、app.yaml という名前の YAML ファイルにアプリの仕様をエクスポートします。

    az containerapp show -n <APP_NAME> -g <RESOURCE_GROUP_NAME> -o yaml > app.yaml
    
  2. コンテナー アプリの仕様に次の変更を加えます。

    • コンテナー アプリ定義の template セクションに volumes 配列を追加して、ボリュームを定義します。
      • name はボリュームの識別子です。
      • EmptyDirstorageType として使用します。
    • 一時ストレージをマウントするテンプレート内のコンテナーごとに、volumeMounts 配列をコンテナー定義に追加し、ボリューム マウントを定義します。
      • volumeName は、volumes 配列で定義されている名前です。
      • mountPath は、ボリュームをマウントするコンテナー内のパスです。
    properties:
      managedEnvironmentId: /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.App/managedEnvironments/<ENVIRONMENT_NAME>
      configuration:
        activeRevisionsMode: Single
      template:
        containers:
        - image: <IMAGE_NAME>
          name: my-container
          volumeMounts:
          - mountPath: /myempty
            volumeName: myempty
        volumes:
        - name: myempty
          storageType: EmptyDir
    
  3. YAML ファイルを使用して、コンテナー アプリを更新します。

    az containerapp update --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> \
        --yaml app.yaml
    

一時ボリュームを作成してコンテナーにマウントするには、ARM テンプレートのコンテナー アプリ リソースに次の変更を加えます。

  • コンテナー アプリ定義の template セクションに volumes 配列を追加して、ボリュームを定義します。
    • name はボリュームの識別子です。
    • EmptyDirstorageType として使用します。
  • 一時ストレージをマウントするテンプレート内のコンテナーごとに、volumeMounts 配列をコンテナー定義に追加し、ボリューム マウントを定義します。
    • volumeName は、volumes 配列で定義されている名前です。
    • mountPath は、ボリュームをマウントするコンテナー内のパスです。

ARM テンプレート スニペットの例:

{
  "apiVersion": "2022-03-01",
  "type": "Microsoft.App/containerApps",
  "name": "[parameters('containerappName')]",
  "location": "[parameters('location')]",
  "properties": {

    ...

    "template": {
      "revisionSuffix": "myrevision",
      "containers": [
        {
          "name": "main",
          "image": "[parameters('container_image')]",
          "resources": {
            "cpu": 0.5,
            "memory": "1Gi"
          },
          "volumeMounts": [
            {
              "mountPath": "/myempty",
              "volumeName": "myempty"
            }
          ]
        }
      ],
      "scale": {
        "minReplicas": 1,
        "maxReplicas": 3
      },
      "volumes": [
        {
          "name": "myempty",
          "storageType": "EmptyDir"
        }
      ]
    }
  }
}

完全な例については、ARM テンプレートの API 仕様に関する記事を参照してください。

Azure Files

コンテナー内のボリュームとして Azure Files から共有ファイルをマウントできます。

詳細なチュートリアルについては、「Azure Container Apps で Azure Files ストレージ マウントを作成する」をご覧ください。

Azure Files ストレージには、次の特性があります。

  • マウント場所の下に書き込まれたファイルは、ファイル共有に永続化されます。
  • 共有内のファイルは、マウントの場所から使用できます。
  • 複数のコンテナーで同じファイル共有をマウントできます。これには、別のレプリカ、リビジョン、またはコンテナー アプリにあるものも含まれます。
  • 共有をマウントするすべてのコンテナーは、他のコンテナーまたはメソッドによって書き込まれたファイルにアクセスできます。
  • 1 つのコンテナーに複数のAzure Files ボリュームをマウントできます。

コンテナー内で Azure Filesストレージを有効にするには、次の方法でコンテナーを設定する必要があります。

  • Container Apps 環境で種類 AzureFile のストレージ定義を作成します。
  • リビジョン内のストレージ ボリュームを定義します。
  • リビジョン内の 1 つ以上のコンテナーでボリューム マウントを定義します。

前提条件

要件 手順
Azure アカウント お持ちでない場合は、無料のアカウントを作成してください
Azure ストレージ アカウント ストレージ アカウントの作成
Azure Container Apps 環境 コンテナー アプリ環境を作成します

構成

Azure Files を使用する場合は、Azure CLI を YAML 定義とともに使用して、コンテナー アプリを作成または更新する必要があります。

  1. Container Apps 環境に種類 AzureFile のストレージ定義を追加します。

    az containerapp env storage set --name my-env --resource-group my-group \
        --storage-name mystorage \
        --azure-file-account-name <STORAGE_ACCOUNT_NAME> \
        --azure-file-account-key <STORAGE_ACCOUNT_KEY> \
        --azure-file-share-name <STORAGE_SHARE_NAME> \
        --access-mode ReadWrite
    

    <STORAGE_ACCOUNT_NAME><STORAGE_ACCOUNT_KEY> を、ストレージ アカウントの名前とキーに置き換えます。 <STORAGE_SHARE_NAME> を、ストレージ アカウント内のファイル共有の名前に置き換えます。

    --access-mode の有効な値は、ReadWriteReadOnly です。

  2. ファイル共有をマウントするように既存のコンテナー アプリを更新するには、app.yaml という名前の YAML ファイルにアプリの仕様をエクスポートします。

    az containerapp show -n <APP_NAME> -g <RESOURCE_GROUP_NAME> -o yaml > app.yaml
    
  3. コンテナー アプリの仕様に次の変更を加えます。

    • コンテナー アプリ定義の template セクションに volumes 配列を追加して、ボリュームを定義します。
      • name はボリュームの識別子です。
      • storageType では AzureFile を使用します。
      • storageName では、環境内で定義したストレージの名前を使用します。
    • Azure Files ストレージをマウントするテンプレート内のコンテナーごとに、volumeMounts 配列をコンテナー定義に追加し、ボリューム マウントを定義します。
      • volumeName は、volumes 配列で定義されている名前です。
      • mountPath は、ボリュームをマウントするコンテナー内のパスです。
    properties:
      managedEnvironmentId: /subscriptions/<SUBSCRIPTION_ID>/resourceGroups/<RESOURCE_GROUP_NAME>/providers/Microsoft.App/managedEnvironments/<ENVIRONMENT_NAME>
      configuration:
      template:
        containers:
        - image: <IMAGE_NAME>
          name: my-container
          volumeMounts:
          - volumeName: azure-files-volume
            mountPath: /my-files
        volumes:
        - name: azure-files-volume
          storageType: AzureFile
          storageName: mystorage
    
  4. YAML ファイルを使用して、コンテナー アプリを更新します。

    az containerapp update --name <APP_NAME> --resource-group <RESOURCE_GROUP_NAME> \
        --yaml my-app.yaml
    

次の ARM テンプレート スニペットは、Container Apps 環境に Azure Files 共有を追加して、コンテナー アプリで使用する方法を示しています。

  1. storages 子リソースを Container Apps 環境に追加します。

    {
      "type": "Microsoft.App/managedEnvironments",
      "apiVersion": "2022-03-01",
      "name": "[parameters('environment_name')]",
      "location": "[parameters('location')]",
      "properties": {
        "daprAIInstrumentationKey": "[parameters('dapr_ai_instrumentation_key')]",
        "appLogsConfiguration": {
          "destination": "log-analytics",
          "logAnalyticsConfiguration": {
            "customerId": "[parameters('log_analytics_customer_id')]",
            "sharedKey": "[parameters('log_analytics_shared_key')]"
          }
        }
      },
      "resources": [
        {
          "type": "storages",
          "name": "myazurefiles",
          "apiVersion": "2022-03-01",
          "dependsOn": [
            "[resourceId('Microsoft.App/managedEnvironments', parameters('environment_name'))]"
          ],
          "properties": {
            "azureFile": {
              "accountName": "[parameters('storage_account_name')]",
              "accountKey": "[parameters('storage_account_key')]",
              "shareName": "[parameters('storage_share_name')]",
              "accessMode": "ReadWrite"
            }
          }
        }
      ]
    }
    
  2. コンテナー アプリ リソースを更新して、ボリュームとボリューム マウントを追加します。

    {
      "apiVersion": "2022-03-01",
      "type": "Microsoft.App/containerApps",
      "name": "[parameters('containerappName')]",
      "location": "[parameters('location')]",
      "properties": {
    
        ...
    
        "template": {
          "revisionSuffix": "myrevision",
          "containers": [
            {
              "name": "main",
              "image": "[parameters('container_image')]",
              "resources": {
                "cpu": 0.5,
                "memory": "1Gi"
              },
              "volumeMounts": [
                {
                  "mountPath": "/myfiles",
                  "volumeName": "azure-files-volume"
                }
              ]
            }
          ],
          "scale": {
            "minReplicas": 1,
            "maxReplicas": 3
          },
          "volumes": [
            {
              "name": "azure-files-volume",
              "storageType": "AzureFile",
              "storageName": "myazurefiles"
            }
          ]
        }
      }
    }
    
    • コンテナー アプリ定義の template セクションに volumes 配列を追加して、ボリュームを定義します。
      • name はボリュームの識別子です。
      • storageType では AzureFile を使用します。
      • storageName では、環境内で定義したストレージの名前を使用します。
    • Azure Files ストレージをマウントするテンプレート内のコンテナーごとに、volumeMounts 配列をコンテナー定義に追加し、ボリューム マウントを定義します。
      • volumeName は、volumes 配列で定義されている名前です。
      • mountPath は、ボリュームをマウントするコンテナー内のパスです。

完全な例については、ARM テンプレートの API 仕様に関する記事を参照してください。