Catatan validasi DNS tidak ada saat menggunakan terraform aws_acm_certificate_validation

Saya terjebak pada kesalahan Terraform sepanjang hari saat mencoba membuat sumber daya AWS Route53 dan sumber daya AWS Certificate Manager. 2 bit ini adalah bagian dari proyek yang lebih luas (situs web yang dihosting di s3 melalui fitur penyajian statisnya).

Khususnya kesalahan yang muncul selama validasi DNS sertifikat, ketika data CNAME dimasukkan sebagai data DNS di Route53.

Saya akan menjelaskan kesalahannya dan kemudian saya akan menjelaskan pengaturannya.

Kesalahan

terraform plan -var-file=production.vars

Creating...
module.infrastructure.aws_route53_record.idarth-validation-record: Still creating... [10s elapsed]
module.infrastructure.aws_route53_record.idarth-validation-record: Still creating... [20s elapsed]
module.infrastructure.aws_route53_record.idarth-validation-record: Still creating... [30s elapsed]
module.infrastructure.aws_route53_record.idarth-validation-record: Still creating... [40s elapsed]
module.infrastructure.aws_route53_record.idarth-validation-record: Still creating... [50s elapsed]
module.infrastructure.aws_route53_record.idarth-validation-record: Still creating... [1m0s elapsed]
module.infrastructure.aws_route53_record.idarth-validation-record: Still creating... [1m10s elapsed]
module.infrastructure.aws_route53_record.idarth-validation-record: Creation complete after 1m12s [id=ZB4TSGZTTZ3CQ__7bc5230529c8192e8e697aeab0ec0eb9.idarth.com._CNAME]
module.infrastructure.aws_acm_certificate_validation.idarth-ssl-certificate: Creating...
2019/08/24 18:32:40 [ERROR] module.infrastructure: eval: *terraform.EvalSequence, err: 1 error occurred:
    * missing www.idarth.com DNS validation record: _18ff46dac48c6d852b696306dfa57093.www.idarth.com

2019/08/24 18:32:40 [TRACE] [walkApply] Exiting eval tree: module.infrastructure.aws_acm_certificate_validation.idarth-ssl-certificate

