Terraform - iterasi di atas peta bersarang
Saya mencoba membuat pengikatan IAM untuk kumpulan data Bigquery menggunakan sumber daya - google_bigquery_dataset_iam_binding. Persyaratannya adalah saya membaca parameter dalam sumber daya ini (dataset_id, peran, anggota) menggunakan variabel dari struktur berikut -
bq_iam_role_bindings = {
"member1" = {
"dataset1" : ["role1","role2", "role5"],
"dataset2" : ["role3","role2"],
},
"member2" = {
"dataset3" : ["role1","role4"],
"dataset2" : ["role5"],
}
}
Jadi, saya perlu mengulang variabel ini dan mendapatkan peran yang ditetapkan pada kumpulan data untuk setiap anggota. Di sini sumber daya total yang dibuat akan menjadi delapan (untuk setiap anggota, setiap kumpulan data dan setiap peran). Saya baru mengenal terraform dan hanya memahami cara menerapkan loop for sederhana di atas map dan loop for_each di sumber daya. Ingin memahami bagaimana mungkin apa yang saya coba lakukan.
Ini adalah yang terdekat yang saya temukan - Peta di dalam peta di variabel terraform tempat saya dapat membaca nilai di peta bersarang tetapi saya perlu mengekstrak kunci juga dalam kasus saya. Adakah yang bisa membantu di sini.
Jawaban
Anda dapat mengaturnya kembali menjadi for_each
daftar objek yang lebih ramah dan menyimpannya di tempat lokal helper_list
.
Sebagai contoh:
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}
]])
])
}
yang akan menghasilkan helper_list
berupa:
[
{
"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"
},
]
Formulir di atas jauh lebih mudah untuk dikerjakan for_each
, misalnya:
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
]
}