Terraform 0.14.3 模块for_each场景下访问NIC输出ID报错解决
批量调用Terraform模块取输出时报Unsupported attribute的解决方法
报错根因
当你给模块调用添加for_each参数做批量部署时,Terraform会将整个module.<模块名>的返回结构做嵌套封装:
- 如果是不带
for_each/count的单实例模块调用,module.NIC会直接平铺暴露所有子模块定义的输出属性,可以直接通过module.NIC.nic_id取值 - 一旦加上批量迭代参数(本例中的
for_each = var.nics),module.NIC就会变成嵌套对象:一级属性为for_each迭代时使用的键(本例中就是nic1),每个键对应的取值,是该实例下模块自身定义的所有输出对象
所以此时直接写module.NIC.nic_id自然会触发属性不存在的报错。
具体修改方案
1. 调整输出的遍历逻辑
遍历的起点要对准所有模块实例的一级属性,直接从每个实例的输出中取值即可:
错误示例(原报错代码):
output "nic_ids" { value = [for k in module.NIC.nic_id : k.id] }
正确写法:
output "nic_ids" { value = [for instance in module.NIC : instance.nic_id] }
注意:你在NIC子模块中定义的
nic_id输出已经直接返回了NIC资源的ID字符串,不需要再额外取.id属性,否则会触发“字符串类型没有id属性”的新报错。
2. 用splat表达式简化取值
如果不需要自定义遍历逻辑,可以直接使用Terraform的splat语法展开所有模块实例的输出,该写法在Terraform 0.14.3版本下完全兼容:
output "nic_ids" { value = module.NIC[*].nic_id }
最终返回的就是所有批量创建的NIC ID组成的列表。
(可选)结构调试方法
如果不确定模块返回的实际结构,可以临时加一个调试输出,在执行terraform plan时直接查看真实结构:
output "debug_module_structure" { value = module.NIC }
执行计划时就能看到和报错提示匹配的结构:{ nic1 = { nic_id = "对应NIC的资源ID字符串" } }。
内容的提问来源于stack exchange,提问作者Jolly Molly
相关产品推荐
相关产品推荐

