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
相关产品推荐
相关产品推荐

