Terraform如何收集for_each子模块输出拼接为AWS网卡private_ips列表
问题根因
- 你使用
for_each创建的module.instance是map类型的对象集合,不是列表,[*]splat 表达式仅适用于列表/ tuple 类型,对map类型使用不会返回预期的属性列表,因此第一次写法触发类型错误。 - 第二次的for表达式逻辑错误:遍历对象、判断条件完全不符合取值逻辑,因此取不到值。
方案1:直接从JSON文件提取(推荐,不依赖子模块输出)
firewall_vip本身就定义在你的JSON配置里,不需要等子模块创建完成就能拿到值,plan阶段即可校验合法性,是最优方案,符合你提到的简化需求。
修改aws_network_interface的private_ips配置如下:
resource "aws_network_interface" "firewall" { subnet_id = <你的subnet ID> private_ips = concat( ["10.0.0.4", "10.0.0.5"], [for instance_conf in local.json_data : instance_conf.firewall_vip] ) }
方案2:从子模块输出取值的正确写法
如果你确实需要从子模块的输出获取该值(比如子模块内有对firewall_vip的自定义修改逻辑),正确的for表达式写法如下:
resource "aws_network_interface" "firewall" { subnet_id = <你的subnet ID> private_ips = concat( ["10.0.0.4", "10.0.0.5"], [for _, mod in module.instance : mod.firewall_vip] ) }
这里直接遍历module.instance这个map,_代表忽略map的key,直接取每个子模块对象的firewall_vip输出属性,即可得到符合要求的字符串列表。
内容的提问来源于stack exchange,提问作者ShaneC
相关产品推荐
相关产品推荐

