我正在尝试创建一个ACM证书以使用Terraform 0.12.0应用于我的Amazon ALB。我可以毫无问题地创建没有证书的ALB。整个基础架构堆栈均按预期构建和部署。现在,我添加了以下代码来创建Route 53验证记录,请求证书并将其分配给新的ALB侦听器:
资源“ aws_route53_zone”“主要” { 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购买的,所以我想知道这是否与我的问题有关。即使在Route 53控制台中列出了它们,我也无法对任何记录进行nslookup。也许?我将其放置几天,看看是否只是时间问题。
答案 0 :(得分:1)
我没有发表评论的声誉,所以写一个答案
OP在评论中提到,该域是从route53购买的,在这种情况下,应该为该域创建一个托管区域。 OP还提到他可以从AWS控制台查看记录,但不能对其中的任何记录进行nslookup
。
我认为在这种情况下,OP可能没有购买域,可能已经创建了一个专用托管区域,并且正在与之合作。当然,不能使用私有托管区域
来验证公共ACM证书。AWS论坛:https://forums.aws.amazon.com/thread.jspa?threadID=238468
如果不是这种情况,请问
答案 1 :(得分: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
{{1 }}。
希望对您和其他用户有用。