首页 > 解决方案 > 访问 Azure ARM 模板中的机密

问题描述

我按照官方文档中的教程如何访问 arm 模板中的密钥库机密。我用静态和动态密钥库 id 尝试了这两种方法,我让它们都工作了。奇怪的是需要设置的样板(需要嵌套模板)的动态 id 方法数量。

在静态 id 方法中,您需要在模板参数文件中指定:

"adminPassword": {
        "reference": {
          "keyVault": {
          "id": "/subscriptions/<subscription-id>/resourceGroups/<rg-name>/providers/Microsoft.KeyVault/vaults/<vault-name>"
          },
          "secretName": "ExamplePassword"
        }
      }

这是不错且简单的设置。

但是,如果我在主模板文件的参数部分(不在参数文件中)尝试类似的设置(没有嵌套模板)的动态 id 方法,它不起作用:

"adminPassword": {
      "type": "secureobject",
      "metadata": {
        "description": "Key vault secret"
      },
      "defaultValue": {
        "reference": {
          "keyVault": {
            "id": "[resourceId('keyvault-resource-group','Microsoft.KeyVault/vaults', 'keyvault-name')]"
          },
          "secretName": "ExamplePassword"
        }
      }
    }

问题是为什么这种方法不起作用?也许与手臂模板生命周期有关?当您只需要从密钥保管库访问一两个秘密时,这将显着减少样板文件的数量。

再说一遍,我确实使官方文档中的静态和动态 id 方法与嵌套模板一起使用。如果可能的话,这是试图减少 arm 模板中的行数或消除对嵌套模板的需求。

标签: azureazure-pipelinesazure-resource-managerazure-keyvault

解决方案


文档中所示,您只能在链接模板参数中声明动态密钥保管库 ID,对于每个链接模板,每次都必须重复该 ID。

据我了解,您希望传入参数一次,然后将其重用于多个链接模板。

考虑到上述情况,您可以securestring使用内联参数从 PowerShell传递New-AzResourceGroupDeployment

ARM 模板

"adminPassword": {
  "type": "securestring",
  "metadata": {
    "description": "Key vault secret"
  }
}

电源外壳

$adminPassword = (Get-AzKeyVaultSecret `
    -VaultName "keyVaultName" `
    -Name "adminPassword").SecretValue

New-AzResourceGroupDeployment `
    -ResourceGroupName "my-resource-group" `
    -TemplateFile template.json `
    -TemplateParameterFile parameters.json `
    -adminPassword $adminPassword

您还可以将其与Azure Devops YAML 管道中的Azure Key Vault 任务集成:

- task: AzureKeyVault@1
  inputs:
    azureSubscription: $(subscriptionID)
    KeyVaultName: $(keyVaultName)
    SecretsFilter: '*'
    RunAsPreJob: false

然后您可以在后续任务中引用该秘密。您还可以将此机密作为参数传递给Azure 资源组部署任务


推荐阅读