Saídas do loop for_each para cada recurso
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
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",
]