Terraform & AWS: ACM证书未验证

9

我正在尝试使用 Terraform 0.12.0 创建 ACM 证书并将其应用于我的 Amazon ALB。我能够轻松创建没有证书的 ALB,但是现在,我添加了以下代码来创建 Route 53 验证记录、请求证书并将其分配给新的 ALB 监听器。

resource "aws_route53_zone" "main" {
  name = "${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" {

如果我登录控制台,则看到证书请求仍处于待验证状态。同时,我也按预期创建了Route 53验证记录。
为什么这个证书请求从未被处理并应用? 我在Terraform代码中漏掉了什么吗?
更新:当我使用现有的Route 53区域(其域名与上面尝试的不同)并将其作为数据资源引用到我的aws_route53_record中时,它可以无问题运行。我正在尝试此测试中的域名是今天通过Route 53购买的,因此我想知道这是否与我的问题有关。我无法对任何记录进行nslookup,即使我在Route 53控制台中看到它们列出。可能吗?我会让它保持几天,看看是否只是时间问题。

您的区域ID似乎是指向Route53区域资源而不是数据源。您是否在同一Terraform块中创建区域?如果是这样,您是否已正确地从父区域委派了该区域?如果尝试从公共框(例如不使用任何私有DNS)解析创建的记录会发生什么? - ydaetskcoR
我编辑了我的问题以展示我的区域是如何创建的。那段代码就在我的与证书相关的代码上面,所以它们都在同一个文件中创建。当我对验证记录值进行nslookup时,我收到一个错误,说服务器无法找到。但是我在Route 53控制台中看到了它。 - Shadowman
问题在于您没有正确从父域委派区域。如果您通过Route53购买了该域名,则应已经存在一个现有区域,TLD名称服务器将指向该区域。如果您是从其他地方购买的,则需要将名称服务器指向您的R53区域名称服务器。 - ydaetskcoR
我是从Route 53购买了我的域名。我没有看到该域名的现有区域,但由于所有的故障排除可能已经被删除了。现在我只看到一个相关的区域,即由我的Terraform代码创建的标记为“由Terraform管理”的区域。 - Shadowman
然后,您需要为您的域名修复名称服务器。您应该能够按照https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-name-servers-glue-records.html进行操作。 - ydaetskcoR
3个回答

2

我没有足够的声誉来评论,因此写下了答案

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

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

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


0

如果你在Route53之外购买了域名,请确保在域名配置中正确设置名称服务器。


0
在应用以下代码之前,请确保您已经购买了一个域名,然后填写domain_name变量。如果它应该是通配符,您可以使用wildcard_enable = true,这样您就可以创建一个通配符证书,在不同的子域中重复使用相同的ACM非常有用。 我的目录结构
.
|____main.tf
|____variables.tf

main.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获取ACM arn,它可以用于ALB

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接