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.

Cómo crear múltiples secretos en AWS Secrets Manager usando Terraform.

Lo que quiero hacer es proporcionar una lista de nombres de clave a un módulo que se utilizará para generar muchos secretos con contraseñas aleatorias diferentes en el administrador de secretos.

He intentado muchas cosas diferentes pero hasta ahora he fracasado.

Esto es lo que tengo actualmente:

module "secrets-manager-1" {

  source = "lgallard/secrets-manager/aws"

  for_each = var.list
  secrets = {
    "${each.value}" = {
      description             = each.value
      recovery_window_in_days = 7
      secret_string           = random_password.special_password.result
    }
  }

  tags = var.standard_tags
}

resource "random_password" "special_password" {
  count  = 2
  length = 16
  special = true
}

variable "list" {
  type    = list(string)
  default = [
    "secret_key_1",
    "secret_key_2"

  ]
}

El error:

Error: Invalid for_each argument

  on ..\..\modules\jitsi\jitsi_secrets.tf line 54, in module "secrets-manager-1":
  54:   for_each = var.list
    ├────────────────
    │ var.list is list of string with 2 elements

The given "for_each" argument value is unsuitable: the "for_each" argument must be a map, or set of strings, and you have provided a value of type list of string.
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que el problema está en el argumento for_each en el bloque module. El valor actual de for_each es una lista de cadenas, pero for_each espera un mapa o conjunto de cadenas. Para solucionar esto, puedes convertir la lista en un mapa utilizando la función toset y un bucle for:

    module "secrets-manager-1" {
      source = "lgallard/secrets-manager/aws"
    
      for_each = { for key in toset(var.list) : key => {
        description             = key
        recovery_window_in_days = 7
        secret_string           = random_password.special_password[key].result
      }}
    
      tags = var.standard_tags
    }
    
    resource "random_password" "special_password" {
      for_each = { for key in toset(var.list) : key => {} }
      length   = 16
      special  = true
    }
    

    El argumento for_each en el bloque module ahora crea un mapa utilizando un bucle for sobre var.list. Cada elemento de la lista se convierte en una clave en el mapa, siendo el valor un mapa que contiene la configuración relevante para ese secreto (descripción, ventana de recuperación y cadena secreta).

    El argumento for_each en el bloque random_password hace lo mismo, pero crea un mapa vacío para cada clave en var.list. Esto asegura que se genere una contraseña aleatoria para cada secreto.

    Con estos cambios, el módulo debería ser capaz de generar secretos con contraseñas aleatorias diferentes utilizando una lista de nombres clave.

Comments are closed.