The terraform documentation states the ...
syntax as (grouping mode*. See:
Grouping-Results
Show archive.org snapshot
).
But this seems not the be the whole truth. Instead the ...
syntax behaves like Go's Ellipsis expression which is used to pass a list as multiple parameters to a
Variadic Function
Show archive.org snapshot
.
You can use this behavior for example if you want to merge a list
of maps
into one map:
locals {
list_of_maps = [
{
"key1" = "value1"
"key2" = "value2"
},
{
"key2" = "new_value2"
"key3" = "value3"
},
{
"key4" = "value4"
}
]
merged_map = merge(
[for map_item in local.list_of_maps: map_item]...
)
}
output "merged_map" {
value = local.merged_map
}
Note
This only works when a
for
expression is used. You can't usemerged_map = merge(local.list_of_maps...)
because the grouping mode is only available forfor
expressions.
This can be especially useful when creating data structures in loops:
users = {
users = {
"Bob.Bobster" = {
name = {
given_name = "Bob"
family_name = "Bobster"
}
email = "bob.bobster@foobaringen.com"
group_memberships = ["GlobalAdministrators"]
},
"Alice.Charles" = {
name = {
given_name = "Alice"
family_name = "Charles"
}
email = "alice.charles@foobaringen.com"
group_memberships = ["GlobalAdministrators"]
},
}
group_memberships = merge([
for user, user_config in var.users : {
for group in user_config.group_memberships :
"${user}_${group}" => {
user_id = aws_identitystore_user.this[user].user_id
group_id = aws_identitystore_group.this[group].group_id
}
}
]...)