Saltar al contenido

Terraform: use bucles anidados con conteo

Revisamos exhaustivamente cada uno de los tutoriales en nuestro espacio con el objetivo de mostrarte siempre información certera y actualizada.

Solución:

Solución 1:

Terraform no tiene soporte directo para este tipo de iteración anidada, pero podemos simularlo con algo de aritmética.

variable "list_of_allowed_accounts" 
  type = "list"
  default = ["1111", "2222"]


variable "list_of_images" 
  type = "list"
  default = ["alpine", "java", "jenkins"]


data "template_file" "ecr_policy_allowed_accounts" 
  count = "$length(var.list_of_allowed_accounts) * length(var.list_of_images)"

  template = "$file("$path.module/ecr_policy.tpl")"

  vars 
    account_id = "$var.list_of_allowed_accounts[count.index / length(var.list_of_images)]"
    image      = "$var.list_of_images[count.index % length(var.list_of_images)]"
  


resource "aws_ecr_repository_policy" "repo_policy_allowed_accounts" 
  count = "$data.template_file.ecr_policy_allowed_accounts.count"

  repository = "$var.list_of_images[count.index % length(var.list_of_images)]"
  policy = "$data.template_file.ecr_policy_allowed_accounts.*.rendered[count.index]"

Dado que queremos crear una plantilla de política para cada combinación de cuenta e imagen, el count sobre el template_file bloque de datos son los dos multiplicados juntos. Entonces podemos usar las operaciones de división y módulo para volver de count.index a los índices separados en cada lista.

Como no tenía una copia de la plantilla de su póliza, solo usé una de marcador de posición; esta configuración dio así el siguiente plan:

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.0
    policy:     "policy allowing 1111 to access alpine"
    repository: "alpine"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.1
    policy:     "policy allowing 1111 to access java"
    repository: "java"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.2
    policy:     "policy allowing 1111 to access jenkins"
    repository: "jenkins"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.3
    policy:     "policy allowing 2222 to access alpine"
    repository: "alpine"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.4
    policy:     "policy allowing 2222 to access java"
    repository: "java"

+ aws_ecr_respository_policy.repo_policy_allowed_accounts.5
    policy:     "policy allowing 2222 to access jenkins"
    repository: "jenkins"

Cada instancia de política se aplica a un par diferente de ID de cuenta e imagen, cubriendo todas las combinaciones.

Solución 2:

Las respuestas aquí funcionan (las usé inicialmente), pero creo que tengo una mejor solución usando la función setproduct de Terraform. No he visto muchos ejemplos de su uso en las interwebs, pero setproduct toma dos conjuntos (o más importante, dos listas) y produce una lista de conjuntos con cada permutación de las entradas. En mi caso, estoy creando parámetros SSM:

variable "list1" 
  type    = "list"
  default = ["outer1", "outer2"]


variable "list2" 
  type    = "list"
  default = ["inner1", "inner2", "inner3"]


locals 
  product = "$setproduct(var.list1, var.list2)"


resource "aws_ssm_parameter" "params" 
  count     = "$length(var.list1) * length(var.list2)"
  name      = "/$element(local.product, count.index)[0]/$element(local.product, count.index)[1]"
  type      = "String"
  value     = "somevalue"
  overwrite = false
  lifecycle  ignore_changes = ["value"] 

Esto crea parámetros de SSM denominados:

/outer1/inner1
/outer1/inner2
/outer1/inner3
/outer2/inner1
/outer2/inner2
/outer2/inner3

¡Mi pequeño cerebro débil puede analizar esto un poco más fácilmente que la magia del módulo en las otras respuestas!


Solución 3:

Para su información, si alguien viene aquí de Google, si está utilizando terraform 0.12, deberá usar la función de piso en cualquier lugar donde divida, o de lo contrario obtendrá un error sobre índices parciales.

account_id = var.list_of_allowed_accounts[floor(count.index /
length(var.list_of_images))]

Recuerda que tienes la capacidad de agregar una reseña si te fue preciso.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *