es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Recuperando el secreto de una bóveda de claves de una bóveda creada en el mismo archivo bicep.

Tengo un problema similar a https://stackoverflow.com/questions/69461223/retrieve-a-secret-from-keyvault-in-bicep-and-use-as-input-for-synapse-workspace.

(Aunque no puedo continuar la discusión allí ya que no tengo suficiente reputación)

Necesito crear tanto el keyvault como las máquinas virtuales en un mismo archivo de plantilla de implementación de Bicep. Un secreto generado en el archivo del módulo Bicep de keyvault debe ser utilizado para establecer la contraseña para el administrador local de la VM. Aunque no es un requisito que el secreto se cree a nivel de módulo de keyvault, no veo ninguna otra forma de lograr una implementación segura.

Esta es la parte relevante de la plantilla principal de Bicep:

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     
  ]     
} 

El desafío aquí es que cuando se implementa el archivo Bicep, obtengo el error: No se pudo encontrar el KeyVault especificado ‘‘. Si reemplazo kvRef.getSecret(‘localadmin’) con un valor aleatorio de cadena, la plantilla funciona correctamente.

En una plantilla de ARM se puede resolver esto de la siguiente manera:

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

¿Existe alguna manera de utilizar el mismo enfoque en Bicep como se muestra en el ejemplo de ARM o se puede resolver de alguna otra manera?

Tags:  

Answer

  1. Avatar for davy.ai

    El mensaje de error “No se pudo encontrar el KeyVault especificado ‘‘” indica que el módulo no puede obtener el objeto de Key Vault del grupo de recursos durante la implementación. Una posible solución es pasar el parámetro keyvaultName del módulo keyvault.bicep al módulo vm.bicep y utilizarlo para construir el ID de recurso del Key Vault en el objeto auth del parámetro adminPassword.

    Aquí tienes un ejemplo de implementación que demuestra este enfoque:

    En keyvault.bicep, pasa el parámetro keyvaultName al módulo vm.bicep:

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

    En vm.bicep, utiliza la salida keyvaultId del módulo keyvault.bicep para construir el ID de recurso del Key Vault:

    resource kvRef 'Microsoft.KeyVault/vaults@2019-09-01' = {
      name: kvName
      scope: rg
    }
    
    param adminPassword string
    param adminUsername string
    
    resource vm 'Microsoft.Compute/virtualMachines@2021-04-01' = {
      name: vmName
      ...
      properties: {
        osProfile: {
          computerName: vmHostName
          adminUsername: adminUsername
          adminPassword: {
            value: adminPassword
            ...
            auth: {
              type: "KeyVaultSecret"
              secretUrl: '${reference(outputs('keyvaultId'))}/secrets/localadmin'
              // construir el ID de recurso del Key Vault a partir de la salida del módulo keyvault.bicep
              // y el nombre del secreto de administrador local
            }
          }
        }
      }
    }
    

    Este enfoque construye el ID de recurso del Key Vault utilizando la salida del módulo keyvault.bicep y el nombre del secreto de administrador local. Dado que el módulo keyvault.bicep crea el objeto Key Vault, se puede asumir que el ID de recurso del Key Vault estará disponible durante la implementación del módulo vm.bicep.

Comments are closed.