【问题标题】:Issues creating terraform resources with dependencies to resources not yet created创建具有对尚未创建的资源的依赖关系的 terraform 资源的问题
【发布时间】:2020-10-09 17:26:52
【问题描述】:

我想不出一个合适的标题,因为我的问题相当复杂(至少对我而言)。

我需要在 AWS 中创建基础设施

CloudFront
    ElasticBeanstalk (backend)
    S3 (frontend)
Route53 (dns)
CertificateManager (ssl)
...

现在我可以毫无问题地创建托管区域,但是当我尝试创建云端时,terraform 尝试做的第一件事是创建和验证证书。

由于我还不知道我的云端 url 将如何,我无法创建指向它的 A 记录。虽然证书指向该记录(它是我托管区域的子域),因此证书验证超时并且 terraform 结束应用。

由于域和证书在开发的后期出现,它还没有出现,因为云端分发已经存在,但是在迁移到环境时我遇到了困难。

我不能强制 terraform 首先通过 null_resource 或 depends_on 条目创建记录,因为这将形成一个循环。

有什么想法吗?


更新:

我在 CloudFront 中使用别名,并且在 Route53 中托管我的域。

我的问题是对于 route53 记录(不是验证,而是证书本身),我使用的是云端参考:

resource "aws_route53_record" "frontend_record" {
  name    = ...
  zone_id = ...
  type    = "A"

  alias {
    name = local.cloudfront_domain_name <-- this here
    ...
  }
}

我无法获取此信息,因为尚未创建 CloudFront 分配。

【问题讨论】:

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


    【解决方案1】:

    如果您将 default CloudFront URL 用于您正在创建的 CloudFront 分配并且未定义任何别名,那么您需要在配置中指定以下内容:

      viewer_certificate {
        cloudfront_default_certificate = true
      }
    

    如果您在 CloudFront 配置中定义了这样的别名:

     aliases = ["mysite.example.com", "yoursite.example.com"]
    

    那就是您用来创建证书的域。在这种情况下,您不仅要创建您的证书,还要在 CloudFront 可以使用它之前 validate 它:

    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 验证证书。

    【讨论】:

    • 我更新了我的帖子,因为我无法正确格式化我的评论。谢谢你的回答!
    猜你喜欢
    • 2023-02-23
    • 2022-07-24
    • 1970-01-01
    • 2018-03-01
    • 2020-09-16
    • 1970-01-01
    • 2020-07-31
    • 2021-01-19
    • 1970-01-01
    相关资源
    最近更新 更多