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

