在Terraform中如何使用列表嵌套列表映射并访问子网资源?
如何在Terraform中正确访问嵌套结构的子网列表?
首先,你之前的写法存在语法小问题,Terraform里访问映射(map)的动态键时,不需要混用点语法和方括号,直接用方括号包裹键名即可,而且terraform.workspace本身就是字符串类型,不需要额外套插值语法。
正确的访问方式
假设你要获取rest模块下当前工作区对应的子网,这里有两种靠谱的写法:
- 使用
element函数(兼容旧版本Terraform):
element(var.segmented_subnets.rest[terraform.workspace], count.index)
- 直接用列表索引(Terraform 0.12+推荐写法,更直观):
var.segmented_subnets.rest[terraform.workspace][count.index]
示例说明
比如当前工作区是dev时,var.segmented_subnets.rest[terraform.workspace]会直接返回["subnet-a", "subnet-b"]这个子网列表,再通过count.index就能拿到对应位置的子网ID。
额外注意事项
- 要保证
terraform.workspace的取值(比如dev、qa)和你变量里定义的环境键完全匹配,不然会出现键不存在的错误。如果需要容错,可以搭配lookup函数:
lookup(var.segmented_subnets.rest, terraform.workspace, [])[count.index]
不过要注意,要是工作区没有对应子网列表,这个写法会返回空列表,此时访问索引会报错,需要提前做判断处理。
- 如果你的Terraform版本是1.x+,且子网数量不固定,用
for_each遍历列表可能比count更灵活,能避免因列表长度变化导致资源重建的问题。
内容的提问来源于stack exchange,提问作者maathor
相关产品推荐
相关产品推荐

