gpt4 book ai didi

amazon-web-services - Terraform 嵌套 for_each aws_acm_certificate domain_validation_options

转载 作者:行者123 更新时间:2023-12-05 03:48:01 26 4
gpt4 key购买 nike

我正在使用 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
}

不过,我想使用带有 map 变量的 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
}
}

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

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

最佳答案

您可以通过几种方式来处理这个问题。

  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+ 中的模块,让我们更灵活地完成您的要求,但不会在可重用代码本身中引入复杂性。

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

关于amazon-web-services - Terraform 嵌套 for_each aws_acm_certificate domain_validation_options,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64612006/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com