在 ARM 模板中引用 KeyVault 机密失败并显示 'The resource is not defined in the template'

referencing a KeyVault secret in an ARM template fails with 'The resource is not defined in the template'

我正在尝试在 Azure Web 应用程序的 AppConfig 部分创建 KeyVault 引用。 KeyVault 引用引用了 KeyVault 中存在的机密,该 KeyVault 属于不同的资源组,因此不存在于模板中。

根据 reference() 模板函数的 documentation,只要您提供完整的 resourceId 和 apiVersion,您应该能够引用不属于模板的资源。

但是当我使用它来引用秘密时,我不断收到验证错误,其中显示:

Error: Code=InvalidTemplate; Message=Deployment template validation failed: 'The resource 'Microsoft.KeyVault/vaults//secrets/' is not defined in the template.

我关注了this guide。了解如何在 ARM 模板中使用 KeyVault 引用。

下面的代码是一个不起作用的示例。

{
  "type": "Microsoft.Web/sites",
  "apiVersion": "2016-08-01",
  "name": "[variables('webAppName')]",
  "location": "[resourceGroup().location]",
  "properties": {
    "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('serverFarmName'))]",
    "siteConfig": {
      "alwaysOn": true,
      "appSettings": [
        {
          "name": "<secretName>",
          "value": "[concat('@Microsoft.KeyVault(SecretUri=', reference(variables('secretResourceId')).secretUriWithVersion, ')')]"
        },
      ]
    }
  },
  "identity": {
    "type": "SystemAssigned"
  },
  "dependsOn": [
    "[resourceId('Microsoft.Web/serverfarms', variables('serverFarmName'))]"
  ]
}

变量定义如下:

"variables": {
  "secretResourceId": "[resourceId(subscription().subscriptionId, parameters('keyVaultResourceGroup'), 'Microsoft.KeyVault/vaults/secrets', parameters('keyVaultName'), 'secretName')]"
},

这是特定于对 KeyVault 机密的引用吗?

只要我尝试相同但在模板中使用 keyvault 和 secret,它就可以正常工作。

reference function 的文档提到当引用资源未在同一模板中提供时,函数的第二个参数 apiVersion 是必需的。

所以,而不是

reference(variables('secretResourceId')).secretUriWithVersion

像这样的东西应该可以工作

reference(variables('secretResourceId'), '2018-02-14').secretUriWithVersion