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

Terraform动态块中for_each与iterator的使用问题排查

问题分析与修复方案

嘿,我一眼就看出问题出在哪了!你在dynamic块里自定义了迭代器名称lb之后,错误地把迭代器变量直接当成了列表里的LB资源对象来访问arn属性,但实际上Terraform的dynamic块迭代器是一个包含key和value的对象,你得通过.value才能拿到真正的资源对象。

具体来说:

  • 当你在dynamic块里设置iterator = lb时,lb这个变量并不是直接对应[module.california.lb, module.oregon.lb]里的单个LB资源,而是一个迭代器对象——它的key是列表元素的索引(比如"0"、"1"),value才是你要的LB资源实例。
  • 你之前写静态块的时候直接用module.california.lb.arn是对的,因为这里的module.california.lb就是输出的完整LB资源对象,本身就有arn属性。

把代码改成下面这样就能正常运行了:

module "california" { 
  source = "./themodule" 
  # ... 
} 
module "oregon" { 
  source = "./themodule" 
  # ... 
} 
resource "aws_globalaccelerator_endpoint_group" "world" { 
  # ... 
  dynamic "endpoint_configuration" { 
    for_each = [ module.california.lb, module.oregon.lb ] 
    iterator = lb 
    content { 
      endpoint_id = lb.value.arn  # 关键修改:加上.value
      weight = 100 
    } 
  } 
}

如果你不想自定义迭代器名称,也可以用dynamic块默认的迭代器变量(就是块的名称endpoint_configuration),代码会更简洁一点:

dynamic "endpoint_configuration" {
  for_each = [ module.california.lb, module.oregon.lb ]
  content {
    endpoint_id = endpoint_configuration.value.arn
    weight = 100
  }
}

总结一下:Terraform的dynamic块迭代器不管遍历的是列表还是映射,都会把每个元素包装成带key和value的对象,所以一定要通过.value来访问实际的元素属性,别直接用迭代器变量去访问资源的属性哦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:32:29