Salidas de for_each loop para cada recurso

Aug 28 2020

Estoy teniendo dificultades para averiguar cómo generar un resultado para cada recurso de grupo objetivo que crea este código. Me gustaría poder hacer referencia a cada uno individualmente en otros módulos. Parece que for_each lo almacena como un mapa, entonces mi pregunta es ¿cómo obtendría el arn para targetgroup1 y targetgroup2? Terraform normalmente se refiere a las salidas por nombre de recurso, así que estoy luchando con eso en este escenario y también con cómo referirme a estos arns individuales. ¿Necesitaría también trabajar las salidas en for_each o podría colocarlas en el archivo output.tf?

locals {
  target_groups_beta = {
    targetgroup1 = {
      name = "example",
      path = "/",
      environment = "Beta"
    }
    targetgroup2 = {
      name = "example2",
      path = "/",
      environment = "Beta"
    }
    }
  }

resource "aws_lb_target_group" "target-group" {
  for_each = local.target_groups_beta
  name     = "example-${each.value.name}-" port = 80 protocol = "HTTP" vpc_id = var.vpc-id deregistration_delay = 5 tags = { Environment = "${each.value.environment}"
  }

  health_check{
  healthy_threshold = 2
  unhealthy_threshold = 2
  timeout = 10
  interval = 15
  path = each.value.path
  }
}

Recibo el siguiente error cuando intento hacerlo en el archivo output.tf sin un valor clave, pero cuando ingreso uno como value = "$ {aws_lb_target_group.target-group [0] .arn}" dice que no es válido. Error sin valor clave a continuación:

Error: falta la clave de instancia de recurso

en modules \ targetgroups \ output.tf línea 2, en la salida "tg_example_beta": 2: value = "$ {aws_lb_target_group.target-group.arn}"

Debido a que aws_lb_target_group.target-group tiene configurado "for_each", se debe acceder a sus atributos en instancias específicas.

Por ejemplo, para correlacionar con los índices de un recurso de referencia, use: aws_lb_target_group.target-group [each.key]

Respuestas

1 Marcin Aug 28 2020 at 11:22

El aws_lb_target_group.target-groupgenerado será un mapa, con valores clave de targetgroup2y targetgroup1.

Por lo tanto, para obtener los detalles del grupo objetivo individual, puede hacer lo siguiente:

output "target-group1-arn" {
  value = aws_lb_target_group.target-group["targetgroup1"].arn
}

Para devolver ambos como mapa:

output "target-groups-arn-alternatice" {
  value = {for k, v in aws_lb_target_group.target-group: k => v.arn}
}
target-groups-arn-alternatice = {
  "targetgroup1" = "arn:aws:elasticloadbalancing:us-east-1:xxxx:targetgroup/example-example/285b26e15221b113"
  "targetgroup2" = "arn:aws:elasticloadbalancing:us-east-1:xxxx:targetgroup/example-example2/075bd58359e4c4b2"
}

Para devolver ambos como una lista (el orden será el mismo que para la keysfunción):

output "target-groups-arn" {
  value = values(aws_lb_target_group.target-group)[*].arn
}
target-groups-arn = [
  "arn:aws:elasticloadbalancing:us-east-1:xxxx:targetgroup/example-example/285b26e15221b113",
  "arn:aws:elasticloadbalancing:us-east-1:xxxx:targetgroup/example-example2/075bd58359e4c4b2",
]