terraform 从 yaml 创建列表以用于 subject_alternative_names

terraform create list from yaml to be used in subject_alternative_names

我有这个 yaml 结构,我需要 terraform 来放置 apex_name 并将每个记录条目存储在一个列表中,然后我可以用它来创建一个 san 证书。我如何才能将此列表设为 subject_alternative_names 的平面列表?非常感谢任何帮助。

source_domains:
  - apex_name: elastic2ls.com
    records:
      - elastic2ls.com
      - www.elastic2ls.com
  - apex_name: elastic2ls.ch
    records:
    - elastic2ls.ch
    - www.elastic2ls.ch
    - image.elastic2ls.ch
    - m.elastic2ls.ch
    - static.elastic2ls.ch
resource "aws_acm_certificate" "cert" {
  for_each = var.subdomains
  provider          = aws.certificate_region
  domain_name       = var.target_domain
  subject_alternative_names = sort(each.value)
  validation_method = "DNS"

}
variable "source_domains" {    
  type = set(object({          
    apax_name = string         
    records   = set(string)    
  }))                          
}                              

将您的 yml 加载到本地值中,然后使用 for 语句将其修改为适合您的用例的内容:

locals {
    source_domains = yaml_decode(file("myYaml.yml"))
}

resource "aws_acm_certificate" "cert" {
    for_each                  = tomap({ for d in local.source_domains :
                                    d.apex_name => d })
    provider                  = aws.certificate_region
    domain_name               = each.key
    subject_alternative_names = sort(flatten([each.key, each.value.records]))
    validation_method         = "DNS"
}

我假设您想使用 apex_name 作为您的域名,apex_name 是正确的值,而 apax_name 是一个拼写错误。

我能够使用此 terraform 代码将所有域名放入 SAN 证书。

locals {
  subject_alternative_names = flatten([
      for d in var.source_domains :
        contains(keys(d), "records") ? d.records: null
      ])

}

resource "aws_acm_certificate" "cert" {
  provider                  = aws.certificate_region
  domain_name               = var.target_domain
  subject_alternative_names = local.subject_alternative_names
  validation_method         = "DNS"


}
variable "source_domains" {       
  type = set(object({             
    apex_name = string            
    records   = set(string)       
  }))                             
}