Output dal ciclo for_each per ogni risorsa

Aug 28 2020

Ho difficoltà a capire come creare un output per ciascuna risorsa del gruppo target creata da questo codice. Mi piacerebbe poter fare riferimento a ciascuno individualmente in altri moduli. Sembra che for_each lo memorizzi come una mappa, quindi la mia domanda è come potrei ottenere l'arn per targetgroup1 e targetgroup2? Terraform si riferisce normalmente agli output in base al nome della risorsa, quindi sto lottando con questo in questo scenario e anche su come fare riferimento a questi singoli arn. Avrei anche bisogno di lavorare gli output nel for_each o potrei rilasciarlo nel file 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
  }
}

Ricevo il seguente errore quando provo a farlo nel file output.tf senza un valore chiave, ma quando ne immetto uno come value = "$ {aws_lb_target_group.target-group [0] .arn}" dice che non è valido. Errore senza valore chiave di seguito:

Errore: chiave di istanza della risorsa mancante

sui moduli \ targetgroups \ output.tf riga 2, nell'output "tg_example_beta": 2: value = "$ {aws_lb_target_group.target-group.arn}"

Poiché aws_lb_target_group.target-group ha impostato "for_each", è necessario accedere ai suoi attributi su istanze specifiche.

Ad esempio, per correlare con gli indici di una risorsa di riferimento, utilizza: aws_lb_target_group.target-group [each.key]

Risposte

1 Marcin Aug 28 2020 at 11:22

La mappa aws_lb_target_group.target-groupgenerata sarà una mappa, con valori chiave di targetgroup2e targetgroup1.

Pertanto, per ottenere i dettagli del singolo gruppo target puoi fare:

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

Per restituirli entrambi come mappa:

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"
}

Per restituirli entrambi come elenco (l'ordine sarà lo stesso della keysfunzione):

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