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.

Terraform no espera la actualización de azurerm_key_vault_secret.xyz.id.

Estamos utilizando Terraform para construir mis recursos de Azure con el proveedor azurerm.
Estamos inyectando un secreto durante la ejecución de Terraform y este secreto puede cambiar de vez en cuando.
Usamos un azurerm_key_vault_secret para almacenar el secreto y una función de aplicación con una identidad administrada (que tiene acceso de lectura al almacén de claves) que recibe el secreto de esta manera:

recurso "azurerm_key_vault_secret" "my_secret" {
  nombre         = "mi-secreto"
  valor        = var.mi_secreto
  id_del_almacén_de_claves = azurerm_key_vault.default.id
}

recurso "azurerm_function_app" "app" {
  nombre         = "..."
  configuración_de_la_aplicación = {
      MySecret = "@Microsoft.KeyVault(SecretUri=${azurerm_key_vault_secret.my_secret.id})"
  }
  identidad {
    tipo = "SystemAssigned"
  }
  ...
}

Cuando ejecuto terraform apply y el secreto cambia, la aplicación de la función apunta a la versión antigua del secreto. Parece que se lee el azurerm_key_vault_secret.my_secret.id antes de que se actualice el secreto.

¿Alguien tiene alguna idea de cómo puedo asegurarme de que la función de la aplicación espere la actualización del secreto?

(Y sí, el id cambia y tampoco me gusta, pero así es como funciona el proveedor).

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una forma de asegurarse de que la función de la aplicación siempre reciba la última versión del secreto es utilizar la referencia dinámica en la configuración de la aplicación. En lugar de codificar en duro la URI del secreto utilizando azurerm_key_vault_secret.my_secret.id, podemos utilizar el bloque dynamic para generar la URI durante la ejecución. De esta manera, Terraform siempre hará referencia a la última versión del secreto, incluso si ha cambiado.

    Aquí tienes un ejemplo de cómo utilizar el bloque dynamic:

    resource "azurerm_key_vault_secret" "my_secret" {
      name         = "mi-secreto"
      value        = var.mi_secreto
      key_vault_id = azurerm_key_vault.default.id
    }
    
    resource "azurerm_function_app" "app" {
      name         = "..."
      identity {
        type = "SystemAssigned"
      }
    
      app_settings = dynamic "app_settings" {
        for_each = { MiSecreto = azurerm_key_vault_secret.my_secret.name }
    
        content {
          "${app_settings.key}" = "@Microsoft.KeyVault(SecretUri=${azurerm_key_vault_secret.my_secret.id})"
        }
      }
    }
    

    Con este cambio, la app_settings ahora utiliza un bloque dinámico que itera sobre la clave MiSecreto, que contiene el nombre del secreto del almacén de claves. El bloque content genera la configuración de la aplicación con el nombre de MiSecreto y establece el valor en la URI dinámica del secreto, que hace referencia a la última versión del mismo. Esto asegura que la función de la aplicación siempre reciba la última versión del secreto, incluso si ha cambiado.

Comments are closed.