Terraform - iterate over nested map

I am trying to create IAM binding for Bigquery dataset using the resource - google_bigquery_dataset_iam_binding. The requirement is I read the parameters in this resource (dataset_id, role, members) using a variable of the following structure -

 bq_iam_role_bindings = { "member1" = { "dataset1" : ["role1","role2", "role5"], "dataset2" : ["role3","role2"], }, "member2" = { "dataset3" : ["role1","role4"], "dataset2" : ["role5"], } } 

So, I need to loop over this variable and get the roles assigned on a dataset for each member. Here total resources created would be eight (for each member, each dataset and each role). I am new to terraform and understand only how to apply simple for loop over a map and for_each loop in a resource. Want to understand how is it possible what I am trying to do.

This is the nearest what I have found - Map within a map in terraform variables where I can read the value in a nested map but I need to extract key also in my case. Can anyone help here please.

4

1 Answer

You could re-organize it into more for_each friendly list of objects and store it in a local helper_list.

For example:

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} ]]) ]) } 

which will result in helper_list in the form of:

[ { "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" }, ] 

The above form is much easier to work with for_each, e.g.:

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 ] } 
3

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like