创建与尚未创建的资源相关的Terraform资源时出现的问题

时间:2020-06-19 12:43:47

标签: amazon-web-services terraform amazon-cloudfront amazon-route53 aws-certificate-manager

由于我的问题相当复杂(至少对我而言),我无法拿出合适的头衔。

我需要在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发行版。

1 个答案:

答案 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配置中使用它。您可以通过DNSemail验证证书。