1

Let's say I have the following local local:

locals {
  domains = [
    "site01.example.com",
    "site02.example.com",
  ]
}

For each domain a certificate is being created, which returns DNS validation options:

resource "aws_acm_certificate" "lps-certificate" {
  for_each = local.domains

  ...
}

So far I am able to create the following local:

locals {
  records = {
    for domain in local.domains : domain => {
      for dvo in aws_acm_certificate.lps-certificate[domain].domain_validation_options : dvo.domain_name => {
        name = dvo.resource_record_name
        record = dvo.resource_record_value
        type = dvo.resource_record_type
      }
    }
  }
}

Which returns:

{
       site01.example.com = {
           *.site01.example.com = {
               name   = (known after apply)
               record = (known after apply)
               type   = (known after apply)
            }
           site01.example.com   = {
               name   = (known after apply)
               record = (known after apply)
               type   = (known after apply)
            }
        }
       site02.example.com = {
           *.site02.example.com = {
               name   = (known after apply)
               record = (known after apply)
               type   = (known after apply)
            }
           site02.example.com   = {
               name   = (known after apply)
               record = (known after apply)
               type   = (known after apply)
            }
        }
    }

Is there any way to make it look like this:

{
           *.site01.example.com = {
               name   = (known after apply)
               record = (known after apply)
               type   = (known after apply)
            }
           site01.example.com   = {
               name   = (known after apply)
               record = (known after apply)
               type   = (known after apply)
            }
           *.site02.example.com = {
               name   = (known after apply)
               record = (known after apply)
               type   = (known after apply)
            }
           site02.example.com   = {
               name   = (known after apply)
               record = (known after apply)
               type   = (known after apply)
            }
    }
Marcin
  • 215,873
  • 14
  • 235
  • 294
Nikita Zernov
  • 5,465
  • 6
  • 39
  • 70

1 Answers1

4

Unless I misunderstand the issue, the form you wish to obtain can be generated using values, merge and argument expanding:

merge(values(local.records)...)

I don't have your data structures, so I tested as follows:

variable "records" {

    default = {
       "site01.example.com" = {
           "*.site01.example.com" = {
               name   = "(known after apply)"
               record = "(known after apply)"
               type   = "(known after apply)"
            }
           "site01.example.com"   = {
               name   = "(known after apply)"
               record = "(known after apply)"
               type   = "(known after apply)"
            }
        }
       "site02.example.com" = {
           "*.site02.example.com" = {
               name   = "(known after apply)"
               record = "(known after apply)"
               type   = "(known after apply)"
            }
           "site02.example.com"   = {
               name   = "(known after apply)"
               record = "(known after apply)"
               type   = "(known after apply)"
            }
        }
     }
  }



output "test" {
    value = merge(values(var.records)...)
}

The outcome is (order is different, but I hope it does not matter):

test = {
  "*.site01.example.com" = {
    "name" = "(known after apply)"
    "record" = "(known after apply)"
    "type" = "(known after apply)"
  }
  "*.site02.example.com" = {
    "name" = "(known after apply)"
    "record" = "(known after apply)"
    "type" = "(known after apply)"
  }
  "site01.example.com" = {
    "name" = "(known after apply)"
    "record" = "(known after apply)"
    "type" = "(known after apply)"
  }
  "site02.example.com" = {
    "name" = "(known after apply)"
    "record" = "(known after apply)"
    "type" = "(known after apply)"
  }
}

Liam
  • 27,717
  • 28
  • 128
  • 190
Marcin
  • 215,873
  • 14
  • 235
  • 294