Azure では、delegatedManagedIdentityResourceId
プロパティを使用して、異なるテナント間でマネージド ID にロールを適切に割り当てます。 この割り当ては、発行元と顧客が別々のテナントに存在する Azure Marketplace で公開されたマネージド アプリケーションを扱う場合に役立ちます。
必要とする理由
顧客が Marketplace からマネージド アプリケーションを展開する場合、発行元は管理対象リソース グループ (MRG) 内のリソースを管理する責任があります。 ただし、展開テンプレートの一部として実行されるロールの割り当ては、発行元のテナントで行われます。 これらの割り当てにより、マネージド ID が顧客のテナントに作成されるときに問題が発生します。これは、間違ったテナントで ID を見つけようとすると、ロールの割り当てが失敗するためです。
delegatedManagedIdentityResourceId
プロパティは、マネージド ID が存在する場所を明示的に指定し、ロールの割り当てプロセスでアクセス許可を正しく見つけて割り当てられるようにして、この問題を解決します。
しくみ
マネージド ID の作成
マネージド アプリケーションを展開すると、マネージド ID が顧客のテナントに作成されます。
ロール割り当て
ロールの割り当ての展開は発行元のテナントの下で行われるため、ロールの割り当てでは自然とそのテナント内の ID が検索されます。
delegatedManagedIdentityResourceId の使用
正しいリソース ID を指定して:
- システム割り当て ID の場合: ID を保持するリソースのリソース ID を使用します。 例: 関数アプリやロジック アプリなど。
- ユーザー割り当て ID の場合: ID 自体のリソース ID を使用します。
delegatedManagedIdentityResourceId の適用方法
ロールの割り当てを正しく設定するには、Azure Resource Manager テンプレート (ARM テンプレート) のロールの割り当てセクションに delegatedManagedIdentityResourceId
プロパティを追加します。 例:
{
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2022-04-01",
"properties": {
"roleDefinitionId": "<role-definition-id>",
"principalId": "<principal-id>",
"delegatedManagedIdentityResourceId": "<resource-id-of-identity>"
}
}
一般的なエラーとトラブルシューティング
ID が見つからないため、ロールの割り当てに失敗しました
-
delegatedManagedIdentityResourceId
に正しいリソース ID が指定されていることを確認します。 - マネージド ID が顧客のテナントに存在することを確認します。
拒否の割り当てによりアクセスが制限される
- 拒否の割り当てにより、顧客は MRG へのアクセスができなくなります。
- MRG を管理する発行元の ID が、顧客のテナントで正しく参照されていることを確認します。
誤ったデプロイ コンテキストの設定
- 公開されたマネージド アプリと発行元アクセスが有効な AMA の展開は、発行元のテナントで発生します。
-
delegatedManagedIdentityResourceId
が顧客のテナント ID を参照するように適切に設定されていることを確認します。
ロールの割り当て PUT 要求は、テナント間でのみサポートされる
delegatedManagedIdentityResourceId
を使用したロールの割り当て PUT 要求は、テナント間のシナリオでのみサポートされ、同じテナント内での展開はサポートされません。 テスト中に同じテナント内で使用するには、次のようにプロパティを含めるパラメーターを追加します。
{
"comments": "Using cross-tenant delegatedManagedIdentityResourceId property",
"type": "Microsoft.Authorization/roleAssignments",
"apiVersion": "2021-04-01-preview",
"name": "[guid(resourceGroup().id, variables('<identityName>'), variables('<roleDefinitionId>'))]",
"dependsOn": [
"[variables('<identityName>')]"
],
"properties": {
"roleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions',variables('<roleDefinitionId>'))]",
"principalId": "[reference(variables('<identityName>')).principalId]",
"principalType": "<PrincipalType>",
"scope": "[resourceGroup().id]",
"delegatedManagedIdentityResourceId": "[if(parameters('crossTenant'), resourceId('Microsoft.ManagedIdentity/userAssignedIdentities',variables('<identityName>')), json('null'))]"
}
}