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

如何让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不会等待证书完成验证。需按以下步骤修改:

  1. 自动创建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]
    }
    
  2. 完善证书验证资源
    更新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]
    }
    
  3. 明确资源依赖
    在使用该证书的负载均衡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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 19:52:49