跨资源组通过ARM模板为Key Vault添加Access Policy的疑问
跨资源组通过ARM模板部署Function App并配置Key Vault访问策略
问题背景
现有资源组A包含一个Key Vault,其存储的机密供多资源组的应用使用。通过ARM模板在资源组B中创建Function App时,需要为资源组A的Key Vault添加访问策略,授予新创建的Function App系统身份访问权限,但当前模板因资源组范围问题无法生效。
原简化模板片段:
"resources": [ { "type": "Microsoft.Web/sites", "apiVersion": "2021-03-01", "name": "[parameters('functionAppName')]", "kind": "functionapp", "location": "[parameters('location')]", "identity": { "type": "SystemAssigned" }, ... (无关内容省略) }, { "type": "Microsoft.KeyVault/vaults/accessPolicies", "apiVersion": "2019-09-01", "name": "[concat(parameters('keyVaultName'), '/add')]", "location": "[resourceGroup().location]", "properties": { "accessPolicies": [ { "tenantId": "[tenant().tenantId]", "objectId": "[reference(resourceId('Microsoft.Web/sites', parameters('functionAppName')), '2019-08-01').identity.principalId]", "permissions": { "secrets": [ "get", "list" ] } } ] }, "dependsOn": [ "[resourceId('Microsoft.Web/sites', parameters('functionAppName'))]" ] } ]
疑问解答
需求是否可行?
完全可行,ARM模板支持跨资源组操作资源,只要执行部署的账号同时拥有资源组B的部署权限,以及资源组A中Key Vault的访问策略修改权限。是否需要将部署范围从Resource Group改为Subscription?
不需要。保持资源组级部署(针对资源组B)即可,只需为跨资源组的accessPolicies资源指定目标资源组(资源组A)的范围。如何定义范围?是否需为每个资源单独定义范围?
仅需要为跨资源组的资源(即Key Vault的accessPolicies)单独指定scope属性,部署在当前资源组B的Function App无需额外配置范围。
修正后的模板示例
在accessPolicies资源中添加scope属性,指向资源组A的ID,同时修正Key Vault的引用逻辑:
"resources": [ { "type": "Microsoft.Web/sites", "apiVersion": "2021-03-01", "name": "[parameters('functionAppName')]", "kind": "functionapp", "location": "[parameters('location')]", "identity": { "type": "SystemAssigned" }, ... (无关内容省略) }, { "type": "Microsoft.KeyVault/vaults/accessPolicies", "apiVersion": "2019-09-01", "name": "[concat(parameters('keyVaultName'), '/add')]", // 指定KeyVault所在的资源组A的范围 "scope": "[resourceGroup('资源组A名称')]", "properties": { "accessPolicies": [ { "tenantId": "[tenant().tenantId]", "objectId": "[reference(resourceId('Microsoft.Web/sites', parameters('functionAppName')), '2019-08-01').identity.principalId]", "permissions": { "secrets": [ "get", "list" ] } } ] }, "dependsOn": [ "[resourceId('Microsoft.Web/sites', parameters('functionAppName'))]" ] } ]
关键说明
- scope属性:必须设置为Key Vault所在资源组A的ID,使用
resourceGroup('资源组A名称')可以直接获取该资源组的范围ID。 - 权限要求:执行部署的账号需要具备:
- 资源组B的
Microsoft.Resources/deployments/write权限 - 资源组A中Key Vault的
Microsoft.KeyVault/vaults/accessPolicies/write权限
- 资源组B的
内容的提问来源于stack exchange,提问作者H. Larsson
相关产品推荐
相关产品推荐

