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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:57:04