Terraform创建LB Target Group Attachment时for_each资源依赖报错求助
解决Terraform Target Group Attachment的for_each依赖报错
问题根源
报错核心原因是for_each引用了仅在apply阶段才能生成的资源属性(aws_instance.web_servers.id),Terraform在plan阶段无法提前预测要创建的attachment实例数量,因此抛出错误。
解决方案
重构本地变量和资源定义,用plan阶段已知的实例count索引代替实例ID作为for_each的键,彻底规避对apply阶段属性的依赖。
修改后的本地变量
locals { tg_attachments = flatten([ for tg in var.lb : [ for idx, instance in aws_instance.web_servers : { tg_name = tg.tg_name tg_port = tg.listener_port tg_protocol = tg.protocol instance_idx = idx # 用实例的count索引替代ID,plan阶段即可确定 } ] ]) }
修改后的Target Group Attachment资源
resource "aws_lb_target_group_attachment" "ws_tg_attachement" { depends_on = [ time_sleep.wait_30_seconds, aws_lb_listener.listener, aws_instance.web_servers, aws_lb_target_group.tg ] # 用已知的tg名称、端口和实例索引生成唯一键,plan阶段可确定实例数量 for_each = { for entry in local.tg_attachments: "${entry.tg_name}-${entry.tg_port}-instance-${entry.instance_idx}" => entry } target_group_arn = aws_lb_target_group.tg["${each.value.tg_name}-${each.value.tg_port}"].arn # 通过索引间接获取实例ID,避免直接引用apply阶段属性 target_id = aws_instance.web_servers[each.value.instance_idx].id port = each.value.tg_port }
原理说明
count创建的实例,其索引(idx)在plan阶段就是确定值,用它作为for_each键的一部分,Terraform能提前计算出要创建的attachment实例总数。- 实例ID通过索引间接获取,既满足了资源关联需求,又彻底解决了
for_each依赖apply阶段属性的问题。
内容的提问来源于stack exchange,提问作者naeem
相关产品推荐
相关产品推荐

