Предоставление дистрибутива 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_certificate
resource
используется для запроса нового сертификата. Поэтому, когда вы запустите ваш код, он запросит новый сертификат и в соответствии с документами:
Он не ждет выдачи сертификата
Таким образом, скорее всего, создается новый сертификат, который займет некоторое время, и ресурс не ждет, пока он это сделает, то есть Cloudfront не сможет найти его вовремя.
Так как похоже, что вы просто хотите повторно использовать существующий сертификат, вы можете использовать aws_acm_certificate
data
провайдер, чтобы получить его детали вместо этого:
data "aws_acm_certificate" "secret" {
domain = "secret.example.com"
statuses = ["ISSUED"]
}
Проверьте документы здесь