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

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

ストレージの種類 説明 永続化 使用例
コンテナー スコープのストレージ 実行中のコンテナーで使用できるエフェメラル ストレージ データはコンテナーがシャットダウンするまで使用できます ローカル アプリ キャッシュを作成する。
レプリカ スコープのストレージ 同じレプリカ内のコンテナー間でファイルを共有するためのエフェメラル ストレージ データはレプリカがシャットダウンするまで使用できます サイドカー コンテナーで処理されるログ ファイルを書き込むメイン アプリ コンテナー。
Azure Files 永続的なストレージ データは Azure Files に保存されます ファイル共有にファイルを書き込んで、他のシステムからデータにアクセスできるようにする。

エフェメラル ストレージ

コンテナー アプリは、エフェメラル ストレージとの間で一時データを読み書きできます。 エフェメラル ストレージのスコープは、コンテナーまたはレプリカに設定できます。 各レプリカで使用できるコンテナー スコープおよびレプリカ スコープのストレージの合計量は、レプリカに割り当てられた vCPU の合計数によって異なります。

vCPU 数 エフェメラル ストレージの合計
0.25 以下 1 GiB
0.5 以下 2 GiB
1 以下 4 GiB
1 より大 8 GiB

コンテナー スコープのストレージ

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

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

  • ストレージは一時的であり、コンテナーがシャットダウンまたは再起動されると消失します。
  • このストレージに書き込まれるファイルは、現在のコンテナーで実行されているプロセスにのみ表示されます。

レプリカ スコープのストレージ

Kubernetes の EmptyDir (空のディレクトリ) と同等の一時的なエフェメラル ボリュームをマウントできます。 このストレージは単一のレプリカにスコープされます。 EmptyDir ボリュームを使って、同じレプリカ内のコンテナー間でデータを共有します。

レプリカ スコープのストレージには、次の特性があります。

  • ファイルはレプリカの有効期間中保持されます。
    • レプリカ内のコンテナーが再起動された場合、ボリューム内のファイルはそのまま残されます。
  • レプリカ内のすべての init コンテナーまたはアプリ コンテナーが、同じボリュームをマウントできます。
  • 1 つのコンテナーで、複数の 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 配列を追加して、ボリュームを定義します。 既に 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_NAME1>
          name: my-container-1
          volumeMounts:
          - mountPath: /myempty
            volumeName: myempty
        - image: <IMAGE_NAME_2>
          name: my-container-2
          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
    

完全な例については、YAML の仕様に関する記事をご覧ください。

