【问题标题】:Why isn't my AWS ACM certificate validating?为什么我的 AWS ACM 证书无法验证?
【发布时间】:2020-10-29 11:23:32
【问题描述】:

我有一个使用 ACM 证书在 AWS Route53 中注册的域名。我现在正在尝试将该域名和证书移动到新帐户以及使用 Terraform 管理资源。我使用 AWS CLI 将域名移动到新账户,它似乎运行良好。然后我尝试运行这个 Terraform 代码来为域创建一个新的证书和托管区域。

resource "aws_acm_certificate" "default" {
  domain_name       = "mydomain.io"
  validation_method = "DNS"
}

resource "aws_route53_zone" "external" {
  name = "mydomain.io"
}

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

resource "aws_acm_certificate_validation" "default" {
  certificate_arn = aws_acm_certificate.default.arn
  validation_record_fqdns = [
    aws_route53_record.validation.fqdn,
  ]
}

这有两点很奇怪。首先,证书已创建,但验证从未完成。它仍处于待验证状态。我在失败后某处读到您无法自动验证,您需要手动创建 CNAME 记录。所以我进入控制台并单击“将 cname 添加到路由 53”按钮。这会将 CNAME 记录适当地添加到 Terraform 创建的我的新 Route53 记录中。但它已经等待了几个小时。我多次点击同一个按钮,只创建了一个 CNAME,后续点击无效。

另一个奇怪的地方,也许是一个线索,是我的网站仍在运行。我认为这应该破坏了网站,因为该域现在由一个新帐户拥有,路由到该新帐户上的不同托管区域,并且有一个现在仍在等待中的证书。但是,一切仍然正常。所以我认为旧证书和托管区域可能会影响这一点。他们是否需要释放域,我是否需要删除该证书?删除旧帐户上的证书听起来没有必要。我不应该再被送出去。

我还没有将证书与我打算做的 Cloudfront 或 ALB 相关联。但由于它没有经过验证,我用于创建 Cloudfront 实例的 Terrform 代码死掉了。

【问题讨论】:

  • 关于 DNS 的一件事让我多次抓到:完全传播更改可能需要长达 24 小时。可能值得等待一整天来验证更改是否正确完成。
  • 遗憾的是并非如此。已经好几天了。我还删除了旧帐户上的托管区域,但仍未验证。

标签: terraform amazon-route53 aws-certificate-manager


【解决方案1】:

事实证明,我转移的域是通过一组名称服务器转移的,但是 Route53 托管区域中的名称服务器都不同。当这些通过控制台一起创建时,它会做正确的事情。我不确定如何在这里使用 Terraform 做正确的事情,我现在将发布另一个问题。但目前,解决方案是更改托管区域或注册域上的名称服务器以相互匹配。

【讨论】:

    【解决方案2】:

    它对我有用

    ######################

    data "aws_route53_zone" "main" {
      name         = var.domain
      private_zone = false
    }
    
    locals {
      final_domain = var.wildcard_enable == true ? *.var.domain : var.domain
      # final_domain = "${var.wildcard_enable == true ? "*.${var.domain}" : var.domain}"
    }
    
    resource "aws_acm_certificate" "cert" {
      domain_name       = local.final_domain
      validation_method = "DNS"
    
      tags = {
        "Name" = var.domain
      }
    
      lifecycle {
        create_before_destroy = true
      }
    }
    
    resource "aws_route53_record" "cert_validation" {
      depends_on      = [aws_acm_certificate.cert]
      zone_id         = data.aws_route53_zone.main.id
      name            = sort(aws_acm_certificate.cert.domain_validation_options[*].resource_record_name)[0]
      type            = "CNAME"
      ttl             = "300"
      records         = [sort(aws_acm_certificate.cert.domain_validation_options[*].resource_record_value)[0]]
      allow_overwrite = true
    }
    
    resource "aws_acm_certificate_validation" "cert" {
      certificate_arn = aws_acm_certificate.cert.arn
      validation_record_fqdns = [
        aws_route53_record.cert_validation.fqdn
      ]
      timeouts {
        create = "60m"
      }
    }
    

    【讨论】:

    • 这个问题已经得到解答,从另一个帐户移植名称服务器是一个奇怪的问题,所以我在弄清楚后将其记录为答案。如前所述,该代码应该可以按照您的发现工作。但真正的问题是注册到域的底层名称服务器。
    • 当你说“它对我有用”时,你能提供一些上下文吗?它在几秒钟内验证了吗?分钟?小时?试图了解这里会发生什么。
    猜你喜欢
    • 2021-12-19
    • 1970-01-01
    • 2023-02-14
    • 2020-11-25
    • 2012-03-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 2016-09-03
    相关资源
    最近更新 更多