如何在ARM模板中动态创建Azure KeyVault引用?

如何在ARM模板中动态创建Azure KeyVault引用?,azure,azure-resource-manager,azure-keyvault,arm-template,Azure,Azure Resource Manager,Azure Keyvault,Arm Template,我正在使用ARM模板参数文件中的以下代码从keyvault检索机密值: "parameters": { "mailAccount": { "reference": { "keyVault": { "id": "/subscriptions/GUID/resourceGroups/KeyVaultRG/providers/Microsoft.KeyVault/vaults/KeyVault"

我正在使用ARM模板参数文件中的以下代码从keyvault检索机密值:

"parameters": {
    "mailAccount": {
             "reference": {
               "keyVault": {
                    "id": "/subscriptions/GUID/resourceGroups/KeyVaultRG/providers/Microsoft.KeyVault/vaults/KeyVault"
                  },
                  "secretName": "mailAccount"
             }
           },
在模板文件中:

  "appSettings": [           
            {
              "name": "mailAccount",
              "value": "[parameters('mailAccount')]"
            },
            {
我想知道是否可以使用动态构造的对象(即不是
/subscriptions/GUID/resourceGroups/KeyVaultRG/providers/Microsoft.KeyVault/vaults/KeyVault
而是
[resourceId(subscription().subscriptionId,resourcegroup().name,'Microsoft.KeyVault/vaults',参数('KeyVault名称'))]
)或
[resourceId('Microsoft.KeyVault/Vault',parameters('KeyVault名称'))]

事实上,主要目标是在部署模板时能够传递不同的KeyVault名称,其中存储了相似的值。
由于资源(和成本)的分离,需要几个密钥库是合理的

现在,我只看到验证错误,说明~
resourceId函数在引用参数时不能使用


我不能使用嵌套\链接的模板(和输出值)。

为了避免resourceId函数的这种限制,我通常会使用参数值定义一个变量,然后在resourceId函数中使用该变量

例如:

"parameters": {
        "KeyVaultName": {
            "type": "string",
            "metadata": {
                "description": "Key Vault Name"
            }
        }
},
"variables": {
    "KeyVaultName": "[parameters('KeyVaultName')]"
}
然后,当我引用KeyVault资源时,我使用如下变量引用它:

"[resourceId('Microsoft.KeyVault/vaults', variables('KeyVaultName')]"

嵌套/链接模板是此问题的唯一解决方案。您可以分享阻止您使用此解决方案的原因吗?您不需要使用输出,但需要使用嵌套模板(如Rich所述)。我在以编程方式在代码(.Net Core web app+Azure API调用)中创建资源时使用此模板。遗憾的是,在使用REST API部署时,我无法使用嵌套模板。