Terraform: using for_each and lookup/try to retrieve key of a map in a map

33 Views Asked by At

In Terraform/Terragrunt (most recent versions), I would like to add certain tags (in my example are called: Customer and Platform) taken from a variable (var.s3_bucket_configuration) for a resource (in this case an s3 bucket).
The s3 module looks like this:

resource "aws_s3_bucket" "this" {
  for_each      = var.s3_bucket_configuration
  bucket        = format("%s%s%s", var.s3_bucket_name_prefix, var.prefix_separator, each.key)
  force_destroy = var.force_destroy
  tags = merge(
    var.tags,
    { Name = format("%s%s%s", var.s3_bucket_name_prefix, var.prefix_separator, each.key) },
# This below is the part I am looking a solution for:
    { Platform = lookup(each.value, "Platform","") },
    { Customer = lookup(each.value, "Customer","") }
  )
}

When var.s3_bucket_configuration looks like this (it is obtained from some .json files but this is not relevant):

#from terraform/terragrunt console
> var.s3_bucket_configuration
{
  "bucket_1" = {
    "acl" = "log-delivery-write"
  }
  "bucket_2" = {
    "description" = "Description bucket_2"
    "mfa_delete_enabled" = false
    "object_ownership" = "BucketOwnerEnforced"
    "sse_algorithm" = "AES256"
    "versioning_enabled" = false
    #tags
    "Customer" = "Customer_bucket_2"
    "Platform" = "Platform_bucket_2"

the terraform plan outputs as expected. I mean the tags "Customer" and "Platform" are added:

  # aws_s3_bucket.this["bucket_2"] will be created
  + resource "aws_s3_bucket" "this" {
      + acceleration_status         = (known after apply)
      + acl                         = (known after apply)
      + arn                         = (known after apply)
      + bucket                      = "bucket_5"
      + bucket_domain_name          = (known after apply)
      + bucket_regional_domain_name = (known after apply)
      + force_destroy               = false
      + tags                        = {
          + "Confidentiality" = "C3"
          + "Customer"        = "Customer_bucket_2"
          + "Environment"     = "PREPROD"
          + "Name"            = "bucket_2"
          + "Platform"        = "Platform_bucket_2"
        }
      + tags_all                    = (known after apply)
      + website_domain              = (known after apply)
      + website_endpoint            = (known after apply)
    }

But I made var.s3_bucket_configuration look like this below (I added the desired key tags, Customer and Platform, in a map so one can tell they are tags):

> var.s3_bucket_configuration
{
  "bucket_1" = {
    "acl" = "log-delivery-write"
  }
  "bucket_2" = {
    "description" = "Description bucket_2"
    "mfa_delete_enabled" = false
    "object_ownership" = "BucketOwnerEnforced"
    "sse_algorithm" = "AES256"
    "versioning_enabled" = false
    "tag" = {
      "Customer" = "Customer_bucket_2"
      "Platform" = "Platform_bucket_2"
       }
  }
}

I am stuck on how to modify this part of the resource module so it can add the tags from a map in a map.

    { Platform = lookup(each.value, "Platform","") },
    { Customer = lookup(each.value, "Customer","") }

Thank you.

0

There are 0 best solutions below