2 min read | by Jordi Prats
Let's imagine we have the following data structure:
locals { queries = [ { query = "SELECT version()" engine = "postgresql" }, { query = "SELECT * FROM v$version" engine = "oracle" }, (...) ] }
If we want to use just some of the items on a resource we can use for_each through the resulting array of filtering the objects using a for:
for_each = [ for item in local.queries: item if item.engine == "postgresql" ]
The problem is that terraform won't allow you to use a tuple of elements on a for_each:
│ Error: Invalid for_each argument │ │ on main.tf line 75, in resource "null_resource" "sql_apply": │ 75: for_each = [ for item in local.queries: item if item.engine == "postgresql" ] │ ├──────────────── │ │ local.queries is tuple with 10 elements │ │ The given "for_each" argument value is unsuitable: the "for_each" argument must be a map, or set of strings, and you have provided a value of type tuple.
To be able to workaround this we can create an ad-hoc map with the object we want to use:
for_each = { for item in local.queries: item.query => item if item.engine == "postgresql" }
The only consideration to make is that the selected key (on the example item.query) must be unique
Posted on 22/06/2021