Azure Container Apps のマネージド ID
[アーティクル] 06/20/2024
8 人の共同作成者
フィードバック
この記事の内容
Microsoft Entra ID のマネージド ID により、コンテナー アプリは、Microsoft Entra で保護された他のリソースにアクセスできます。 Microsoft Entra ID のマネージド ID の詳細については、「Azure リソースのマネージド ID 」を参照してください。
コンテナー アプリには 2 種類の ID を付与できます:
システム割り当て ID はコンテナー アプリに関連付けられているため、コンテナー アプリが削除されると削除されます。 アプリは 1 つのシステム割り当て ID しか持つことはできません。
ユーザー割り当て ID は、コンテナー アプリやその他のリソースに割り当てることができるスタンドアロンの Azure リソースです。 コンテナー アプリは複数のユーザー割り当て ID を持つことができます。 ユーザー割り当て ID は、削除するまで存在します。
マネージド ID を使用する理由
実行中のコンテナー アプリでマネージド ID を使用すると、Microsoft Entra 認証をサポートしているサービス に対して認証できます。
マネージド ID を使用した場合:
一般的なユース ケース
システム割り当て ID は、次のワークロードに最適です:
単一リソース内に格納されます
独立した ID が必要です
ユーザー割り当て ID は、次のワークロードに最適です:
複数のリソースで実行され、1 つの ID を共有できます
セキュアなリソースに対し事前認証が必要です
制限事項
スケール ルールのマネージド ID はサポートされていません。 スケーリング ルールの secretRef
に接続文字列またはキーを含める必要があります。
Init コンテナー はマネージド ID にアクセスできません。
マネージド ID は、次の方法で構成できます:
Azure portal
Azure CLI
自分の Azure Resource Manager (ARM) テンプレート
実行中のコンテナー アプリでマネージド ID が追加、削除、または変更されると、アプリは自動的に再起動せず、新しいリビジョンは作成されません。
Note
2022 年 4 月 11 日より前にデプロイされたコンテナー アプリにマネージド ID を追加する場合は、新しいリビジョンを作成する必要があります。
システム割り当て ID を追加する
Azure portal でコンテナー アプリに移動します。
[設定] グループで、[ID] を選択します。
[システム割り当て済み] タブで、 [状態] を [オン] に切り替えます。
[保存] を選択します。
az containerapp identity assign
コマンドを実行して、システム割り当て ID を作成します。
az containerapp identity assign --name myApp --resource-group myResourceGroup --system-assigned
ARM テンプレートを使用して、コンテナー アプリとリソースのデプロイを自動化できます。 システム割り当て ID を追加するには、ARM テンプレートに identity
セクションを追加します。
"identity": {
"type": "SystemAssigned"
}
システム割り当てタイプを追加すると、Azure に対してアプリケーション用の ID を作成して管理するように指示されます。 ARM テンプレートの完全な例については、 ARM API の仕様 に関するページを参照してください。
az containerapp create
や az containerapp job create
などの一部の Azure CLI コマンドでは、入力用の YAML ファイルがサポートされています。 システム割り当て ID を追加するには、YAML ファイルに identity
セクションを追加します。
identity:
type: SystemAssigned
システム割り当てタイプを追加すると、Azure に対してアプリケーション用の ID を作成して管理するように指示されます。 YAML テンプレートの完全な例については、ARM API の仕様 に関するページを参照してください。
ユーザー割り当て ID を追加する
ユーザー割り当て ID を使用してコンテナー アプリを構成するには、まず ID を作成してから、そのリソース識別子をコンテナー アプリの構成に追加する必要があります。 ユーザー割り当て ID は、Azure portal または Azure CLI を使用して作成できます。 ユーザー割り当て ID の作成と管理の詳細については、「ユーザー割り当てマネージド ID の管理」 を参照してください。
最初に、ユーザー割り当て ID リソースを作成する必要があります。
「ユーザー割り当てマネージド ID の管理」 の手順に従って、ユーザー割り当てマネージド ID リソースを作成します。
Azure portal でコンテナー アプリに移動します。
[設定] グループで、[ID] を選択します。
[ユーザー割り当て済み] タブ内で、[追加] を選択します。
先ほど作成した ID を検索して選択します。
[追加] を選択します。
ユーザー割り当て ID を作成します。
az identity create --resource-group <GROUP_NAME> --name <IDENTITY_NAME> --output json
新しい ID の id
プロパティをメモします。
az containerapp identity assign
コマンドを実行して、ID をアプリに割り当てます。 ID パラメーターは、スペース区切りリストです。
az containerapp identity assign --resource-group <GROUP_NAME> --name <APP_NAME> \
--user-assigned <IDENTITY_RESOURCE_ID>
ID の id
プロパティを <IDENTITY_RESOURCE_ID>
に置き換えます。 複数のユーザー割り当て ID を割り当てるには、--user-assigned
パラメーターにスペースで区切られた ID のリストを指定します。
1 つ以上のユーザー割り当て ID を追加するには、ARM テンプレートに identity
セクションを追加します。 <IDENTITY1_RESOURCE_ID>
と <IDENTITY2_RESOURCE_ID>
を追加する ID のリソース識別子に置き換えます。
ID のリソース識別子をキーとして持つ項目を userAssignedIdentities
オブジェクトに追加して 、各ユーザー割り当て ID を指定します。 値として空のオブジェクトを使用します。
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"<IDENTITY1_RESOURCE_ID>": {},
"<IDENTITY2_RESOURCE_ID>": {}
}
}
ARM テンプレートの完全な例については、 ARM API の仕様 に関するページを参照してください。
Note
アプリケーションは、システム割り当て ID とユーザー割り当て ID の両方を同時に持つことができます。 この場合、type
プロパティの値は SystemAssigned,UserAssigned
になります。
1 つ以上のユーザー割り当て ID を追加するには、YAML 構成ファイルに identity
セクションを追加します。 <IDENTITY1_RESOURCE_ID>
と <IDENTITY2_RESOURCE_ID>
を追加する ID のリソース識別子に置き換えます。
ID のリソース識別子をキーとして持つ項目を userAssignedIdentities
オブジェクトに追加して 、各ユーザー割り当て ID を指定します。 値として空のオブジェクトを使用します。
identity:
type: UserAssigned
userAssignedIdentities:
<IDENTITY1_RESOURCE_ID>: {}
<IDENTITY2_RESOURCE_ID>: {}
YAML テンプレートの完全な例については、ARM API の仕様 に関するページを参照してください。
Note
アプリケーションは、システム割り当て ID とユーザー割り当て ID の両方を同時に持つことができます。 この場合、type
プロパティは SystemAssigned,UserAssigned
になります。
1 つ以上のユーザー割り当て ID を追加するには、Bicep テンプレートに identity
セクションを追加します。 <IDENTITY1_RESOURCE_ID>
と <IDENTITY2_RESOURCE_ID>
を追加する ID のリソース識別子に置き換えます。
ID のリソース識別子をキーとして持つ項目を userAssignedIdentities
オブジェクトに追加して 、各ユーザー割り当て ID を指定します。 値として空のオブジェクトを使用します。
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
<IDENTITY1_RESOURCE_ID>: {}
<IDENTITY2_RESOURCE_ID>: {}
}
}
完全な Bicep テンプレートの例については、「Microsoft.App containerApps Bicep、ARM テンプレートおよび Terraform AzAPI のリファレンス 」を参照してください。
Note
アプリケーションは、システム割り当て ID とユーザー割り当て ID の両方を同時に持つことができます。 この場合、type
プロパティは SystemAssigned,UserAssigned
になります。
一部のリソースでは、アクセス権を付与するために、アプリのマネージド ID のロールの割り当てを構成する必要があります。 そうしないと、Azure Key Vault や Azure SQL Database などのサービスへのアプリからの呼び出しは、その ID に有効なトークンを使用した場合でも拒否されます。 Azure ロールベースのアクセス制御 (Azure RBAC) の詳細については、「RBAC とは 」を参照してください。 Microsoft Entra トークンをサポートしているリソースの詳細については、「Microsoft Entra 認証をサポートしている Azure サービス 」をご覧ください。
重要
マネージド ID のバックエンド サービスは、リソース URI ごとのキャッシュを約 24 時間保持します。 特定のターゲット リソースのアクセス ポリシーを更新し、そのリソースのトークンをすぐに取得した場合、そのトークンの有効期限が切れるまで、期限切れのアクセス許可を持つキャッシュされたトークンを取得し続ける可能性があります。 リソース トークンの強制はサポートされていません。
アプリ コードでの Azure サービスへの接続
アプリはマネージド ID を使用して、Azure SQL Database、Azure Key Vault、Azure Storage など、Microsoft Entra ID を使用している Azure リソースにアクセスするためのトークンを取得できます。 これらのトークンは、アプリケーションの特定のユーザーではなく、リソースにアクセスしているアプリケーションを表します。
Container Apps には、トークンを取得するための内部アクセス可能な REST エンドポイント が用意されています。 REST エンドポイントは、標準の HTTP GET
要求を使用してアプリ内から入手できます。これは、優先する言語で汎用 HTTP クライアントを使用して送信できます。 NET、JavaScript、Java、Python の場合、Azure ID クライアント ライブラリは、この REST エンドポイントを抽象化します。 その他の Azure サービスへの接続は、サービス固有のクライアントに資格情報オブジェクトを追加することで行うことができます。
Note
Azure ID クライアント ライブラリの使用時には、ユーザー割り当てマネージド ID のクライアント ID を明示的に指定する必要があります。
次のスクリプトを使用して、Azure サービスのリソース URI を指定してローカル エンドポイントからトークンを取得します。 トークンを取得するには、プレース ホルダーをリソース URI に置き換えます。
$resourceURI = "https://<AAD-resource-URI>"
$tokenAuthURI = $env:IDENTITY_ENDPOINT + "?resource=$resourceURI&api-version=2019-08-01"
$tokenResponse = Invoke-RestMethod -Method Get -Headers @{"X-IDENTITY-HEADER"="$env:IDENTITY_HEADER"} -Uri $tokenAuthURI
$accessToken = $tokenResponse.access_token
生の HTTP GET
要求は、次の例のようになります。
IDENTITY_ENDPOINT
環境変数からトークン エンドポイント URL を取得します。 x-identity-header
には、IDENTITY_HEADER
環境変数に格納された GUID を含めます。
GET http://localhost:42356/msi/token?resource=https://vault.azure.net&api-version=2019-08-01 HTTP/1.1
x-identity-header: 853b9a84-5bfa-4b22-a3f3-0b9a43d9ad8a
応答は、この例のようになります:
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "eyJ0eXAi…",
"expires_on": "1586984735",
"resource": "https://vault.azure.net",
"token_type": "Bearer",
"client_id": "5E29463D-71DA-4FE0-8E69-999B57DB23B0"
}
この応答は、Microsoft Entra のサービス間アクセス トークン要求に対する応答 と同じです。 Key Vault にアクセスするには、access_token
の値をコンテナーとのクライアント接続に追加します。
REST エンドポイントの参照
マネージド ID を持つコンテナー アプリは、次の 2 つの環境変数を定義して ID エンドポイントを公開します:
IDENTITY_ENDPOINT
- お使いのコンテナー アプリがトークンを要求できるローカル URL。
IDENTITY_HEADER
- サーバー側のリクエスト フォージェリ (SSRF) 攻撃を軽減するために使用されるヘッダー。 値は、プラットフォームによってローテーションされます。
リソースのトークンを取得するには、次のパラメーターを指定して、このエンドポイントに HTTP GET
要求を行います。
パラメーター名
場所
説明
resource
クエリ
トークンを取得する必要のあるリソースの Microsoft Entra リソース URI。 このリソースは、Microsoft Entra 認証をサポートしている Azure サービス の 1 つ、またはその他いずれかのリソース URI です。
api-version
クエリ
使うトークン API のバージョン。 "2019-08-01" 以降の使用します。
X-IDENTITY-HEADER
ヘッダー
IDENTITY_HEADER
環境変数の値。 このヘッダーは、サーバー側のリクエスト フォージェリ (SSRF) 攻撃を回避します。
client_id
クエリ
(省略可能) 使用するユーザー割り当て ID のクライアント ID。 principal_id
、mi_res_id
、または object_id
を含む要求では使用できません。 すべての ID パラメーター (client_id
、principal_id
、object_id
、および mi_res_id
) を省略した場合、システム割り当て ID が使用されます。
principal_id
クエリ
(省略可能) 使用するユーザー割り当て ID のプリンシパル ID。 object_id
は代わりに使用する別名です。 client_id、mi_res_id、または object_id を含む要求では使用できません。 すべての ID パラメーター (client_id
、principal_id
、object_id
、および mi_res_id
) を省略した場合、システム割り当て ID が使用されます。
mi_res_id
クエリ
(省略可能) 使用するユーザー割り当て ID の Azure リソース ID。 principal_id
、client_id
、または object_id
を含む要求では使用できません。 すべての ID パラメーター (client_id
、principal_id
、object_id
、および mi_res_id
) を省略した場合、システム割り当て ID が使用されます。
重要
ユーザー割り当て ID のトークンを取得する場合は、省略可能なプロパティの 1 つを含める必要があります。 このようにしないと、トークン サービスは存在する場合と存在しない場合があるシステムが割り当てた ID のトークンを取得しようとします。
マネージド ID を表示
次の Azure CLI コマンドを使用して、システム割り当てマネージド ID とユーザー割り当てマネージド ID を表示できます。 出力には、コンテナー アプリに割り当てられているすべてのマネージド ID の型、テナント ID、プリンシパル ID が表示されます。
az containerapp identity show --name <APP_NAME> --resource-group <GROUP_NAME>
マネージド ID の削除
システム割り当て ID を削除すると、Microsoft Entra ID から削除されます。 コンテナー アプリのリソース自体を削除すると、システム割り当て ID も Microsoft Entra ID から自動的に削除されます。 お使いのコンテナー アプリからユーザー割り当てマネージド ID を削除しても、Microsoft Entra ID からは削除されません。
アプリのページの左側のナビゲーションで、[設定] グループまで下にスクロールします。
[ID] を選択します。 次に、ID の種類に基づいて、次の手順に従います。
システムに割り当てられた ID : [システム割り当て済み] タブで [状態] を [オフ] に切り替えます。 [保存] を選択します。
ユーザーに割り当てられたID : [ユーザ割り当て済み] タブを選択し、ID のチェックボックスを選択し、[削除] を選択します。 [はい] を選択して確定します。
システム割り当て ID を削除するには、次の手順を実行します。
az containerapp identity remove --name <APP_NAME> --resource-group <GROUP_NAME> --system-assigned
1 つ以上のユーザー割り当て ID を削除するには、次の手順を実行します。
az containerapp identity remove --name <APP_NAME> --resource-group <GROUP_NAME> \
--user-assigned <IDENTITY1_RESOURCE_ID> <IDENTITY2_RESOURCE_ID>
すべてのユーザー割り当て ID を削除するには:
az containerapp identity remove --name <APP_NAME> --resource-group <GROUP_NAME> \
--user-assigned <IDENTITY1_RESOURCE_ID> <IDENTITY2_RESOURCE_ID>
すべての ID を削除するには、コンテナー アプリの ID の type
を ARM テンプレートで None
に設定します:
"identity": {
"type": "None"
}
すべての ID を削除するには、YAML 構成ファイル内で、コンテナー アプリの ID の type
を None
に設定します:
identity:
type: None
すべての ID を削除するには、以下のように Bicep テンプレート内でコンテナー アプリの ID の type
を None
に設定します。
identity: {
type: 'None'
}
次のステップ