Home > Enterprise >  Filter a map by two conditions in Terraform
Filter a map by two conditions in Terraform

Time:11-11

Having this input variable

variable "input_var"{
  type = map(object({
    str_attribute = string
    num_attribute = number
    sub_obj = optional(object({
      id = number
      other_property = string
    }))
  }))
}

How can I loop over all map elements and filter them while taking only the ones that complies to both sub_obj != null and id != 0? And how to make it a map where I keep both the original key and value?

I have tried several things but nothing usable. Latest iteration is:

for_each = [for k,v in var.input_var: tomap({k = v}) if v.sub_obj.id !=0]

This does not work first because if sub_obj is null an error occurs and I was unable to find any information about logical operators, like and in this case, such that I could use it as sub_obj != null and sub_obj.id !=0.

And second because it does not create a map, which makes sense as tomap would create a map from all objects added as arguments.

CodePudding user response:

To construct a map instead of a list you should use the constructor {}.

For a safe check on the value of var.input_var.sub_obj.id inequality with 0, you can use the coalesce (similar to null coalescing operators) or try functions.

Combining the two we arrive at:

# option one
for_each = { for k,v in var.input_var: k => v if coalesce(sub_obj.id, 0) != 0 }
# option two
for_each = { for k,v in var.input_var: k => v if try(sub_obj.id != 0, false) }
  • Related