使用Terraform创建并验证AWS ACM证书时遇无限等待问题
尝试使用Terraform创建并验证AWS ACM证书,配置如下:
// not used in this config, but it does exist resource "aws_route53_zone" "main" { name = "mycompany.com" } resource "aws_route53_zone" "dev" { name = "dev.mycompany.com" } resource "aws_acm_certificate" "cert" { domain_name = "*.dev.mycompany.com" validation_method = "DNS" key_algorithm = "RSA_2048" } resource "aws_route53_record" "records" { for_each = { for dvo in aws_acm_certificate.cert.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 = 300 type = each.value.type zone_id = aws_route53_zone.dev.zone_id } resource "aws_acm_certificate_validation" "validation" { certificate_arn = aws_acm_certificate.cert.arn validation_record_fqdns = [for record in aws_route53_record.records : record.fqdn] }
但aws_acm_certificate_validation的创建过程无限耗时:
aws_acm_certificate_validation.validation: Still creating... [5m30s elapsed]
终止执行后收到提示:
waiting for ACM Certificate ({arn here}) to be issued: context canceled
配置中存在什么问题?
核心问题:Route53验证记录的名称配置错误
你的证书域名是*.dev.mycompany.com,对应的DNS验证记录FQDN应该是类似_xxxxxx.dev.mycompany.com的格式。但当前配置中,直接将ACM返回的resource_record_name(完整FQDN)作为Route53记录的name字段,而你的Route53 zone是dev.mycompany.com——Route53会自动在记录名称后追加zone域名,最终生成的记录FQDN会变成_xxxxxx.dev.mycompany.com.dev.mycompany.com,完全不符合ACM的验证要求,导致证书一直无法完成DNS验证,Terraform只能无限等待。
修正方案
修改aws_route53_record资源的name字段,使用trimsuffix函数去掉完整FQDN中的zone域名后缀:
resource "aws_route53_record" "records" { for_each = { for dvo in aws_acm_certificate.cert.domain_validation_options : dvo.domain_name => { name = dvo.resource_record_name record = dvo.resource_record_value type = dvo.resource_record_type } } allow_overwrite = true // 去掉完整FQDN中的zone域名后缀,避免Route53重复追加 name = trimsuffix(each.value.name, ".${aws_route53_zone.dev.name}") records = [each.value.record] ttl = 300 type = each.value.type zone_id = aws_route53_zone.dev.zone_id }
另外,从Terraform AWS Provider 3.0+开始,aws_acm_certificate_validation资源可以无需显式指定validation_record_fqdns,它会自动关联验证记录,也可以简化验证资源的配置:
resource "aws_acm_certificate_validation" "validation" { certificate_arn = aws_acm_certificate.cert.arn // 移除validation_record_fqdns,依赖关系由Terraform自动处理 }
验证步骤
- 应用修正后的配置:
terraform apply - 查看Route53记录,确认生成的验证记录FQDN与ACM控制台中显示的一致
- 等待数分钟,ACM会自动完成DNS验证并颁发证书,Terraform的创建过程也会正常结束
内容的提问来源于stack exchange,提问作者Héctor Valls

