marcus
marcus

Reputation: 13

Access variable in nested map with for_each

I have local variable:

locals {
  bucket = {
    firstBucket = {
      sse = true
      lifecycle_rules = [
        {
          id      = "firstBucket"
          enabled = true
          expiration = {
            days = 7
          }
        }
      ]
    }
    secondBucket = {
      sse = false
      lifecycle_rules = [
        {
          id      = "secondBucket"
          enabled = true
          expiration = {
            days = 7
          }
        }
      ]
    }
  }
}

I want first bucket to be encrypted (sse=true) and the second one should be encrypted (sse=false) Then I try to create two s3 buckets using module. I want to use sse field defined in a local variable to set security options:

module "gitlab_bucket" {
for_each = local.bucket
/* some stuff */

server_side_encryption_configuration = lookup(each.value, "sse", null) ? var.security_cofig : {}
}

But it returns error The given key does not identify an element in this collection value

Upvotes: 0

Views: 1947

Answers (1)

Technowise
Technowise

Reputation: 1357

The syntax seems okay, but the default value(when sse attribute is missing) will have to be a boolean value (either true or false, so can't be null) for conditional expression.

I tested the below code in terraform 13.5, and it gave the expected result.

 locals {
  bucket = {
    firstBucket = {
      sse = true
      lifecycle_rules = [
        {
          id      = "firstBucket"
          enabled = true
          expiration = {
            days = 7
          }
        }
      ]
    }
    secondBucket = {
      #sse = false
      lifecycle_rules = [
        {
          id      = "secondBucket"
          enabled = true
          expiration = {
            days = 7
          }
        }
      ]
    }
  }
}

resource "random_pet" "example" {
  for_each = local.bucket
  keepers = {
    sse = lookup(each.value, "sse", false) ? jsonencode({x = "yes"}) : jsonencode({})
  }
}

Below was the plan result:

An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # random_pet.example["firstBucket"] will be created
  + resource "random_pet" "example" {
      + id        = (known after apply)
      + keepers   = {
          + "sse" = jsonencode(
                {
                  + x = "yes"
                }
            )
        }
      + length    = 2
      + separator = "-"
    }

  # random_pet.example["secondBucket"] will be created
  + resource "random_pet" "example" {
      + id        = (known after apply)
      + keepers   = {
          + "sse" = jsonencode({})
        }
      + length    = 2
      + separator = "-"
    }

Plan: 2 to add, 0 to change, 0 to destroy.

Upvotes: 1

Related Questions