Проблемы с созданием ресурсов терраформирования с зависимостями от еще не созданных ресурсов - PullRequest
0 голосов
/ 19 июня 2020

Я не могу придумать подходящее название, так как моя проблема довольно сложна (по крайней мере, для меня).

Мне нужно создать инфраструктуру в AWS

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

Теперь я могу создать свою зону хостинга без проблем, но когда я пытаюсь создать облачный фронт, первым делом terraform пытается создать и проверить сертификат.

Поскольку я еще не знаю, каким будет URL-адрес моего облачного интерфейса, я не могу создать запись A, указывающую на него. Сертификат указывает на эту запись (это поддомен моей размещенной зоны), поэтому время проверки сертификата истекает, и terraform завершает заявку.

Поскольку домен и сертификат появились позже в процессе разработки, они еще не появились, поскольку дистрибутив облачного интерфейса уже был, но при миграции в среду я наткнулся на стену.

Я не могу заставить terraform создать запись сначала через запись null_resource или depends_on, потому что это сформирует al oop.

Есть идеи?


Обновление:

Я использую псевдоним в CloudFront, и я размещаю свой домен в Route53.

Моя проблема заключается в том, что для записи route53 (не проверки, а самого сертификата) я использую ссылку на облачный интерфейс:

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

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

И я не могу получить это, потому что Распространение CloudFront еще не создано.

1 Ответ

1 голос
/ 19 июня 2020

Если вы используете URL CloudFront по умолчанию для создаваемого вами дистрибутива CloudFront и не определяете никаких псевдонимов, тогда вам нужно указать в своей конфигурации следующее:

  viewer_certificate {
    cloudfront_default_certificate = true
  }

Если у вас есть псевдонимы, определенные в вашей конфигурации CloudFront следующим образом:

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

Тогда это домен, который вы используете для создания своих сертификатов. В этом случае вы хотите не только создать свой сертификат, но и проверить его, прежде чем 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. Вы можете проверить сертификаты через DNS или электронную почту .

...