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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:35:58