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

如何在Azure ARM模板中基于Key Vault访问策略设置条件部署

实现ARM模板条件式添加Key Vault访问策略

没问题,我来帮你搞定这个需求——让ARM模板只在Key Vault没有访问策略的时候才添加指定策略,否则就跳过操作。下面是具体的实现思路和修改后的模板:

核心逻辑梳理

我们需要完成两个关键判断,再根据结果执行对应操作:

  • 判断目标Key Vault是否已经存在
  • 如果存在,检查它的现有访问策略数组是否为空
    最终逻辑:要么创建Key Vault并添加策略(资源不存在时),要么仅在无现有策略时添加新策略,否则保留原有策略跳过操作。

修改后的完整模板

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "KeyVaultName": {
      "type": "string",
      "metadata": {
        "description": "Name of the Azure Key Vault"
      }
    }
  },
  "variables": {
    "webSiteName": "[your-web-site-name]", // 替换为你实际的Web应用名称
    "identity_resource_id": "[resourceId('Microsoft.Web/Sites', variables('webSiteName'))]"
  },
  "resources": [
    {
      "comments": "Create Azure Key Vault and add access policy only if none exist",
      "type": "Microsoft.KeyVault/vaults",
      "name": "[parameters('KeyVaultName')]",
      "apiVersion": "2018-02-14",
      "location": "[resourceGroup().location]",
      "properties": {
        "enabledForDeployment": false,
        "enabledForTemplateDeployment": false,
        "enabledForVolumeEncryption": false,
        "tenantId": "[reference(variables('identity_resource_id'), '2018-11-01', 'Full').identity.tenantId]",
        "accessPolicies": "[if(
          or(
            not(resourceExists(resourceId('Microsoft.KeyVault/vaults', parameters('KeyVaultName')))),
            equals(length(reference(resourceId('Microsoft.KeyVault/vaults', parameters('KeyVaultName')), '2018-02-14').accessPolicies), 0)
          ),
          array(
            {
              "tenantId": "[reference(variables('identity_resource_id'), '2018-11-01', 'Full').identity.tenantId]",
              "objectId": "[reference(variables('identity_resource_id'), '2018-11-01', 'Full').identity.principalId]",
              "permissions": {
                "secrets": [ "get", "list" ]
              }
            }
          ),
          reference(resourceId('Microsoft.KeyVault/vaults', parameters('KeyVaultName')), '2018-02-14').accessPolicies
        )]",
        "sku": {
          "name": "standard",
          "family": "A"
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Web/Sites', variables('webSiteName'))]"
      ]
    }
  ]
}

关键细节解释

  1. 资源存在性检查:使用resourceExists函数判断Key Vault是否已部署在当前资源组
  2. 空策略判断:通过length(reference(...).accessPolicies)获取现有策略数量,等于0则说明无任何访问策略
  3. 条件分支处理:
    • 当「Key Vault不存在」或「Key Vault存在但无访问策略」时,生成包含新策略的数组
    • 当Key Vault已有访问策略时,直接引用原有策略数组,避免覆盖或重复添加
  4. 部署模式提醒:默认的增量部署模式完全适配这个场景,它不会删除资源的现有属性,仅做必要更新

小提示

  • 记得把变量里的[your-web-site-name]替换为实际的Web应用名称,也可以把它改成参数,让模板更灵活
  • 确保部署账号拥有Key Vault的读取和写入权限,否则可能出现权限不足的报错

内容的提问来源于stack exchange,提问作者Pelle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:20:39