【问题标题】:Retrieving key vault secret from a keyvault created in same bicep从同一二头肌中创建的密钥库中检索密钥库秘密
【发布时间】:2021-12-21 13:34:56
【问题描述】:

我有一个类似于Retrieve a secret from keyvault in Bicep and use as input for Synapse Workspace creation的问题

(虽然我没有足够的代表,所以无法继续讨论)

我需要在同一个二头肌部署模板文件中创建 keyvault 和 vm。应使用在 keyvault bicep 模块文件中生成的机密来设置 VM 的本地管理员密码。尽管不要求必须在 keyvault 模块级别创建密钥,但我没有看到任何其他方式来确保部署安全。

这是主要二头肌模板的相关部分:

module kv './modules/keyvault.bicep' = {     
  name: '${deployment().name}-kv'     
  scope: rg     
  params: {     
    keyvaultName: kvName    
    createLocalAdmin: true     
  }     
} 

resource kvRef 'Microsoft.KeyVault/vaults@2019-09-01' existing = {     
  name: kvName     
  scope: rg     
}      

module vm './modules/vm.bicep' = {     
  name: '${deployment().name}-vm-${vm.hostShortName}'     
  scope: rg     
  params: {     
    adminPassword: kvRef.getSecret('localadmin')     
    adminUsername: 'localadmin'     
  }     
  dependsOn: [     
    network     
    kv     
  ]     
} 

这里的挑战是,在部署二头肌时出现错误:找不到指定的 KeyVault ''。如果我将 kvRef.getSecret('localadmin') 替换为随机值字符串,则模板工作正常。

在 ARM 模板中,这可以解决,例如:

"adminPassword": {"Value":{
    "reference": { 
        "keyVault": { 
            "id":"concat(subscription().Id,'/resourceGroups/',variables('rgName'),'/providers/Microsoft.KeyVault/vaults/',reference('deploy-keyvault').outputs.KeyvaultName.value)]" 
         }, 
        "secretName": "[variables('localAdminSecretname')]" 
        } 
    } 
} 

有什么方法可以在二头肌中执行与 ARM 示例相同的方法或以任何其他方式解决此问题?

【问题讨论】:

    标签: azure-bicep


    【解决方案1】:

    这是一个操作顺序/并行问题。

    module kv './modules/keyvault.bicep' = {     
      name: '${deployment().name}-kv'     
      scope: rg     
      params: {     
        keyvaultName: kvName    
        createLocalAdmin: true     
      }     
    } 
    
    resource kvRef 'Microsoft.KeyVault/vaults@2019-09-01' existing = {     
      name: kvName     
      scope: rg     
    }      
    

    每个模块都作为子部署运行,可能并行运行。二头肌依赖于参考使用来生成dependsOn 参考。即,如果您的模块输出 name 属性,则按如下方式引用它:

    resource kvRef 'Microsoft.KeyVault/vaults@2019-09-01' existing = {     
      name: kv.outputs.name
      scope: rg     
    }   
    

    二头肌能够理解一个人必须自动在另一个人之前跑。既然你不这样做,你必须明确告诉它。

    解决方案是将dependsOn 添加到您的existing 密钥库中,这样它就知道等待前一个模块完成。

    resource kvRef 'Microsoft.KeyVault/vaults@2019-09-01' existing = {     
      name: kvName     
      scope: rg     
      dependsOn: [ kv ]
    }   
    

    【讨论】:

    • 感谢您的反馈。我也试过了,但属性“dependsOn”在“Microsoft.KeyVault/vaults”中不可用。对你起作用吗? dependsOn 是“Microsoft.KeyVault/vaults”上的预览功能吗?我的错误信息; '“Microsoft.KeyVault/vaults”类型的对象不允许使用“dependsOn”属性。'
    【解决方案2】:

    也许您可以考虑像这样拆分 Key Vault 的部署和需要您刚刚创建的实例的资源:

    https://github.com/mariomeyrelles/bicep-functions-cosmos-keyvault/blob/main/src/main.bicep

    【讨论】:

      最近更新 更多