由于我的问题相当复杂(至少对我而言),我无法拿出合适的头衔。
我需要在AWS中创建基础架构
CloudFront
ElasticBeanstalk (backend)
S3 (frontend)
Route53 (dns)
CertificateManager (ssl)
...
现在,我可以毫无问题地创建托管区域,但是当我尝试创建Cloudfront时,terraform要做的第一件事就是创建并验证证书。
由于我尚不清楚我的Cloudfront网址如何,因此无法创建指向该网址的A记录。证书虽然指向该记录(这是我的托管区域的子域),所以证书验证超时并且terraform结束了应用。
随着域和证书在开发的后期出现,它尚未出现,因为云前发行版已经存在,但是在迁移到环境时,我遇到了麻烦。
我不能强制terraform首先通过null_resource或Depends_on条目创建记录,因为这将形成循环。
有什么想法吗?
我在CloudFront中使用别名,并且在Route53中托管我的域。
但是我的问题是,对于route53记录(不是验证,而是证书本身),我正在使用Cloudfront参考:
resource "aws_route53_record" "frontend_record" {
name = ...
zone_id = ...
type = "A"
alias {
name = local.cloudfront_domain_name <-- this here
...
}
}
我无法得到这个,因为尚未创建CloudFront发行版。
答案 0 :(得分:1)
如果将default CloudFront URL用于正在创建的CloudFront发行版,并且未定义任何别名,则需要在配置中指定以下内容:
viewer_certificate {
cloudfront_default_certificate = true
}
如果您在CloudFront配置中定义了这样的别名:
aliases = ["mysite.example.com", "yoursite.example.com"]
这就是您用来创建证书的域。在这种情况下,您不仅要创建证书,还需要validate来创建证书,然后CloudFront才能使用它:
resource "aws_acm_certificate" "cert" {
domain_name = "example.com"
validation_method = "DNS"
}
data "aws_route53_zone" "zone" {
name = "example.com."
private_zone = false
}
resource "aws_route53_record" "cert_validation" {
name = "${aws_acm_certificate.cert.domain_validation_options.0.resource_record_name}"
type = "${aws_acm_certificate.cert.domain_validation_options.0.resource_record_type}"
zone_id = "${data.aws_route53_zone.zone.zone_id}"
records = ["${aws_acm_certificate.cert.domain_validation_options.0.resource_record_value}"]
ttl = 60
}
resource "aws_acm_certificate_validation" "cert" {
certificate_arn = "${aws_acm_certificate.cert.arn}"
validation_record_fqdns = ["${aws_route53_record.cert_validation.fqdn}"]
}
以上假设您的域托管在Route53中。如果您的域不在Route53中托管,那么您可能需要创建证书并对其进行验证,然后才能在CloudFront terraform配置中使用它。您可以通过DNS或email验证证书。