首页 > 解决方案 > 嵌套对象上的 Terraform 循环

问题描述

假设我有以下本地本地:

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

正在为每个域创建一个证书,该证书返回 DNS 验证选项:

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

  ...
}

到目前为止,我能够创建以下本地:

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

返回:

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

有没有办法让它看起来像这样:

{
           *.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)
            }
    }

标签: amazon-web-servicesterraformhcl

解决方案


除非我误解了这个问题,否则您希望获得的表格可以使用values,merge参数扩展生成:

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

我没有你的数据结构,所以我测试如下:

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

结果是(顺序不同,但我希望没关系):

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


推荐阅读