如何让Terraform等待AWS ACM证书状态变为ISSUED?
我用以下Terraform资源在AWS Certificate Manager(ACM)生成SSL证书:
resource "aws_acm_certificate" "certificate" { domain_name = var.certificate key_algorithm = "EC_secp384r1" validation_method = "DNS" options { certificate_transparency_logging_preference = "DISABLED" } lifecycle { create_before_destroy = true } tags = module.label.tags } resource "aws_acm_certificate_validation" "certificate_validation" { certificate_arn = aws_acm_certificate.certificate.arn }
证书可正常签发,但Terraform会在证书仍处于PENDING_VALIDATION状态时继续处理其他资源,导致apply操作失败,需重新运行才能完成。替换证书时出现的错误信息如下:
│ Error: modifying ELBv2 Listener (arn:aws:elasticloadbalancing:eu-west-1:...............): UnsupportedCertificate: The certificate 'arn:aws:acm:eu-west-1:...............' must have a fully-qualified domain name, a supported signature, and a supported key size. │ status code: 400, request id: aaa-bbb-ccc │ │ with aws_lb_listener.listener_https, │ on main.tf line 97, in resource "aws_lb_listener" "listener_https": │ 97: resource "aws_lb_listener" "listener_https" {
等待约一分钟重新运行后,旧证书会被移除,操作可正常完成。现需让Terraform等待证书状态变为ISSUED后再继续处理其他资源,无法直接在资源中添加status = "ISSUED",因为该值由配置应用结果自动确定。
问题根源在于aws_acm_certificate_validation资源配置不完整,未关联DNS验证记录,导致Terraform不会等待证书完成验证。需按以下步骤修改:
自动创建DNS验证记录
基于ACM证书返回的domain_validation_options,在Route53中生成对应的验证记录(需确保域名托管在Route53):resource "aws_route53_record" "cert_validation" { for_each = { for dvo in aws_acm_certificate.certificate.domain_validation_options : dvo.domain_name => { name = dvo.resource_record_name record = dvo.resource_record_value type = dvo.resource_record_type } } zone_id = var.route53_zone_id # 替换为你的Route53托管区ID name = each.value.name type = each.value.type ttl = 60 records = [each.value.record] }完善证书验证资源
更新aws_acm_certificate_validation,添加validation_record_fqdns参数关联上述DNS记录,触发Terraform等待证书状态变为ISSUED:resource "aws_acm_certificate_validation" "certificate_validation" { certificate_arn = aws_acm_certificate.certificate.arn validation_record_fqdns = [for record in aws_route53_record.cert_validation : record.fqdn] }明确资源依赖
在使用该证书的负载均衡Listener资源中,添加依赖声明,确保仅在证书验证完成后才执行创建/更新操作:resource "aws_lb_listener" "listener_https" { # 原有配置... certificate_arn = aws_acm_certificate.certificate.arn depends_on = [aws_acm_certificate_validation.certificate_validation] }
完成上述修改后,Terraform会先创建DNS验证记录,等待ACM完成证书验证(状态变为ISSUED),再继续处理后续资源,彻底避免因证书未就绪导致的部署失败。
内容的提问来源于stack exchange,提问作者Tomasz

