You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Terraform跨模块创建AWS Route 53记录用于ACM证书验证

跨模块实现AWS ACM证书DNS验证(Route53+ACM分模块)

问题核心

你当前的代码存在关键错误:Route53模块中直接将ACM证书ARN作为CNAME记录值是完全错误的——DNS验证需要的是ACM自动生成的特定验证记录(格式为_xxxx.www.example.com指向_xxxx.acm-validations.aws),而非证书ARN。跨模块的核心是传递ACM生成的验证记录参数,而非ARN。

修正步骤及代码示例

1. 修改ACM模块:输出验证所需的关键参数

在ACM模块的outputs.tf中,除了ARN,还需要输出ACM生成的DNS验证选项集合:

output "cert_arn" {
  description = "ACM证书ARN"
  value       = aws_acm_certificate.test.arn
}

output "domain_validation_options" {
  description = "ACM证书的DNS验证选项集合"
  value       = aws_acm_certificate.test.domain_validation_options
  sensitive   = true # 避免敏感验证信息输出到控制台
}

2. 修改Route53模块:接收验证选项并创建对应记录

  • 更新Route53模块的variables.tf,改为接收验证选项集合:
variable "domain_validation_options" {
  type = list(object({
    domain_name           = string
    resource_record_name  = string
    resource_record_type  = string
    resource_record_value = string
  }))
  description = "来自ACM模块的DNS验证选项"
}

variable "zone_id" {
  type        = string
  description = "Route53托管区ID"
}
  • 更新Route53模块的main.tf,遍历验证选项创建对应记录:
resource "aws_route53_record" "acm_validation" {
  for_each = {
    for dvo in var.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         = var.zone_id
}

# 输出验证记录的FQDN,供后续验证资源使用
output "validation_record_fqdns" {
  description = "ACM验证用Route53记录的完整域名"
  value       = [for record in aws_route53_record.acm_validation : record.fqdn]
}

3. 根模块调用:连接两个模块并完成验证

在根模块中,将ACM模块的验证选项传递给Route53模块,并创建验证资源等待证书生效:

module "acm" {
  source = "./acm"
}

module "route53" {
  source                  = "./route53"
  zone_id                 = "your-real-zone-id" # 替换为实际的Route53托管区ID
  domain_validation_options = module.acm.domain_validation_options
}

# 等待证书验证完成(可选但推荐,确保后续资源使用已生效证书)
resource "aws_acm_certificate_validation" "test" {
  certificate_arn         = module.acm.cert_arn
  validation_record_fqdns = module.route53.validation_record_fqdns
}

# 输出已验证的证书ARN,供其他资源(如ALB监听器)使用
output "validated_certificate_arn" {
  value = aws_acm_certificate_validation.test.certificate_arn
}

关键说明

  • for_each的作用:自动适配多域名证书(如主域名+通配符域名),为每个需要验证的域名创建对应记录。
  • 敏感数据标记:domain_validation_options包含验证用的唯一标识,设置sensitive=true避免在控制台输出敏感信息。
  • 验证资源的必要性:aws_acm_certificate_validation会等待证书完成DNS验证,确保后续依赖证书的资源(如负载均衡监听器)启动时证书已生效。

内容的提问来源于stack exchange,提问作者Or Sade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 05:43:18