如何在Terraform中引用for_each模块的输出至另一模块?
Terraform跨模块for_each资源关联:Target Group与Listener Rule自动绑定
要实现for_each创建的Target Group和Listener Rule模块1:1自动关联,核心是利用两个模块for_each的键名对应关系,直接从Target Group模块的输出中按键取值,替代手动输入ARN。具体步骤如下:
1. 确保Target Group模块输出ARN
首先在你的aws_lb_target_group模块代码中,添加ARN的输出(如果还没加的话):
output "target_group_arn" { description = "目标组的ARN" value = aws_lb_target_group.this.arn }
注:这里假设模块内的Target Group资源名为aws_lb_target_group.this,如果你的模块里资源名不同,替换成实际名称即可。
2. 修改Listener Rule模块的引用逻辑
调整Listener Rule模块中listener_rule_target_group的取值方式,通过each.key关联到对应的Target Group实例:
module "aws_alb_listener_rule_ui" { source = "../../terraform/modules/aws_lb_listener_rule_https" listener_rule = module.aws_alb_listener_ui_https.ui_lb_listener for_each = var.ui_https_listener_rules listener_rule_host_header = each.value["values"] # 关键:通过each.key匹配对应的Target Group实例,自动获取ARN listener_rule_target_group = module.aws_lb_target_group_ui[each.key].target_group_arn listener_rule_action_type = var.ui_https_listener_rule_action_type }
另外可以去掉depends_on,Terraform会自动通过资源引用关系推断依赖顺序,手动指定反而可能隐藏潜在问题。
3. 简化tfvars配置
既然不需要手动输入ARN,直接删掉ui_https_listener_rules里的target_group字段:
ui_https_listener_rule_action_type = "forward" ui_https_listener_rules = { Application1 = { values = ["Host_Header_1"] }, Application2 = { values = ["Host_Header_2"] }, }
补充说明
如果你的Target Group和Listener Rule的for_each键名不一致,可以在ui_https_listener_rules里新增一个字段(比如target_group_key)来指定对应Target Group的键,示例如下:
调整后的tfvars
ui_https_listener_rules = { Rule1 = { values = ["Host_Header_1"] target_group_key = "Application1" }, Rule2 = { values = ["Host_Header_2"] target_group_key = "Application2" }, }
对应的Listener Rule模块引用
listener_rule_target_group = module.aws_lb_target_group_ui[each.value.target_group_key].target_group_arn
内容的提问来源于stack exchange,提问作者rufus49
相关产品推荐
相关产品推荐

