Terraform: iterar sobre un mapa anidado
Estoy intentando crear un enlace de IAM para el conjunto de datos de Bigquery usando el recurso - google_bigquery_dataset_iam_binding. El requisito es que lea los parámetros en este recurso (dataset_id, rol, miembros) usando una variable de la siguiente estructura:
bq_iam_role_bindings = {
"member1" = {
"dataset1" : ["role1","role2", "role5"],
"dataset2" : ["role3","role2"],
},
"member2" = {
"dataset3" : ["role1","role4"],
"dataset2" : ["role5"],
}
}
Entonces, necesito recorrer esta variable y obtener los roles asignados en un conjunto de datos para cada miembro. Aquí los recursos totales creados serían ocho (para cada miembro, cada conjunto de datos y cada rol). Soy nuevo en terraform y solo entiendo cómo aplicar un bucle for simple en un mapa y un bucle for_each en un recurso. Quiero entender cómo es posible lo que estoy tratando de hacer.
Esto es lo más cercano a lo que he encontrado: mapa dentro de un mapa en variables de terraform donde puedo leer el valor en un mapa anidado, pero también necesito extraer la clave en mi caso. ¿Alguien puede ayudar aquí por favor?
Respuestas
Puede reorganizarlo en for_each
una lista más amigable de objetos y almacenarlo en un local helper_list
.
Por ejemplo:
variable "bq_iam_role_bindings" {
default = {
"member1" = {
"dataset1" : ["role1","role2", "role5"],
"dataset2" : ["role3","role2"],
},
"member2" = {
"dataset3" : ["role1","role4"],
"dataset2" : ["role5"],
}
}
}
locals {
helper_list = flatten([for member, value in var.bq_iam_role_bindings:
flatten([for dataset, roles in value:
[for role in roles:
{"member" = member
"dataset" = dataset
"role" = role}
]])
])
}
que resultará helper_list
en la forma de:
[
{
"dataset" = "dataset1"
"member" = "member1"
"role" = "role1"
},
{
"dataset" = "dataset1"
"member" = "member1"
"role" = "role2"
},
{
"dataset" = "dataset1"
"member" = "member1"
"role" = "role5"
},
{
"dataset" = "dataset2"
"member" = "member1"
"role" = "role3"
},
{
"dataset" = "dataset2"
"member" = "member1"
"role" = "role2"
},
{
"dataset" = "dataset2"
"member" = "member2"
"role" = "role5"
},
{
"dataset" = "dataset3"
"member" = "member2"
"role" = "role1"
},
{
"dataset" = "dataset3"
"member" = "member2"
"role" = "role4"
},
]
Es mucho más fácil trabajar con el formulario anterior for_each
, por ejemplo:
resource "google_bigquery_dataset_iam_binding" "reader" {
for_each = { for idx, record in local.helper_list : idx => record }
dataset_id = each.value.dataset
role = each.value.role
members = [
each.value.member
]
}