如何在Terraform中按双条件过滤Map并保留原键值对
Terraform Map筛选:保留符合条件的键值对
问题背景
现有变量定义如下:
variable "input_var"{ type = map(object({ str_attribute = string num_attribute = number sub_obj = optional(object({ id = number other_property = string })) })) }
需要遍历该Map,筛选出同时满足sub_obj != null和sub_obj.id != 0的元素,生成保留原键和值的新Map。
正确实现代码
直接使用Terraform的Map类型for表达式即可完成需求,同时通过短路逻辑避免null访问报错:
filtered_input = { for k, v in var.input_var : k => v if v.sub_obj != null && v.sub_obj.id != 0 }
关键说明
- 短路逻辑避免报错:
Terraform的&&运算符是短路执行的——如果v.sub_obj != null不成立,后面的v.sub_obj.id != 0不会被执行,完美避免了null时访问属性的错误。 - 直接生成Map:
使用{for k, v in ... : k => v if ...}的语法,会直接生成一个新Map,键和值完全沿用原Map中符合条件的元素,不需要额外转换。
原尝试代码的问题分析
你之前的代码存在两个核心问题:
- 列表推导而非Map推导:使用
[for ...]生成的是列表而非Map,即使嵌套tomap({k = v}),最终得到的也是包含多个小Map的列表,不是目标的单个Map。 - 未处理null情况:直接访问
v.sub_obj.id,当sub_obj为null时会触发属性访问错误,必须先判断sub_obj不为null。
内容的提问来源于stack exchange,提问作者codiac
相关产品推荐
相关产品推荐

