Azure Container Instances にシークレット ボリュームをマウントする

"シークレット" ボリュームは、コンテナー グループ内のコンテナーに機微な情報を提供する目的で使います。 秘密情報は、"シークレット" ボリューム内のファイルに格納され、コンテナー グループ内のコンテナーからアクセスすることができます。 "シークレット" ボリュームに秘密情報を格納すれば、SSH キーやデータベースの資格情報など、機微なデータをアプリケーション コードに追加せずに済みます。

  • コンテナー グループにシークレットと共にデプロイされたシークレット ボリュームは、"読み取り専用" になります。
  • すべてのシークレット ボリュームは、RAM でバックアップされるファイル システムである tmpfs でバックアップされます。そのコンテンツは不揮発性の記憶域には書き込まれません。

Note

"シークレット" ボリュームは、現在のところ Linux コンテナーに限定されています。 Windows と Linux の両方のコンテナーのセキュリティで保護された環境変数を渡す方法の詳細については、「環境変数の設定」を参照してください。 Microsoft ではすべての機能を Windows コンテナーに取り入れるように取り組んでいますが、現在のプラットフォームの違いは、概要に関するページで確認できます。

シークレット ボリュームのマウント - Azure CLI

Azure CLI を使って、少なくとも 1 つのシークレットを含んだコンテナーをデプロイするには、az container create コマンドに --secrets パラメーターと --secrets-mount-path パラメーターを指定します。 この例では、シークレットを含む "mysecret1" と "mysecret2" の 2 つのファイルで構成される "シークレット" ボリュームを /mnt/secrets にマウントします。

az container create \
    --resource-group myResourceGroup \
    --name secret-volume-demo \
    --image mcr.microsoft.com/azuredocs/aci-helloworld \
    --secrets mysecret1="My first secret FOO" mysecret2="My second secret BAR" \
    --secrets-mount-path /mnt/secrets

次の az container exec の出力は、実行中のコンテナーのシェルを開いて、シークレット ボリューム内のファイルをリストした後、その内容を表示しています。

az container exec \
  --resource-group myResourceGroup \
  --name secret-volume-demo --exec-command "/bin/sh"
/usr/src/app # ls /mnt/secrets
mysecret1
mysecret2
/usr/src/app # cat /mnt/secrets/mysecret1
My first secret FOO
/usr/src/app # cat /mnt/secrets/mysecret2
My second secret BAR
/usr/src/app # exit
Bye.

シークレット ボリュームのマウント - YAML

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

YAML テンプレートを使ってデプロイするときは、テンプレート内のシークレット値が Base64 でエンコードされている必要があります。 ただしコンテナーのファイル内では、シークレット値がプレーンテキストで表示されます。

以下の YAML テンプレートは、"シークレット" ボリュームを /mnt/secrets でマウントするコンテナーを 1 つ含んだコンテナー グループを定義しています。 このシークレット ボリュームには、シークレットを含む "mysecret1" と "mysecret2" の 2 つのファイルがあります。

apiVersion: '2019-12-01'
location: eastus
name: secret-volume-demo
properties:
  containers:
  - name: aci-tutorial-app
    properties:
      environmentVariables: []
      image: mcr.microsoft.com/azuredocs/aci-helloworld:latest
      ports: []
      resources:
        requests:
          cpu: 1.0
          memoryInGB: 1.5
      volumeMounts:
      - mountPath: /mnt/secrets
        name: secretvolume1
  osType: Linux
  restartPolicy: Always
  volumes:
  - name: secretvolume1
    secret:
      mysecret1: TXkgZmlyc3Qgc2VjcmV0IEZPTwo=
      mysecret2: TXkgc2Vjb25kIHNlY3JldCBCQVIK
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 配列を入力します。 Resource Manager テンプレートを使ってデプロイするときは、テンプレート内のシークレット値が Base64 でエンコードされている必要があります。 ただしコンテナーのファイル内では、シークレット値がプレーンテキストで表示されます。

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

以下の Resource Manager テンプレートは、"シークレット" ボリュームを /mnt/secrets でマウントするコンテナーを 1 つ含んだコンテナー グループを定義しています。 このシークレット ボリュームには、"mysecret1" と "mysecret2" の 2 つのシークレットがあります。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "variables": {
    "container1name": "aci-tutorial-app",
    "container1image": "microsoft/aci-helloworld:latest"
  },
  "resources": [
    {
      "type": "Microsoft.ContainerInstance/containerGroups",
      "apiVersion": "2021-03-01",
      "name": "secret-volume-demo",
      "location": "[resourceGroup().location]",
      "properties": {
        "containers": [
          {
            "name": "[variables('container1name')]",
            "properties": {
              "image": "[variables('container1image')]",
              "resources": {
                "requests": {
                  "cpu": 1,
                  "memoryInGb": 1.5
                }
              },
              "ports": [
                {
                  "port": 80
                }
              ],
              "volumeMounts": [
                {
                  "name": "secretvolume1",
                  "mountPath": "/mnt/secrets"
                }
              ]
            }
          }
        ],
        "osType": "Linux",
        "ipAddress": {
          "type": "Public",
          "ports": [
            {
              "protocol": "tcp",
              "port": "80"
            }
          ]
        },
        "volumes": [
          {
            "name": "secretvolume1",
            "secret": {
              "mysecret1": "TXkgZmlyc3Qgc2VjcmV0IEZPTwo=",
              "mysecret2": "TXkgc2Vjb25kIHNlY3JldCBCQVIK"
            }
          }
        ]
      }
    }
  ]
}

この 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 Container Instances にその他の種類のボリュームをマウントする方法について学習してください。

セキュリティで保護された環境変数

機微な情報をコンテナー (Windows コンテナーも含む) に提供する方法は他にもあります。セキュリティで保護された環境変数を使う方法です。