【问题标题】:Terraform & AWS: ACM Certificate Never ValidatedTerraform 和 AWS:ACM 证书从未经过验证
【发布时间】:2026-02-17 12:15:01
【问题描述】:

我正在尝试使用 Terraform 0.12.0 创建 ACM 证书以应用于我的 Amazon ALB。我可以在没有证书的情况下毫无问题地创建我的 ALB。整个基础架构堆栈按预期构建和部署。现在,我添加了以下代码来创建 Route 53 验证记录、请求证书并将其分配给新的 ALB 侦听器:

资源“aws_route53_zone”“主要”{ 名称 = "${var.zone_name}" }

resource "aws_route53_record" "validation" {
  name    = "${aws_acm_certificate.main.domain_validation_options.0.resource_record_name}"
  type    = "${aws_acm_certificate.main.domain_validation_options.0.resource_record_type}"
  zone_id = "${aws_route53_zone.main.zone_id}"
  records = ["${aws_acm_certificate.main.domain_validation_options.0.resource_record_value}"]
  ttl     = "60"
}

resource "aws_acm_certificate_validation" "main" {
  certificate_arn = "${aws_acm_certificate.main.arn}"
  validation_record_fqdns = "${aws_route53_record.validation.*.fqdn}"
}

resource "aws_alb_listener" "front_end_tls" {
  load_balancer_arn = "${aws_alb.main.id}"
  port              = "443"
  protocol          = "HTTPS"

  ssl_policy = "ELBSecurityPolicy-2016–08"
  certificate_arn = "${var.certificate_arn}"

  default_action {
    target_group_arn = "${aws_alb_target_group.main.id}"
    type             = "forward"
  }
}

但是,当我运行 terraform apply 时,它似乎卡在了证书验证上。我看到这样的消息:

module.dns.aws_acm_certificate_validation.main: Still creating... [38m21s elapsed]

我已经让代码运行了超过 45 分钟,直到我最终看到一条错误消息:

Error: Error creating LB Listener: SSLPolicyNotFound: SSL policy 'ELBSecurityPolicy-2016–08' not found
    status code: 400, request id: a5f052c1-86df-11e9-993c-f99526fa9bba

  on alb/main.tf line 25, in resource "aws_alb_listener" "front_end_tls":
  25: resource "aws_alb_listener" "front_end_tls" {



Error: Expected certificate to be issued but was in state PENDING_VALIDATION

  on dns/main.tf line 38, in resource "aws_acm_certificate_validation" "main":
  38: resource "aws_acm_certificate_validation" "main" {

如果我登录到控制台,我会看到证书请求仍处于 Pending Validation 状态。我还看到了按预期创建的 Route 53 验证记录。

为什么从未处理和应用此证书请求?我的 Terraform 代码中是否缺少某些内容?

更新:当我使用现有的 Route 53 区域(与我上面尝试的域名不同)并将其作为我的 aws_route53_record 中的数据资源引用时,它可以工作没有问题。我在这个测试中尝试的域名是今天通过 Route 53 购买的,所以我想知道这是否与我的问题有关。我无法对任何记录进行 nslookup,即使我看到它们在 Route 53 控制台中列出。可能是?我会让它静置几天,看看是否只是时间问题。

【问题讨论】:

  • 您的区域 ID 似乎是指 Route53 区域 resource 而不是数据源。您是否在同一个 Terraform 块中创建区域?如果是这样,您是否正确地从父区域委派了该区域?如果您尝试从公共盒子解析创建的记录(例如,不使用任何私有 DNS)会发生什么?
  • 我编辑了我的问题以显示我的区域是如何创建的。该代码块就在问题中显示的与证书相关的代码的正上方,因此它们都是在同一个文件中创建的。当我对验证记录值执行 nslookup 时,我收到一条错误消息,指出找不到服务器。但是,我在 Route 53 控制台中看到了它。
  • 问题是您没有正确地从父级委派区域。如果您通过 Route53 购买了域,那么您应该已经有一个 TLD 名称服务器将指向的现有区域。如果您是从其他地方购买的,那么您需要将名称服务器指向您的 R53 区域名称服务器。
  • 我确实从 Route 53 购买了我的域。我没有看到该域的现有区域,但有可能通过所有故障排除我可能已经删除了它。我现在看到的唯一相关区域是由我的 Terraform 代码创建的标有“由 Terraform 管理”的区域。
  • 然后您需要为您的域修复名称服务器。您应该可以关注docs.aws.amazon.com/Route53/latest/DeveloperGuide/… 来执行此操作。

标签: amazon-web-services ssl-certificate terraform terraform-provider-aws aws-certificate-manager


【解决方案1】:

我没有评论的声誉,所以写一个答案

OP 在评论中提到域是从 route53 购买的,在这种情况下,应该为该域创建一个托管区域。 OP 还提到他可以从 AWS 控制台查看记录,但不能为任何这些记录执行nslookup

我认为在这种情况下,OP 可能没有购买域,并且可能已经创建了一个私有托管区域并且正在使用它。当然,公共 ACM 证书无法使用私有托管区域

进行验证

AWS 论坛:https://forums.aws.amazon.com/thread.jspa?threadID=238468

如果不是这样,请见谅

【讨论】:

    【解决方案2】:

    在应用下面的代码之前,确保你已经购买了一个域名,然后,填写domain_name变量,如果它应该是一个通配符,你可以使用wildcard_enable = true这样,你可以创建一个通配符证书,在不同的子域中重用相同的ACM 非常有用。

    我的目录结构

    .
    |____main.tf
    |____variables.tf
    

    ma​​in.tf

    locals {
      final_domain = "${var.wildcard_enable == true ? "*.${var.domain_name}" : var.domain_name}"
    }
    
    resource "aws_acm_certificate" "this" {
      domain_name       = local.final_domain
      validation_method = "DNS"
    
      tags = {
        "Name"       = "acm-cert-name"
        "costCenter" = "xxxxxxxxx"
        "owner"      = "xxxxxxxxx"
      }
    
      lifecycle {
        create_before_destroy = true
      }
    }
    
    resource "aws_route53_record" "this" {
      depends_on = ["aws_acm_certificate.this"]
      zone_id    = "xxxxxxxxxx"
      name       = aws_acm_certificate.this.domain_validation_options.0.resource_record_name
      type       = "CNAME"
      ttl        = "300"
      records    = [aws_acm_certificate.this.domain_validation_options.0.resource_record_value]
    }
    

    variables.tf

    variable "wildcard_enable" {
      description = "Variable that allow us to choose the possibility of not use wildcard certificate"
      default     = false
    }
    
    variable "domain_name" {
      description = "The name of the domain to which apply the cert"
    }
    

    首先:将此代码作为一个模块应用,或者只是应用它并等待 AWS 验证它。

    最后:使用aws_acm_certificate.this.arn得到ACMarn,它可以用在ALB上。

    如果尚未验证ACM 证书,则不能将其与ALB 一起使用,因为AWS api 不会检索ACM ARN

    希望对您和其他用户有用。

    【讨论】: