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
相关产品推荐
相关产品推荐