レプリカ スコープのボリュームを作成し、コンテナーでそれをマウントするには、ARM テンプレートでコンテナー アプリ リソースを次のように変更します。

  • コンテナー アプリ定義の template セクションに volumes 配列を追加して、ボリュームを定義します。 既に 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"
            }
          ]
        },
        {
          "name": "sidecar",
          "image": "[parameters('sidecar_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 portal を使ってコンテナー アプリの新しいリビジョンをデプロイします。

  1. Azure portal で、コンテナー アプリに移動します。

  2. 左側のメニューで [Revision management] (リビジョン管理) を選びます。

  3. [新しいリビジョンの作成] を選択します。

  4. ボリュームをマウントするコンテナーを選びます。

  5. [コンテナーの編集] コンテキスト ペインで、[ボリューム マウント] タブを選びます。

  6. [エフェメラル ストレージ] セクションで、次の情報を使って新しいボリュームを作成します。

    • [ボリューム名]: エフェメラル ボリュームの名前。
    • [マウント パス]: ボリュームをマウントするコンテナー内の絶対パス。
  7. [保存] を選んで変更を保存し、コンテキスト ウィンドウを終了します。

  8. [作成] を選んで新しいリビジョンを作成します。

Azure Files ボリューム

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

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

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

Azure Files では、SMB (サーバー メッセージ ブロック) と NFS (ネットワーク ファイル システム) の両方のプロトコルがサポートされています。 どちらのプロトコルを使っても Azure Files 共有をマウントできます。 環境で定義するファイル共有は、ストレージ アカウントのファイル共有に使うものと同じプロトコルで構成する必要があります。

Note

Azure Container Apps で NFS 共有をマウントすることのサポートはプレビュー段階です。

コンテナーで Azure Files ストレージを有効にするには、環境とコンテナー アプリを次のように設定する必要があります。

  • Container Apps 環境でストレージの定義を作成します。
  • NFS を使っている場合は、環境をカスタム VNet で構成し、VNet からのアクセスを許可するようにストレージ アカウントを構成する必要があります。 詳細については、「Azure Files での NFS ファイル共有」を参照してください。
  • カスタム VNet を使って環境が構成されている場合は、サブネットに関連付けられたネットワーク セキュリティ グループ (NSG) でポート 445 と 2049 を許可する必要があります。
  • リビジョンで種類 AzureFile (SMB) または NfsAzureFile (NFS) のボリュームを定義します。
  • リビジョン内の 1 つ以上のコンテナーでボリューム マウントを定義します。
  • 使う Azure Files ストレージ アカウントは、コンテナー アプリの仮想ネットワークからアクセスできる必要があります。 詳細については、仮想ネットワークからのアクセスの許可に関するページを参照してください。

前提条件

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

構成

Azure CLI を使って Azure Files ボリュームをマウントするようにコンテナー アプリを構成するときは、YAML 定義を使ってコンテナー アプリを作成または更新する必要があります。

SMB ファイル共有をマウントする方法の詳細なチュートリアルについては、「Azure Container Apps で Azure Files ストレージ マウントを作成する」を参照してください。

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

    az containerapp env storage set --name my-env --resource-group my-group \
        --storage-name mystorage \
        --storage-type AzureFile \
        --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 配列を追加して、ボリュームを定義します。 既に volumes 配列がある場合は、新しいボリュームを配列に追加します。
      • name はボリュームの識別子です。
      • storageType の場合、SMB には AzureFile、NFS には NfsAzureFile を使います。 この値は、環境で定義したストレージの種類と一致する必要があります。
      • 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 app.yaml
    

完全な例については、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": "2023-05-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 配列を追加して、ボリュームを定義します。 既に volumes 配列がある場合は、新しいボリュームを配列に追加します。
      • name はボリュームの識別子です。
      • storageType の場合、SMB には AzureFile、NFS には NfsAzureFile を使います。 この値は、環境で定義したストレージの種類と一致する必要があります。
      • storageName では、環境内で定義したストレージの名前を使用します。
    • Azure Files ストレージをマウントするテンプレート内のコンテナーごとに、コンテナー定義の volumeMounts 配列でボリューム マウントを定義します。
      • volumeName は、volumes 配列で定義されている名前です。
      • mountPath は、ボリュームをマウントするコンテナー内のパスです。

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

Azure portal で Azure Files ストレージ用のボリューム マウントを構成するには、Container Apps 環境にファイル共有を追加してから、新しいリビジョンを作成してコンテナー アプリにボリューム マウントを追加します。

  1. Azure portal で、Container Apps インスタンスに移動します。

  2. 左側メニューから [Azure Files] を選びます。

  3. [追加] を選択します。

  4. [ファイル共有の追加] コンテキスト メニューで、次の情報を入力します。

    • [名前]: ファイル共有の名前。
    • [ストレージ アカウント名]: ファイル共有を含むストレージ アカウントの名前。
    • [ストレージ アカウント キー]: ストレージ アカウントのアクセス キー。
    • [ファイル共有]: ファイル共有の名前。
    • [アクセス モード]: ファイル共有のアクセス モード。 有効な値は、[読み書き可能] と [読み取り専用] です。
  5. [追加] を選んでコンテキスト ペインを終了します。

  6. [保存] を選んで変更をコミットします。

  7. コンテナー アプリに移動します。

  8. 左側のメニューで [Revision management] (リビジョン管理) を選びます。

  9. [新しいリビジョンの作成] を選択します。

  10. ボリュームをマウントするコンテナーを選びます。

  11. [コンテナーの編集] コンテキスト ペインで、[ボリューム マウント] タブを選びます。

  12. [ファイル共有] セクションで、次の情報を使って新しいボリュームを作成します。

    • [ファイル共有名]: 追加したファイル共有。
    • [マウント パス]: ボリュームをマウントするコンテナー内の絶対パス。
  13. [保存] を選んで変更を保存し、コンテキスト ウィンドウを終了します。

  14. [作成] を選んで新しいリビジョンを作成します。