You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

跨资源组通过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'))]"
      ]
    }
]

疑问解答

  1. 需求是否可行?
    完全可行,ARM模板支持跨资源组操作资源,只要执行部署的账号同时拥有资源组B的部署权限,以及资源组A中Key Vault的访问策略修改权限。

  2. 是否需要将部署范围从Resource Group改为Subscription?
    不需要。保持资源组级部署(针对资源组B)即可,只需为跨资源组的accessPolicies资源指定目标资源组(资源组A)的范围。

  3. 如何定义范围?是否需为每个资源单独定义范围?
    仅需要为跨资源组的资源(即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权限

内容的提问来源于stack exchange,提问作者H. Larsson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 19:40:54