You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform如何在其他资源中选取for_each生成的特定目标组值

Terraform 选取for_each生成的特定资源实例方法

核心思路

for_each创建的资源会返回一个map类型的集合,key是你传入的for_each变量的key,value是对应资源实例的所有属性,你可以直接索引或者过滤这个map拿到你需要的特定实例属性。

具体实现方案

  • 方案1:已知目标组对应var.target_group中的key,直接索引取值
    如果你的var.target_group变量中,对应7776端口的目标组的key是service_7776,直接写:
target_group_arn = aws_lb_target_group.target_group["service_7776"].arn

这种方式最稳定,只要你不修改var.target_group的key就不会出问题。

  • 方案2:按资源属性过滤(适合不知道key,只知道目标组的端口/名称等属性的场景)
    用for表达式过滤目标组集合,取匹配到的第一个实例的ARN即可:
# 按目标组名称匹配
target_group_arn = [for tg in aws_lb_target_group.target_group : tg.arn if tg.name == "TG-EX-DEV-7776"][0]
# 也可以按端口匹配
# target_group_arn = [for tg in aws_lb_target_group.target_group : tg.arn if tg.port == 7776][0]

末尾加[0]是为了把过滤得到的单元素列表转为单个字符串值,符合参数要求。

  • 方案3:随便取第一个目标组(无指定要求的场景)
    把资源map转为列表后取第一个元素:
target_group_arn = tolist(aws_lb_target_group.target_group)[0].arn

注意这个方案不推荐用于生产环境,因为如果后续var.target_group的元素增减,第一个元素可能会发生变化,导致监听器绑定的目标组意外变更。

完整监听器配置示例

resource "aws_lb_listener" "forward_443" {
  default_action {
    target_group_arn = [for tg in aws_lb_target_group.target_group : tg.arn if tg.port == 7776][0]
    type             = "forward"
  }

  load_balancer_arn = aws_lb.lb.arn
  port              = 443
  protocol          = "HTTPS"
  ssl_policy        = "ELBSecurityPolicy-FS-1-2-Res-2020-10"
  certificate_arn   = aws_acm_certificate.cert.arn
}

你之前的写法错误原因是:each变量只有在当前资源声明了count或者for_each时才会生效,你的监听器只需要创建1个,不需要加count/for_each,所以直接过滤目标组集合即可。

内容的提问来源于stack exchange,提问作者Rio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:00:04