无法在同一 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。由于您将秘密值传递到顶层的部署中,因此您已经拥有该值。没有理由从保险库中引用它,因为您已经拥有它...
作为我正在执行的部署的一部分,我想将一个 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。由于您将秘密值传递到顶层的部署中,因此您已经拥有该值。没有理由从保险库中引用它,因为您已经拥有它...