ไม่มีบันทึกการตรวจสอบ DNS เมื่อใช้ terraform aws_acm_certificate_validation

ฉันติดอยู่กับข้อผิดพลาด Terraform ตลอดทั้งวันในขณะที่พยายามสร้างทรัพยากร AWS Route53 และทรัพยากร AWS Certificate Manager 2 บิตนี้เป็นส่วนหนึ่งของโครงการที่กว้างขึ้น (เว็บไซต์ที่โฮสต์ใน s3 ผ่านคุณสมบัติการให้บริการแบบคงที่)

โดยเฉพาะข้อผิดพลาดปรากฏขึ้นในระหว่างการตรวจสอบ DNS ของใบรับรอง เมื่อมีการแทรกบันทึก CNAMEs เป็นบันทึก DNS ใน Route53

ฉันจะจัดวางข้อผิดพลาดแล้วจึงอธิบายการตั้งค่า

ข้อผิดพลาด

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" {

หมายเหตุ: ฉันไม่ได้รวมแผนการดำเนินการที่สร้างบิตอื่นๆ ของโครงสร้างพื้นฐาน แต่ฉันรายงานเฉพาะบิตที่มีปัญหาเท่านั้น

นี่คือไฟล์ tf ของฉัน:

เส้นทาง 53.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"
    }
}

การแจกจ่าย.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"
    }
}

เวอร์ชัน Terraform: 0.12.7, เวอร์ชันผู้ให้บริการ aws: v2.25.0_x4

การวิเคราะห์บันทึกข้อผิดพลาด

ขณะที่ฉันใช้เวลาหนึ่งวันในการพยายามแก้ไขข้อผิดพลาดข้างต้น ต่อไปนี้เป็นความคิดของฉัน:

  • ใบรับรองกำลังสร้าง 2 CNAME สำหรับ 2 โดเมน (ตัวแปร: var.domain_name, var.domain_name_www): _7bc5230529c8192e8e697aeab0ec0eb9.idarth.com._CNAME, _18ff46dac48c6d852b696306dfa57093.www.idarth คอม
  • การสร้างอันแรกดังที่คุณเห็นในบันทึกของแผนการดำเนินการนั้นถูกสร้างขึ้นสำเร็จแล้ว ในขณะที่อันที่สองก่อให้เกิดปัญหา
  • เมื่อดูในคอนโซล AWS ฉันเห็น CNAME แรกแทรกอยู่ในโซนที่โฮสต์ DNS แต่ไม่ใช่ครั้งที่สอง แม้ว่าจะแทรกโซนที่โฮสต์ DNS ใบรับรองสำหรับระเบียนนั้นยังคงส่งผลให้มีการตรวจสอบที่รอดำเนินการ

นี่คือสิ่งที่ฉันพบจนถึงตอนนี้ แต่ฉันไม่รู้ว่าจะก้าวไปข้างหน้าอย่างไร ใครเคยมาที่นี่แล้วช่วยหน่อยได้มั้ยคะ

ขอบคุณ!




คำตอบ (4)


ไม่แน่ใจว่าสิ่งนี้ยังเกี่ยวข้องอยู่หรือไม่ แต่ฉันประสบปัญหาเดียวกันในวันนี้และพบคำถามนี้ที่นี่ ดังนั้นบางทีฉันอาจจะทิ้งคำตอบไว้ให้กับลูกหลาน

ปรากฎว่าทรัพยากรการตรวจสอบความถูกต้องจำเป็นต้องรวม CNAME ที่สร้างขึ้นทั้งหมด เช่น:

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
}

โปรดทราบว่าเรามีทรัพยากร aws_acm_certificate_validation แหล่งเดียว แต่มีรายการ validation_record_fqdns หลายรายการจากระเบียน CNAME DNS สำหรับการตรวจสอบความถูกต้องที่สร้างขึ้นทั้งหมด

หวังว่าจะช่วยได้!

