Saídas do loop for_each para cada recurso

Aug 28 2020

Estou tendo dificuldade em descobrir como fazer uma saída para cada recurso de grupo-alvo que este código cria. Eu gostaria de poder fazer referência a cada um individualmente em outros módulos. Parece que for_each o armazena como um mapa, então minha pergunta é como eu obteria o arn para targetgroup1 e targetgroup2? O Terraform normalmente se refere a saídas por nome de recurso, então estou lutando com isso neste cenário e também como me referir a esses arns individuais. Eu também precisaria trabalhar as saídas em for_each ou poderia soltá-lo no arquivo 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
  }
}

Recebo o seguinte erro ao tentar fazer isso no arquivo output.tf sem um valor de chave, mas quando insiro um, como value = "$ {aws_lb_target_group.target-group [0] .arn}", ele diz que é inválido. Erro sem valor-chave abaixo:

Erro: chave de instância de recurso ausente

em modules \ targetgroups \ output.tf linha 2, na saída "tg_example_beta": 2: value = "$ {aws_lb_target_group.target-group.arn}"

Como aws_lb_target_group.target-group tem "for_each" definido, seus atributos devem ser acessados ​​em instâncias específicas.

Por exemplo, para correlacionar com os índices de um recurso de referência, use: aws_lb_target_group.target-group [each.key]

Respostas

1 Marcin Aug 28 2020 at 11:22

O aws_lb_target_group.target-groupgerado será um mapa, com valores-chave de targetgroup2e targetgroup1.

Portanto, para obter os detalhes individuais do grupo-alvo, você pode fazer:

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

Para retornar ambos como um 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 retornar ambos como uma lista (a ordem será a mesma da keysfunção):

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",
]