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 にその他の種類のボリュームをマウントする方法について学習してください。
- Azure Container Instances に Azure ファイル共有をマウントする
- Azure Container Instances に emptyDir ボリュームをマウントする
- Azure Container Instances に gitRepo ボリュームをマウントする
セキュリティで保護された環境変数
機微な情報をコンテナー (Windows コンテナーも含む) に提供する方法は他にもあります。セキュリティで保護された環境変数を使う方法です。