【问题标题】:Terraform nested for_each aws_acm_certificate domain_validation_optionsTerraform 嵌套 for_each aws_acm_certificate domain_validation_options
【发布时间】:2021-02-13 03:07:18
【问题描述】:

我正在使用 Terraform v0.13.5。如果我为在 AWS 中注册的域创建单个 AWS 证书资源,我还可以使用以下方法成功创建 Route53 DNS 验证记录:

resource "aws_acm_certificate" "api" {
  domain_name       = "api.example.com"
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_route53_record" "api_validation" {
  for_each = {
    for dvo in aws_acm_certificate.api.domain_validation_options : dvo.domain_name => {
      name   = dvo.resource_record_name
      record = dvo.resource_record_value
      type   = dvo.resource_record_type
    }
  }
  allow_overwrite = true
  name            = each.value.name
  records         = [each.value.record]
  ttl             = 60
  type            = each.value.type
  zone_id         = data.aws_route53_zone.example.zone_id # already exists
}

但是,我想使用带有映射变量的 for_each 创建多个证书。我使用以下方法定义了aws_acm_certificate 资源:

variable "sub_domains" {
  type = map
  default = {
    "api"      = "api"
    "api_test" = "api.test"
  }
}

resource "aws_acm_certificate" "certs" {
  for_each          = var.sub_domains
  domain_name       = "${each.value}.example.com"
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }
}

我不知道如何引用定义验证记录时创建的动态证书。 以下 sn-p 现在不起作用

resource "aws_route53_record" "api_validation" {
  for_each = {
    for dvo in aws_acm_certificate.certs.domain_validation_options : dvo.domain_name => {
      name   = dvo.resource_record_name
      record = dvo.resource_record_value
      type   = dvo.resource_record_type
    }
  }
  allow_overwrite = true
  name            = each.value.name
  records         = [each.value.record]
  ttl             = 60
  type            = each.value.type
  zone_id         = data.aws_route53_zone.myzone.zone_id # already exists
}

Terraform 报错如下:

Because aws_acm_certificate.certs has "for_each" set, its attributes must be
accessed on specific instances.

那么如何为每个动态创建的证书获取domain_validation_options

【问题讨论】:

    标签: amazon-web-services foreach terraform aws-certificate-manager


    【解决方案1】:

    有几种方法可以解决这个问题。

    1. 看起来您使用的是同一个高级域。在这种情况下,它是 example.com。您应该考虑在aws_acm_certificate 资源中使用subject_alternative_names 选项。这将只请求一个具有多个 SAN 的证书,并且您从提供者文档中获得的逻辑将根据需要创建验证记录集。

    2. 如果您希望创建独特的个人证书,我建议采用模块化方法。如果只是查看通过 DNS 验证的证书,您可以获取那里的所有代码(加上未显示的 aws_acm_certificate_validation 资源)并将其打包到自己文件夹中的模块中。然后,您可以使用以下方式调用该模块:

    module "acm_certs" {
      for_each = var.sub_domains
    
      source = "../modules/acm_certificate/"
    
      certificate_domain_name   = "${each.value}.example.com"
      validation_domain_name    = "example.com"
    }
    

    请注意,我们可以使用 for_each 调用 Terraform v0.13+ 中的模块,让我们在完成您的要求时更加灵活,但不会在可重用代码本身中引入复杂性。

    您看到的每个变量都有模块的输入。如果您需要更详细地解释我所说的模块的含义,请回复,我会更深入地了解。

    【讨论】:

    • 我认为在这种情况下答案 2 更相关,因为我希望创建单独的证书。 terraform 文档似乎并不清楚如何迭代动态创建的多个资源。
    • 我有这个确切的问题!感谢您发布这个问题以及答案!第一个选项对我有用,但这为我节省了很多时间和头痛!
    猜你喜欢
    • 2021-08-02
    • 2021-07-21
    • 2021-10-06
    • 2021-10-18
    • 2021-07-09
    • 1970-01-01
    • 2020-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多