Предоставление дистрибутива AWS Cloudfront с выданным сертификатом AWS ACM с использованием Terraform

Я пытаюсь создать дистрибутив AWS Cloudfront с помощью Terraform и с использованием сертификата Amazon Issued.

  • Мы можем успешно проверить сертификат с помощью CNAME на нашем DNS-сервере.

  • Мы можем вручную создать дистрибутив Cloudfront через консоль, используя сертификат (созданный в us-east-1, который является обязательным для Cloudfront для использования сертификатов, поскольку Cloudfront является глобальной службой).

Однако когда мы пытаемся создать дистрибутив Cloudfront с использованием Terraform, мы получаем сообщение об ошибке, в котором говорится, что

Ошибка: ошибка при применении плана:

1 ошибка (ы) произошла:

  • aws_cloudfront_distribution... secret.._ распределение: 1 произошла ошибка:

  • aws_cloudfront_distribution... secret.._ distribution: ошибка при создании CloudFront Распространение: InvalidViewerCertificate: указанный сертификат SSL не существует, не находится в регионе us-east-1, недействителен или не содержит допустимой цепочки сертификатов, код состояния: 400, идентификатор запроса:..request id..

Наша Terraform HCL выглядит следующим образом:

certificate.tf

resource "aws_acm_certificate" "c" {
  domain_name               = "..secret.."
  subject_alternative_names = []
  validation_method         = "DNS"
}

cloudfront.tf

resource "aws_cloudfront_distribution" "...secret..._distribution" {
  origin {
    domain_name = "dev-...secret....s3-website-eu-west-1.amazonaws.com"
    origin_id   = "dev-...secret...-s3-origin"

    custom_origin_config {
      http_port              = 80
      https_port             = 443
      origin_protocol_policy = "http-only"
      origin_ssl_protocols   = ["TLSv1.2", "TLSv1.1", "TLSv1"]
    }
  }

  aliases = ["...secret..."]

  enabled = true

  default_cache_behavior {
    allowed_methods  = ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
    cached_methods   = ["GET", "HEAD"]
    compress         = true
    target_origin_id = "dev-...secret...-s3-origin"

    forwarded_values {
      query_string = true

      cookies {
        forward = "all"
      }
    }

    viewer_protocol_policy = "redirect-to-https"

    min_ttl     = 0
    default_ttl = 3600
    max_ttl     = 86400
  }

  price_class = "PriceClass_100"

  restrictions {
    geo_restriction {
      restriction_type = "none"
    }
  }

  viewer_certificate {
    acm_certificate_arn      = "${var.certificate_arn}"
    ssl_support_method       = "sni-only"
    minimum_protocol_version = "TLSv1"
  }
}

вывод из aws acm describe-certificate --region us-east-1 --certificate-arn arn:aws:acm:us-east-1:secret:certificate/secret

{
    "Certificate": {
        "Subject": "CN=secret",
        "SubjectAlternativeNames": [
            "secret"
        ],
        "Serial": "04:0c:6d:0b:f0:e4:86:0b:0c:4f:df:c6:c5:75:86:90",
        "NotAfter": 1568635200.0,
        "SignatureAlgorithm": "SHA256WITHRSA",
        "KeyAlgorithm": "RSA-2048",
        "KeyUsages": [
            {
                "Name": "DIGITAL_SIGNATURE"
            },
            {
                "Name": "KEY_ENCIPHERMENT"
            }
        ],
        "IssuedAt": 1534421702.0,
        "NotBefore": 1534377600.0,
        "CertificateArn": "arn:aws:acm:us-east-1:secret:certificate/secret",
        "Status": "ISSUED",
        "CreatedAt": 1534421597.0,
        "DomainValidationOptions": [
            {
                "ResourceRecord": {
                    "Name": "_4e7f671800255b1ccdf49d9bb0d673e4.secret.",
                    "Value": "_b8daffbcee55e3fd61560867489f4780.tljzshvwok.acm-validations.aws.",
                    "Type": "CNAME"
                },
                "DomainName": "secret",
                "ValidationStatus": "SUCCESS",
                "ValidationMethod": "DNS"
            }
        ],
        "InUseBy": [
            "arn:aws:cloudfront::secret:distribution/secret"
        ],
        "RenewalEligibility": "ELIGIBLE",
        "DomainName": "secret",
        "Type": "AMAZON_ISSUED",
        "Options": {
            "CertificateTransparencyLoggingPreference": "ENABLED"
        },
        "Issuer": "Amazon",
        "ExtendedKeyUsages": [
            {
                "Name": "TLS_WEB_SERVER_AUTHENTICATION",
                "OID": "1.3.6.1.5.5.7.3.1"
            },
            {
                "Name": "TLS_WEB_CLIENT_AUTHENTICATION",
                "OID": "1.3.6.1.5.5.7.3.2"
            }
        ]
    }
}

1 ответ

aws_acm_certificateresource используется для запроса нового сертификата. Поэтому, когда вы запустите ваш код, он запросит новый сертификат и в соответствии с документами:

Он не ждет выдачи сертификата

Таким образом, скорее всего, создается новый сертификат, который займет некоторое время, и ресурс не ждет, пока он это сделает, то есть Cloudfront не сможет найти его вовремя.

Так как похоже, что вы просто хотите повторно использовать существующий сертификат, вы можете использовать aws_acm_certificatedata провайдер, чтобы получить его детали вместо этого:

data "aws_acm_certificate" "secret" {
  domain   = "secret.example.com"
  statuses = ["ISSUED"]
}

Проверьте документы здесь

Другие вопросы по тегам