person Marcin Wyszynski    schedule 29.10.2019
comment
Terraform ส่งข้อความแสดงข้อผิดพลาดแจ้งว่า ค่าการนับขึ้นอยู่กับคุณลักษณะของทรัพยากรที่ไม่สามารถกำหนดได้จนกว่าจะนำไปใช้ ดังนั้น Terraform จึงไม่สามารถคาดเดาได้ว่าจะสร้างอินสแตนซ์จำนวนเท่าใด คุณทำอะไรเพื่อสิ่งนี้? คุณใช้ -target หรือไม่? - person nsantiago2719; 30.10.2019
comment
คิดออกแล้ว สร้างรายการตัวแปรของชื่อทางเลือกแล้วใช้สำหรับการนับ อดีต. count = length(var.alternative-names) + 1. - person nsantiago2719; 30.10.2019
comment
ใช่นั่นเป็นทางเลือกหนึ่ง อีกทางเลือกหนึ่งคือแบ่งออกเป็นสองรัน - ขั้นแรก สร้างเรกคอร์ด จากนั้นจึงตรวจสอบความถูกต้อง - person Marcin Wyszynski; 30.10.2019

นี่คือวิธีที่ฉันแก้ไขสิ่งนี้ในการกำหนดค่าของฉันด้วยการแก้ไขคำตอบจาก Marcin Wyszynski เล็กน้อย เนื่องจากการตรวจสอบความถูกต้องอาจส่งผลให้เกิดบันทึก DNS ที่ซ้ำกัน ให้ใช้ allow_overwrite = true ใน aws_route53_record เพื่อข้ามข้อผิดพลาด already exists และตรวจสอบให้แน่ใจว่าสร้างขึ้นทั้งหมดแล้ว

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

โซนไม่ควรมีจุดสุดท้าย . ?

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

ในสถานการณ์ที่คล้ายกัน ฉันใช้ CNAME สำหรับบันทึก DNS ที่ชี้ไปที่การกระจาย 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
}

person Giulio Vian    schedule 26.08.2019
comment
สวัสดี Giulio ฉันยังคงประสบปัญหาเดียวกันกับ CNAME มีความสับสนมากมายทางออนไลน์กับ aws_acm_certificate_validation นี้ ฉันได้อ่านเกี่ยวกับผู้คนจำนวนมากที่ประสบปัญหาคล้ายกันกับฉัน และยังไม่มีคำตอบที่ชัดเจนในขณะนี้ ฉันขอขอบคุณที่คุณพยายามช่วยที่นี่ ขอบคุณ! - person AlessioG; 26.08.2019
comment
ฉันมีโค้ดที่ใช้งานได้เมื่อ 4-6 สัปดาห์ที่แล้วใน Terraform 0.12 ดังนั้นจึงสามารถทำได้ ฉันไม่สามารถแบ่งปันได้ทั้งหมด แต่ควรเปิดเผยบางส่วนผ่านโพสต์บนบล็อก จะโพสต์ลิงค์เมื่อเปิดเป็นสาธารณะ - person Giulio Vian; 27.08.2019
comment
นั่นจะช่วยจูลิโอได้ คุณสามารถ Ping ได้ที่นี่เมื่อคุณพร้อมแล้วถ้าทำได้ - person AlessioG; 27.08.2019

คุณสามารถใช้ validate_certificate = false เป็นวิธีการแก้ปัญหาชั่วคราวได้ในขณะนี้ แต่ปัญหานี้ได้รับการแก้ไขแล้วในเวอร์ชันใหม่ล่าสุดของโมดูลนี้ โปรดลองอัปเดต Terraform ของคุณ

person lORD    schedule 25.08.2019
comment
ทั้ง Terraform ของฉันและเวอร์ชันผู้ให้บริการ aws ของฉันเป็นเวอร์ชันล่าสุดตาม github.com/hashicorp/terraform/releases และ github.com/terraform-providers/terraform-provider-aws/ เผยแพร่ ฉันไม่เข้าใจว่าควรแทรก valdiate_certificate = false ไว้ที่ไหน คุณช่วยเจาะจงกว่านี้ได้ไหม? - person AlessioG; 25.08.2019
comment
ฉันก็หาสิ่งนั้นไม่เจอเช่นกัน เผชิญกับปัญหาเดียวกันที่เริ่มต้นจากความไม่มีอะไรเลย - person Rafael Sales; 29.08.2019