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
相关产品推荐
相关产品推荐

