Terraform 和 AWS:ACM 证书从未经过验证

Posted

技术标签:

【中文标题】Terraform 和 AWS:ACM 证书从未经过验证【英文标题】:Terraform & AWS: ACM Certificate Never Validated 【发布时间】:2019-10-20 06:09:54 【问题描述】:

我正在尝试使用 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/… 来执行此操作。 【参考方案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

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

【讨论】:

以上是关于Terraform 和 AWS:ACM 证书从未经过验证的主要内容,如果未能解决你的问题,请参考以下文章

用于 eu-west-1 中资源的 us-east-1 中的 Terraform AWS ACM 证书

AWS ACM 证书未验证

Terraform 与 A​​PI-Gateway、Route53 和 SSL 认证相互依赖问题

带有 Elastic Beanstalk 的 AWS 证书管理器(ACM 证书)

sh 生成证书申请单行[AWS ACM]

将 AWS Certificate Manager(ACM 证书)与 Elastic Beanstalk 一起使用