每个资源的 for_each 循环的输出

Xza*_*ier 6 amazon-web-services terraform

我很难弄清楚如何为这段代码创建的每个目标组资源输出。我希望能够在其他模块中单独引用每一个。听起来 for_each 将其存储为地图,所以我的问题是如何获得 targetgroup1 和 targetgroup2 的 arn?Terraform 通常按资源名称指代输出,因此在这种情况下我正在努力解决这个问题,以及如何引用这些单独的 arn。我是否还需要将输出处理到 for_each 中,还是可以将其放入 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
  }
}
Run Code Online (Sandbox Code Playgroud)

我在没有键值的情况下尝试在 output.tf 文件中执行此操作时收到以下错误,但是当我输入诸如 value = "${aws_lb_target_group.target-group[0].arn}" 之类的值时,它说它无效。下面没有键值的错误:

错误:缺少资源实例键

在 modules\targetgroups\output.tf 第 2 行,在输出“tg_example_beta”中:2:value = “${aws_lb_target_group.target-group.arn}”

由于 aws_lb_target_group.target-group 设置了“for_each”,因此必须在特定实例上访问其属性。

例如,要与引用资源的索引相关联,请使用:aws_lb_target_group.target-group[each.key]

Mar*_*cin 12

aws_lb_target_group.target-group生成的将是一个图,用的键值targetgroup2targetgroup1

因此,要获取单个目标组的详细信息,您可以执行以下操作:

output "target-group1-arn" {
  value = aws_lb_target_group.target-group["targetgroup1"].arn
}
Run Code Online (Sandbox Code Playgroud)

要将两者都作为地图返回:

output "target-groups-arn-alternatice" {
  value = {for k, v in aws_lb_target_group.target-group: k => v.arn}
}
Run Code Online (Sandbox Code Playgroud)
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"
}
Run Code Online (Sandbox Code Playgroud)

将两者作为列表返回(顺序与keys函数相同):

output "target-groups-arn" {
  value = values(aws_lb_target_group.target-group)[*].arn
}
Run Code Online (Sandbox Code Playgroud)
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",
]
Run Code Online (Sandbox Code Playgroud)

  • 多么完整、清晰的答案啊!工作完美。 (2认同)
  • @Mamun 谢谢你:-) (2认同)