azure - 无法在同一 ARM 模板部署中创建和引用 keyvault secret

标签 azure azure-resource-manager azure-keyvault azure-rm-template

作为我正在进行的部署的一部分,我想要将 key 保管库部署到资源组中,创建一些 secret ,然后使用这些 secret 之一作为管理员密码将 SQL Server 部署到另一个资源组中。以下是我用于执行此操作的资源片段:

{
  "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 引用,错误就会消失。

令我困惑的是,链接的模板部署取决于 key 保管库 secret ,而 key 保管库 secret 又取决于 key 保管库,但没有部署任何内容,因为 key 保管库引用正在尝试先于其他任何事情进行解析。

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

提前致谢

最佳答案

参数引用在“编译”时(即验证)进行评估,因此在验证模板时,库确实需要存在。您也许可以通过嵌套几层深度并使用嵌套部署中的输出引用来实现这一目标。你需要做这样的事情:

  • 嵌套保管库设置并输出VaultId
  • 将 SQL Server 部署嵌套到“1 级”嵌套中
  • 在上述项目符号的参数中,引用第 1 步中的输出
  • 使用从“1 级”嵌套中的VaultId 构造的参数引用嵌套另一个部署

也就是说,我对你为什么要这样做感兴趣......通常,保管库引用用于保密纯文本/json。由于您将 secret 值传递到顶层的部署中,因此您已经拥有该值。没有理由从保管库引用它,因为您已经拥有它......

关于azure - 无法在同一 ARM 模板部署中创建和引用 keyvault secret ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48591761/

相关文章:

azure - 如何以编程方式接受 sendgrid 青铜帐户的 ARM 模板的市场条款

azure - 将 Azure Web App 诊断日志设置添加到 ARM 模板

azure - 托管服务标识在 Azure Function 中未按预期工作

Azure Devops Agent没有创建服务端点的权限(如何分配权限)

azure - 如何将 Jmeter 与 Databricks Spark 集群连接

c# - CosmosDb - 写入操作导致错误。错误=16500

azure - 设置adminPassword无效; linux部署在Azure资源管理器中

针对 key 保管库证书的 Azure 警报

Azure Keyvault 'unknown' 访问策略

c# - 是否可以创建一个可从 EventHub 中的多个事件触发的编排持久函数?