Error: 1 error occurred:
    * missing www.idarth.com DNS validation record: _18ff46dac48c6d852b696306dfa57093.www.idarth.com



  on ../modules/route53.tf line 14, in resource "aws_acm_certificate_validation" "idarth-ssl-certificate":
  14: resource "aws_acm_certificate_validation" "idarth-ssl-certificate" {

CATATAN: Saya belum menyertakan rencana eksekusi yang membuat bagian infrastruktur lainnya, namun saya hanya melaporkan bagian yang bermasalah.

Ini file tf saya:

route53.tf

resource "aws_route53_zone" "idarth-hosted-zone" {
  name = "${var.domain_name}"
}


resource "aws_route53_record" "idarth-validation-record" {
  name    = "${aws_acm_certificate.idarth-ssl-certificate.domain_validation_options.0.resource_record_name}"
  type    = "${aws_acm_certificate.idarth-ssl-certificate.domain_validation_options.0.resource_record_type}"
  zone_id = "${aws_route53_zone.idarth-hosted-zone.zone_id}"
  records = ["${aws_acm_certificate.idarth-ssl-certificate.domain_validation_options.0.resource_record_value}"]
  ttl     = "60"
}

resource "aws_acm_certificate_validation" "idarth-ssl-certificate" {
  provider        = "aws.us_east_1"
  certificate_arn = "${aws_acm_certificate.idarth-ssl-certificate.arn}"
  validation_record_fqdns = [
    "${aws_route53_record.idarth-validation-record.fqdn}"
  ]
}

resource "aws_route53_record" "idarth-record-domain" {
  zone_id = "${aws_route53_zone.idarth-hosted-zone.zone_id}"
  name = "${var.domain_name}"
  type = "A"

  alias {
    name = "${aws_cloudfront_distribution.idarth-cloudfront-distr.domain_name}"
    zone_id = "${aws_cloudfront_distribution.idarth-cloudfront-distr.hosted_zone_id}"
    evaluate_target_health = false
  }
}

resource "aws_route53_record" "idarth-record-domain-www" {
  zone_id = "${aws_route53_zone.idarth-hosted-zone.zone_id}"
  name = "${var.domain_name_www}"
  type = "A"

  alias {
    name = "${aws_cloudfront_distribution.idarth-cloudfront-distr.domain_name}"
    zone_id = "${aws_cloudfront_distribution.idarth-cloudfront-distr.hosted_zone_id}"
    evaluate_target_health = false
  }
}

ssl_certificate.tf

provider "aws" {
  alias           = "us_east_1"
  region          = "us-east-1"
}

resource "aws_acm_certificate" "idarth-ssl-certificate" {
  provider        = "aws.us_east_1"

  domain_name       = "${var.domain_name}"
  subject_alternative_names = ["${var.domain_name_www}"]
  validation_method = "DNS"

  lifecycle {
    create_before_destroy = true
  }

  tags = {
        Project = "${var.name}-${var.env}"
        Scope    = "personal-blog"
    }
}

distribusi.tf

resource "aws_cloudfront_distribution" "idarth-cloudfront-distr" {
  depends_on = ["aws_acm_certificate_validation.idarth-ssl-certificate"]

  origin {
    domain_name = "${aws_s3_bucket.idarth-static-site-host.bucket_regional_domain_name}"
    origin_id   = "${var.domain_name}"

    /*s3_origin_config {
      origin_access_identity = "origin-access-identity/cloudfront/ABCDEFG1234567"
    }*/
  }

  enabled             = true
  is_ipv6_enabled     = true
  default_root_object = "index.html"

  /*logging_config {
    include_cookies = false
    bucket          = "mylogs.s3.amazonaws.com"
    prefix          = "myprefix"
  }*/

  aliases = ["${var.domain_name}", "${var.domain_name_www}"]

  default_cache_behavior {
    allowed_methods  = ["GET", "HEAD"]
    cached_methods   = ["GET", "HEAD"]
    target_origin_id = "${var.domain_name}"

    forwarded_values {
      query_string = false

      cookies {
        forward = "none"
      }
    }

    compress = true
    viewer_protocol_policy = "redirect-to-https"
    min_ttl                = 0
    default_ttl            = 3600
    max_ttl                = 86400
  }


  #price_class = "PriceClass_200"

  restrictions {
    geo_restriction {
      restriction_type = "none"
      locations        = []
    }
  }

  viewer_certificate {
    acm_certificate_arn  = "${aws_acm_certificate_validation.idarth-ssl-certificate.certificate_arn}"
    ssl_support_method  = "sni-only"
  }


    tags = {
        Project = "${var.name}-${var.env}"
        Scope    = "personal-blog"
    }
}

Versi Terraform: 0.12.7, versi penyedia aws: v2.25.0_x4

Analisis log kesalahan

Saat saya menghabiskan satu hari mencoba men-debug kesalahan di atas, inilah pemikiran saya:

  • Sertifikat menghasilkan 2 CNAME untuk 2 domain (variabel: var.domain_name, var.domain_name_www): _7bc5230529c8192e8e697aeab0ec0eb9.idarth.com._CNAME, _18ff46dac48c6d852b696306dfa57093.www.idarth.com
  • Pembuatan yang pertama, seperti yang Anda lihat di log rencana eksekusi, berhasil dibuat, sedangkan yang kedua menyebabkan masalah.
  • Melihat ke konsol AWS, saya dapat melihat CNAME pertama dimasukkan ke dalam zona yang dihosting DNS, tetapi tidak yang kedua. Sekalipun zona yang di-hosting DNS dimasukkan, sertifikat untuk catatan tersebut masih mengakibatkan validasi yang tertunda.

Inilah yang dapat saya temukan sejauh ini, tetapi saya tidak tahu bagaimana cara melanjutkannya. Adakah yang pernah ke sini sebelumnya dan dapat membantu dengan hal di bawah ini?

Terima kasih!


person AlessioG    schedule 25.08.2019    source sumber


Jawaban (4)


Tidak yakin apakah ini masih relevan tetapi saya mengalami masalah yang sama hari ini dan menemukan pertanyaan ini di sini, jadi mungkin saya akan meninggalkan jawabannya untuk anak cucu.

Ternyata sumber validasi harus menyertakan semua CNAME yang dihasilkan, seperti:

resource "aws_acm_certificate" "some-cert" {
  provider = "aws.us-east-1"

  domain_name               = "some.domain"
  validation_method         = "DNS"
  subject_alternative_names = ["www.some.domain"]
}

resource "aws_route53_record" "cert-validations" {
  count = length(aws_acm_certificate.some-cert.domain_validation_options)

  zone_id = var.zone_id
  name    = element(aws_acm_certificate.some-cert.domain_validation_options.*.resource_record_name, count.index)
  type    = element(aws_acm_certificate.some-cert.domain_validation_options.*.resource_record_type, count.index)
  records = [element(aws_acm_certificate.some-cert.domain_validation_options.*.resource_record_value, count.index)]
  ttl     = 60
}

resource "aws_acm_certificate_validation" "cert-validation" {
  provider = "aws.us-east-1"

  certificate_arn         = aws_acm_certificate.some-cert.arn
  validation_record_fqdns = aws_route53_record.cert-validations.*.fqdn
}

Perhatikan secara khusus bahwa kita memiliki satu sumber daya aws_acm_certificate_validation, tetapi berisi daftar beberapa validation_record_fqdns, dari semua data DNS CNAME validasi yang dihasilkan.

Semoga itu bisa membantu!

person Marcin Wyszynski    schedule 29.10.2019
comment
Terraform memunculkan pesan kesalahan yang mengatakan Nilai hitungan bergantung pada atribut sumber daya yang tidak dapat ditentukan hingga diterapkan, sehingga Terraform tidak dapat memprediksi berapa banyak instance yang akan dibuat. solusi apa yang Anda lakukan untuk ini? Apakah Anda menggunakan -target? - person nsantiago2719; 30.10.2019
comment
Menemukannya. Buatlah daftar variabel nama alternatif lalu gunakan untuk penghitungan. Mantan. count = length(var.alternative-names) + 1. - person nsantiago2719; 30.10.2019
comment
Ya, itu salah satu pilihan. Opsi lainnya adalah membaginya menjadi dua proses - pertama, buat catatan, lalu validasi. - person Marcin Wyszynski; 30.10.2019

Inilah cara saya memecahkan masalah ini dalam konfigurasi saya dengan sedikit modifikasi pada jawaban dari Marcin Wyszynski. Karena validasi dapat mengakibatkan duplikasi data DNS, gunakan allow_overwrite = true di aws_route53_record untuk melewati kesalahan already exists dan pastikan semuanya dibuat.

config.tf

# locals must be used so ${var.env} can be interpolated in the definition
locals {
  tags = {
    Name        = "${var.domain_name}"
    Environment = "${var.env}"
  }
  cert_sans = ["www.${var.domain_name}", "cdn.${var.domain_name}", "*.${var.domain_name}"]
}

variable "env" {
  default = "production"
}

variable "domain_name" {
  default = "your-domain.com"
}

acm.tf

resource "aws_acm_certificate" "site" {
  domain_name               = var.domain_name
  validation_method         = "DNS"
  tags                      = local.tags
  subject_alternative_names = local.cert_sans

  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_route53_record" "cert_validations" {
  count = length(local.cert_sans) + 1

  zone_id         = aws_route53_zone.public.zone_id
  allow_overwrite = true # This is what allowed for conflict resolution in DNS
  name            = element(aws_acm_certificate.site.domain_validation_options.*.resource_record_name, count.index)
  type            = element(aws_acm_certificate.site.domain_validation_options.*.resource_record_type, count.index)
  records         = [element(aws_acm_certificate.site.domain_validation_options.*.resource_record_value, count.index)]
  ttl             = 60
}

resource "aws_acm_certificate_validation" "cert_validation" {
  certificate_arn         = aws_acm_certificate.site.arn
  validation_record_fqdns = aws_route53_record.cert_validations.*.fqdn

  timeouts {
    create = "120m"
  }
}
person Gio Palacino    schedule 15.01.2020

Zona seharusnya tidak memiliki . final?

resource "aws_route53_zone" "idarth-hosted-zone" {
  name = "${var.dns_zone}."
}

Juga dalam skenario serupa, saya menggunakan CNAME untuk catatan DNS yang menunjuk ke distribusi CloudFront

resource aws_route53_record www {
    zone_id = data.aws_route53_zone.selected.zone_id
    name    = "openbanking.${var.dns_zone}"
    type    = "CNAME"
    records = [aws_cloudfront_distribution.open_banking_public_website.domain_name]
    ttl     = 60
}

HTH

person Giulio Vian    schedule 26.08.2019
comment
Hai Giulio, saya masih menghadapi masalah yang sama dengan CNAME. Ada banyak kebingungan online dengan aws_acm_certificate_validation ini. Saya telah membaca tentang banyak orang yang menghadapi masalah serupa dengan saya dan sampai saat ini belum ada jawaban yang jelas. Saya menghargai Anda mencoba membantu di sini, terima kasih! - person AlessioG; 26.08.2019
comment
Saya memiliki kode yang berfungsi, bertanggal 4-6 minggu yang lalu di Terraform 0.12, sehingga bisa dilakukan. Saya tidak dapat membagikannya secara lengkap, tetapi sebaiknya ditampilkan sebagian melalui postingan blog. Akan memposting tautan ketika publik. - person Giulio Vian; 27.08.2019
comment
Itu akan membantu Giulio, Anda dapat melakukan ping ke sini jika Anda sudah menyiapkannya jika Anda bisa. - person AlessioG; 27.08.2019

Anda dapat menggunakan validate_certificate = false sebagai solusinya sekarang, tetapi masalah ini telah diselesaikan di versi terbaru modul ini, coba perbarui terraform Anda.

person lORD    schedule 25.08.2019
comment
versi terraform dan penyedia aws saya adalah yang terbaru sesuai dengan github.com/hashicorp/terraform/releases dan github.com/terraform-providers/terraform-provider-aws/ rilis. Saya tidak mengerti di mana saya harus memasukkan valdiate_certificate = false itu. Bisakah kamu lebih spesifik? - person AlessioG; 25.08.2019
comment
Saya juga tidak dapat menemukannya. Menghadapi masalah yang sama persis yang dimulai dari ketiadaan. - person Rafael Sales; 29.08.2019