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