Azure Container Instances でマネージド ID を使用する方法
Azure リソース用のマネージド ID を使用して、他の Azure サービスと対話する Azure Container Instances 内のコードを実行します。こうするとシークレットや資格情報をコード内に保持する必要がありません。 この機能により、Microsoft Entra ID で自動管理される ID が Azure Container Instances のデプロイに提供されます。
この記事では、Azure Container Instances でのマネージド ID の詳細について、および次の点について説明します。
- コンテナー グループでユーザー割り当て ID またはシステム割り当て ID を有効にする
- ID に Azure Key Vault へのアクセス権を付与する
- マネージド ID を使用して、実行中のコンテナーから Key Vault にアクセスする
サンプルを調整することにより、Azure Container Instances 内の ID を有効にし、それを使って他の Azure サービスにアクセスします。 これらのサンプルは対話型です。 ただし実際には、コンテナー イメージがコードを実行して Azure サービスにアクセスします。
マネージド ID を使用する理由
実行中のコンテナーでマネージド ID を使用すると、資格情報をコンテナー コード内で管理しなくても、Microsoft Entra 認証をサポートするサービスに対して認証することができます。 AD 認証をサポートしないサービスについては、Azure Key Vault の中にシークレットを格納し、マネージド ID を使って Key Vault にアクセスして資格情報を取得できます。 マネージド ID の使用法の詳細については、「Azure リソースのマネージド ID とは」を参照してください。
マネージド ID の有効化
コンテナー グループを作成するときに、ContainerGroupIdentity プロパティを設定することで 1 つまたは複数のマネージド ID を有効にできます。 また、コンテナー グループが実行状態になった後でマネージド ID を有効化または更新できます。どちらの場合も、それによりコンテナー グループが再起動します。 新規または既存のコンテナー グループで ID を設定するには、Azure CLI、Resource Manager テンプレート、YAML ファイル、または別の Azure ツールを使用します。
Azure Container Instances は、ユーザー割り当て、システム割り当ての両方の種類の Azure マネージド ID をサポートしています。 各コンテナー グループで、1 つのシステム割り当て ID、1 つまたは複数のユーザー割り当て ID、または両方の種類の ID を有効化できます。 Azure リソースのマネージド ID の基本点な事柄については、概要を参照してください。
マネージド ID の使用
マネージド ID を使用するには、サブスクリプション内の 1 つ以上の Azure サービス リソース (Web アプリ、キー コンテナー、ストレージ アカウントなど) へのアクセス権を ID に付与する必要があります。 実行中のコンテナーでマネージド ID を使用することは、Azure 仮想マシン (VM) で ID を使用することと似ています。 トークン、Azure PowerShell または Azure CLI、または Azure SDK の使用に関する VM ガイダンス資料を参照してください。
前提条件
Azure Cloud Shell で Bash 環境を使用します。 詳細については、「Azure Cloud Shell の Bash のクイックスタート」を参照してください。
CLI リファレンス コマンドをローカルで実行する場合、Azure CLI をインストールします。 Windows または macOS で実行している場合は、Docker コンテナーで Azure CLI を実行することを検討してください。 詳細については、「Docker コンテナーで Azure CLI を実行する方法」を参照してください。
ローカル インストールを使用する場合は、az login コマンドを使用して Azure CLI にサインインします。 認証プロセスを完了するには、ターミナルに表示される手順に従います。 その他のサインイン オプションについては、Azure CLI でのサインインに関するページを参照してください。
初回使用時にインストールを求められたら、Azure CLI 拡張機能をインストールします。 拡張機能の詳細については、Azure CLI で拡張機能を使用する方法に関するページを参照してください。
az version を実行し、インストールされているバージョンおよび依存ライブラリを検索します。 最新バージョンにアップグレードするには、az upgrade を実行します。
- この記事では、Azure CLI のバージョン 2.0.49 以降が必要です。 Azure Cloud Shell を使用している場合は、最新バージョンが既にインストールされています。
Azure Key Vault を作成する
この記事の例では、Azure Container Instances でマネージド ID を使用して Azure Key Vault シークレットにアクセスします。
まず、次の az group create コマンドを使用して、myResourceGroup という名前のリソース グループを eastus の場所に作成します。
az group create --name myResourceGroup --location eastus
キー コンテナーを作成するには、az keyvault create コマンドを使います。 必ず一意のキー コンテナー名を指定してください。
az keyvault create \
--name mykeyvault \
--resource-group myResourceGroup \
--location eastus
az keyvault secret set コマンドを使って、サンプルのシークレット例をキー コンテナーに格納します。
az keyvault secret set \
--name SampleSecret \
--value "Hello Container Instances" \
--description ACIsecret --vault-name mykeyvault
次に示す例に従い、Azure Container Instances のユーザー定義/システム定義のいずれかのマネージド ID を使って Key Vault にアクセスします。
例 1:ユーザー割り当ての ID を使用して Azure Key Vault にアクセスする
ID の作成
まず az identity create コマンドを使用して、サブスクリプション内で ID を作成します。 Key Vault の作成に使ったのと同じリソース グループを使用することも、別のものを使用することもできます。
az identity create \
--resource-group myResourceGroup \
--name myACIId
後続のステップで ID を使用するために、az identity show コマンドを使って ID のサービス プリンシパル ID とリソース ID を変数に格納します。
# Get service principal ID of the user-assigned identity
SP_ID=$(az identity show \
--resource-group myResourceGroup \
--name myACIId \
--query principalId --output tsv)
# Get resource ID of the user-assigned identity
RESOURCE_ID=$(az identity show \
--resource-group myResourceGroup \
--name myACIId \
--query id --output tsv)
Key Vault へのアクセス権をユーザー割り当て ID に付与する
次の az keyvault set-policy コマンドを実行して、キー コンテナーに対するアクセス ポリシーを設定します。 次の例では、ユーザー割り当て ID にキー コンテナーからのシークレットの取得を許可します。
az keyvault set-policy \
--name mykeyvault \
--resource-group myResourceGroup \
--object-id $SP_ID \
--secret-permissions get
コンテナー グループでユーザー割り当て ID を有効にする
次の az container create コマンドを実行して、Microsoft の azure-cli
イメージに基づくコンテナー インスタンスを作成します。 この例で作成される単一コンテナーのグループを使用すると、Azure CLI を実行して他の Azure サービスに対話的にアクセスできます。 このセクションでは、基本のオペレーティング システムのみが使用されます。 コンテナーで Azure CLI を使用する例については、「コンテナー グループでシステム割り当て ID を有効にする」を参照してください。
--assign-identity
パラメーターは、ユーザー割り当てのマネージド ID をグループに渡します。 実行時間の長いこのコマンドにより、コンテナーの実行状態が続きます。 この例では、Key Vault の作成に使ったのと同じリソース グループを使用していますが、別のものを指定することもできます。
az container create \
--resource-group myResourceGroup \
--name mycontainer \
--image mcr.microsoft.com/azure-cli \
--assign-identity $RESOURCE_ID \
--command-line "tail -f /dev/null"
数秒以内に、デプロイが完了したことを示す応答が Azure CLI から得られます。 az container show コマンドを使用して、その状態を確認します。
az container show \
--resource-group myResourceGroup \
--name mycontainer
出力の identity
セクションが次のように表示されたら、コンテナー グループで ID が設定されています。 userAssignedIdentities
の下の principalID
は、Microsoft Entra ID で作成した ID のサービス プリンシパルです。
[...]
"identity": {
"principalId": "null",
"tenantId": "xxxxxxxx-f292-4e60-9122-xxxxxxxxxxxx",
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/xxxxxxxx-0903-4b79-a55a-xxxxxxxxxxxx/resourcegroups/danlep1018/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myACIId": {
"clientId": "xxxxxxxx-5523-45fc-9f49-xxxxxxxxxxxx",
"principalId": "xxxxxxxx-f25b-4895-b828-xxxxxxxxxxxx"
}
}
},
[...]
ユーザー定義 ID を使用して Key Vault からシークレットを取得する
これで、実行中のコンテナー インスタンス内でマネージド ID を使って Key Vault にアクセスすることができます。 まずコンテナーで bash シェルを次のように起動します。
az container exec \
--resource-group myResourceGroup \
--name mycontainer \
--exec-command "/bin/bash"
コンテナーの bash シェルで、次のコマンドを実行します。 Microsoft Entra ID を使用して Key Vault に認証するためのアクセス トークンを取得するには、次のコマンドを実行します。
client_id="xxxxxxxx-5523-45fc-9f49-xxxxxxxxxxxx"
curl "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net&client_id=$client_id" -H Metadata:true -s
出力:
{"access_token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSIsImtpZCI6Imk2bEdrM0ZaenhSY1ViMkMzbkVRN3N5SEpsWSJ9......xxxxxxxxxxxxxxxxx","refresh_token":"","expires_in":"28799","expires_on":"1539927532","not_before":"1539898432","resource":"https://vault.azure.net/","token_type":"Bearer"}
後続のコマンドで認証に使うためにアクセス トークンを変数に格納するには、次のコマンドを実行します。
TOKEN=$(curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fvault.azure.net' -H Metadata:true | jq -r '.access_token')
次に、アクセス トークンを使って Key Vault に対して認証し、シークレットを読み取ります。 URL 内のキー コンテナー名を必ず置き換えてください (https://mykeyvault.vault.azure.net/...)。
curl https://mykeyvault.vault.azure.net/secrets/SampleSecret/?api-version=7.4 -H "Authorization: Bearer $TOKEN"
応答では次のようにシークレットが表示されます。 コードの中でこの出力を解析して、シークレットを取得できます。 その後、後続の操作でシークレットを使用して、別の Azure リソースにアクセスします。
{"value":"Hello Container Instances","contentType":"ACIsecret","id":"https://mykeyvault.vault.azure.net/secrets/SampleSecret/xxxxxxxxxxxxxxxxxxxx","attributes":{"enabled":true,"created":1539965967,"updated":1539965967,"recoveryLevel":"Purgeable"},"tags":{"file-encoding":"utf-8"}}
例 2:システム割り当ての ID を使用して Azure Key Vault にアクセスする
コンテナー グループでシステム割り当て ID を有効にする
次の az container create コマンドを実行して、Microsoft の azure-cli
イメージに基づくコンテナー インスタンスを作成します。 この例で作成される単一コンテナーのグループを使用すると、Azure CLI を実行して他の Azure サービスに対話的にアクセスできます。
--assign-identity
パラメーター (他の値なし) を指定すると、システム割り当てのマネージド ID がグループで有効になります。 この ID は、コンテナーグループのリソースグループにスコープが設定されています。 実行時間の長いこのコマンドにより、コンテナーの実行状態が続きます。 この例では、ID のスコープ内にある、キー コンテナーの作成に使用したものと同じリソース グループを使用します。
# Get the resource ID of the resource group
RG_ID=$(az group show --name myResourceGroup --query id --output tsv)
# Create container group with system-managed identity
az container create \
--resource-group myResourceGroup \
--name mycontainer \
--image mcr.microsoft.com/azure-cli \
--assign-identity --scope $RG_ID \
--command-line "tail -f /dev/null"
数秒以内に、デプロイが完了したことを示す応答が Azure CLI から得られます。 az container show コマンドを使用して、その状態を確認します。
az container show \
--resource-group myResourceGroup \
--name mycontainer
出力の identity
セクションが次のように表示され、システム割り当て ID が Microsoft Entra ID で作成されたことを示します。
[...]
"identity": {
"principalId": "xxxxxxxx-528d-7083-b74c-xxxxxxxxxxxx",
"tenantId": "xxxxxxxx-f292-4e60-9122-xxxxxxxxxxxx",
"type": "SystemAssigned",
"userAssignedIdentities": null
},
[...]
後続のステップで使用するために、この ID の変数の値を principalId
(サービス プリンシパル ID) に設定します。
SP_ID=$(az container show \
--resource-group myResourceGroup \
--name mycontainer \
--query identity.principalId --out tsv)
Key Vault へのアクセス権をコンテナー グループに付与する
次の az keyvault set-policy コマンドを実行して、キー コンテナーに対するアクセス ポリシーを設定します。 次の例により、システム定義 ID が Key Vault からシークレットを取得できるようになります。
az keyvault set-policy \
--name mykeyvault \
--resource-group myResourceGroup \
--object-id $SP_ID \
--secret-permissions get
コンテナー グループ ID を使用して Key Vault からシークレットを取得する
これで、実行中のコンテナー インスタンス内でマネージド ID を使って Key Vault にアクセスすることができます。 まずコンテナーで bash シェルを次のように起動します。
az container exec \
--resource-group myResourceGroup \
--name mycontainer \
--exec-command "/bin/bash"
コンテナーの bash シェルで、次のコマンドを実行します。 まず、マネージド ID を使用して Azure CLI にサインインします。
az login --identity
実行中のコンテナーから、キー コンテナーのシークレットを取得します。
az keyvault secret show \
--name SampleSecret \
--vault-name mykeyvault --query value
シークレットの値が取得されます。
"Hello Container Instances"
Resource Manager テンプレートを使用してマネージド ID を有効にする
Resource Manager テンプレートを使用してコンテナー グループのマネージド ID を有効にするには、ContainerGroupIdentity
オブジェクトを使って Microsoft.ContainerInstance/containerGroups
オブジェクトの identity
プロパティを設定します。 次のスニペットは、さまざまなシナリオ別の identity
プロパティの構成を示しています。 Resource Manager テンプレート リファレンスを参照してください。 2018-10-01
を apiVersion
以上指定します。
ユーザー割り当て ID
ユーザー割り当て ID は、次の形式のリソース ID です。
"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}"
1 つまたは複数のユーザー割り当て ID を有効にすることができます。
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"myResourceID1": {
}
}
}
システム割り当て ID
"identity": {
"type": "SystemAssigned"
}
システム割り当て/ユーザー割り当て ID
各コンテナー グループで、1 つのシステム割り当て ID と、1 つまたは複数のユーザー割り当て ID の両方を有効化できます。
"identity": {
"type": "SystemAssigned, UserAssigned",
"userAssignedIdentities": {
"myResourceID1": {
}
}
}
...
マネージド ID を有効にするには YAML ファイルを使用します。
YAML ファイルを使ってデプロイされるコンテナー グループでマネージド ID を有効にするには、次の YAML を含めます。
2018-10-01
を apiVersion
以上指定します。
ユーザー割り当て ID
ユーザー割り当て ID は次の形式のリソース ID です
'/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ManagedIdentity/userAssignedIdentities/{identityName}'
1 つまたは複数のユーザー割り当て ID を有効にすることができます。
identity:
type: UserAssigned
userAssignedIdentities:
{'myResourceID1':{}}
システム割り当て ID
identity:
type: SystemAssigned
システム割り当て/ユーザー割り当て ID
各コンテナー グループで、1 つのシステム割り当て ID と、1 つまたは複数のユーザー割り当て ID の両方を有効化できます。
identity:
type: SystemAssigned, UserAssigned
userAssignedIdentities:
{'myResourceID1':{}}
Windows コンテナー上のマネージド ID
Windows コンテナー グループのマネージド ID は、Linux コンテナー グループとは動作が異なります。 Windows コンテナーの場合、メタデータ サーバー (169.254.169.254) は Microsoft Entra ID トークンを取得できません。 お客様は別のパターンに従って、Windows コンテナーでアクセス トークンを取得できます。 このパターンでは、次に示すように、トークン要求を IDENTITY_ENDPOINT に送信し、プリンシパル ID やシークレットなどの追加情報を送信します。 IDENTITY_ENDPOINT と IDENTITY_HEADER は、コンテナーに環境変数として挿入されます。
curl -G -v %IDENTITY_ENDPOINT% --data-urlencode resource=https://vault.azure.net --data-urlencode principalId=<principal id> -H secret:%IDENTITY_HEADER%
PowerShell スクリプトのサンプル
identityEndpoint = $env:IDENTITY_ENDPOINT
$identityHeader = $env:IDENTITY_HEADER
$resource = "https://vault.azure.net"
$principalId = "b2ee9347-623c-4794-85af-2d5261356f67"
Invoke-RestMethod -Uri "$identityEndpoint" `
-Method Get `
-Headers @{secret = $identityHeader} `
-Body @{resource = $resource; principalId = $principalId} `
-ContentType "application/x-www-form-urlencoded"
Az Login モジュールと、メタデータ サーバー (169.254.169.254) に依存するその他のクライアント ライブラリは、Windows コンテナーでは機能しません。 さらに、vNet 内の Windows コンテナーはエンドポイントに接続できません。そのため、Windows 仮想ネットワーク コンテナーでマネージド ID トークンを生成することはできません。
次のステップ
この記事では、Azure Container Instances でのマネージド ID について、および次の方法について説明しました。
- コンテナー グループでユーザー割り当て ID またはシステム割り当て ID を有効にする
- ID に Azure Key Vault へのアクセス権を付与する
- マネージド ID を使用して、実行中のコンテナーから Key Vault にアクセスする
詳細については、「Azure リソースの管理 ID について」を参照してください。
マネージド ID を使って Azure Container Instances から Key Vault にアクセスする例については、Azure Go SDK サンプルを参照してください。