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

Terraform如何基于key从list构成的map中过滤提取目标list

Terraform 按指定key提取map中list元素合并为新list的解决方案

你代码报错的核心原因是语法使用错误,并非for循环不支持操作list:

  • 你内层的for表达式使用了大括号{}包裹,Terraform会将其识别为map构造语句,必须提供key => value的配对规则,你仅写了value部分没有指定key,因此触发报错。
  • 你需要返回列表类型,因此内层for表达式应该用方括号[]包裹。

以下是两种可行的实现方案:

方案1:精简写法(无需调整元素属性时使用)

如果不需要修改/过滤原有list的元素属性,直接提取对应key的全部元素即可,代码如下:

locals {
  firewall_rules = ["first", "third"]
  firewall_rules_lookup = {
    "first" = [ { name ="rule1.1", start_ip="0.0.0.1" , end_ip = "0.0.0.2" },
                { name ="rule1.2", start_ip="0.0.0.4" , end_ip = "0.0.0.5" },
              ],
    "second"= [ { name ="rule2.1", start_ip="0.0.1.1" , end_ip = "0.0.1.2" } ],
    "third" = [ { name ="rule3.1", start_ip="0.0.3.1" , end_ip = "0.0.3.2" },
                { name ="rule3.2", start_ip="0.0.3.4" , end_ip = "0.0.3.5" },
              ]
  }
  fw_rules = flatten([
    for rule_name in local.firewall_rules : local.firewall_rules_lookup[rule_name]
  ])
}

注意:你原代码里firewall_rules_lookup多写了个type = map的冗余配置,Terraform会自动识别变量类型,不需要额外加这个属性,反而会导致类型报错,已经在上面的代码里删掉了。

方案2:带属性处理的写法(需要调整元素属性时使用)

如果你需要新增、修改或者过滤元素的属性,可以保留内层for循环,调整为列表构造语法即可:

fw_rules = flatten([
  for rule_name in local.firewall_rules : [
    for r in local.firewall_rules_lookup[rule_name] : {
      name = r.name
      start_ip = r.start_ip
      end_ip = r.end_ip
      # 可以在这里新增自定义属性,比如 description = "自定义规则 ${r.name}"
    }
  ]
])

两种方案输出的fw_rules都完全符合你期望的结果:

[
  {
    "end_ip" = "0.0.0.2"
    "name" = "rule1.1"
    "start_ip" = "0.0.0.1"
  },
  {
    "end_ip" = "0.0.0.5"
    "name" = "rule1.2"
    "start_ip" = "0.0.0.4"
  },
  {
    "end_ip" = "0.0.3.2"
    "name" = "rule3.1"
    "start_ip" = "0.0.3.1"
  },
  {
    "end_ip" = "0.0.3.5"
    "name" = "rule3.2"
    "start_ip" = "0.0.3.4"
  },
]

内容的提问来源于stack exchange,提问作者Kai Poitschke

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 19:57:01