无法在同一 ARM 模板部署中创建和引用密钥保管库机密

Can't create and reference a keyvault secret in the same ARM template deployment

作为我正在执行的部署的一部分,我想将一个 Key Vault 部署到一个资源组中,创建一些机密,然后使用这些机密之一将 SQL 服务器部署到另一个资源组中管理员密码。以下是我用来执行此操作的资源片段:

{
  "type": "Microsoft.KeyVault/vaults",
  "name": "[variables('KeyVaultName')]",
  "apiVersion": "2015-06-01",
  "location": "[resourceGroup().location]",
  "properties": {
    "enabledForTemplateDeployment": "true",
    "accessPolicies": "[variables('KeyVaultAccessPolicies')]",
    "tenantId": "[parameters('TenantId')]",
    "sku": {
      "name": "Standard",
      "family": "A"
    }
  }
},
{
  "type": "Microsoft.KeyVault/vaults/secrets",
  "name": "[concat(variables('KeyVaultName'), '/secretname')]",
  "apiVersion": "2015-06-01",
  "properties": {
    "value": "<a randomised value>"
  },
  "dependsOn": [
    "[concat('Microsoft.KeyVault/vaults/', variables('KeyVaultName'))]"
  ]
},
{
  "apiVersion": "2017-05-10",
  "name": "deploy",
  "type": "Microsoft.Resources/deployments",
  "resourceGroup": "<another resource group>",
  "properties": {
    "mode": "Incremental",
    "templateLink": {
      "uri": "<my linked template>",
      "contentVersion": "1.0.0.0"
    },
    "parameters": {
      "SQLServerAdminPasswordSecretName": {
        "value": "secretname"
      }
    }
  },
  "dependsOn": [
    "[resourceId('Microsoft.KeyVault/vaults/secrets', variables('KeyVaultName'), 'secretname')]"
  ]
}

我的链接模板也有一个看起来有点像下面这样的部署:

{
    "apiVersion": "2017-05-10",
    "name": "sql-server-deployment",
    "type": "Microsoft.Resources/deployments",
    "properties": {
        "mode": "Incremental",
        "templateLink": {
            "uri": "<another linked tempalate>",
            "contentVersion": "1.0.0.0"
        },
        "parameters": {
            "SQLServerName": {
                "value": "[variables('SQLServerName')]"
            },
            "SQLServerAdminPassword": {
                "reference": {
                    "keyVault": {
                        "id": "[resourceId(parameters('ParentResourceGroupName'), 'Microsoft.KeyVault/vaults', parameters('ParentKeyVaultName'))]"
                    },
                    "secretName": "[parameters('SQLServerAdminPasswordSecretName')]"
                }
            }
        }
    }
}

这个引用目前正在杀死我的整个部署说:

"The specified KeyVault '/subscriptions/[subscription id]/resourceGroups/[parent resource group]/providers/Microsoft.KeyVault/vaults/[my keyvault]' could not be found."

如果我删除链接模板中的 Keyvault 引用,错误就会消失。

令我困惑的是,链接模板部署取决于密钥保管库机密,而密钥保管库机密又取决于密钥保管库,但没有部署任何内容,因为密钥保管库引用试图先于其他任何内容解决.

我是否漏掉了一些明显的东西,或者这是 ARM 模板中的一个缺陷?

提前致谢

参数引用在 "compile" 时进行评估(即验证),因此在验证模板时,保险库确实需要存在。您 可能 可以通过嵌套几层深度并使用嵌套部署的输出引用来实现这一点。你需要做这样的事情:

  • 嵌套 vault 设置并输出 vaultId
  • 将 SQL 服务器部署嵌套到 "level 1" 嵌套
  • 在上述项目符号的参数中,引用步骤 1 中的输出
  • 使用从 "level 1" 嵌套
  • 中的 vaultId 构造的参数引用嵌套另一个部署

就是说,我很想知道您为什么要这样做...通常情况下,保险库引用用于保密 text/json。由于您将秘密值传递到顶层的部署中,因此您已经拥有该值。没有理由从保险库中引用它,因为您已经拥有它...