Terraform 无法使用静态 S3 网站端点创建 CloudFront 的来源
Terraform can't create a CloudFront's origin with a static S3 website endpoint
我有一个使用两个模块的计划:bucket-website
和 cloudfront-website
除存储桶模块内的其他内容(策略等)外,还有以下用于创建存储桶并将其用作网站的资源:
resource "aws_s3_bucket" "bucket-website" {
bucket = "${var.bucket_name}"
region = "${var.region}"
website {
index_document = "index.html"
}
tags = "${local.common_tags}"
}
此模块还具有以下输出:
output "website_endpoint" {
value = "${aws_s3_bucket.bucket-website.website_endpoint}"
}
cloudfront-website
模块具有包含所有这些云端属性(IP、缓存内容等)的资源,但相关部分是:
resource "aws_cloudfront_distribution" "distribution" {
.....
origin {
domain_name = "${var.domain_name}"
origin_id = "${var.domain_name}"
}
.....
}
plan中调用cloudfront模块传递如下参数:
domain_name = "${module.bucket-website.website_endpoint}"
我可以确认这个值是正确的,因为在terraform apply
的日志中可以看到:
origin.123456.domain_name: "" => "foo.s3-website-eu-west-1.amazonaws.com"
origin.123456.origin_id: "" => "foo.s3-website-eu-west-1.amazonaws.com"
如果我仅使用 AWS 控制台进行此设置,即获取存储桶的静态 Web 端点(不同于标准存储桶端点),这与我将使用的相同端点并将其用作 Cloudfront 的来源。
但是,出于某种原因,Terraform 抱怨域名:
* aws_cloudfront_distribution.distribution: error creating CloudFront Distribution: InvalidArgument: The parameter Origin DomainName does not refer to a valid S3 bucket.
而且我已经没主意了。一切看起来都很好。终点是正确的。我检查了其他例子,他们也使用 ${aws_s3_bucket.<BUCKET_RESOURCE_NAME>.website_endpoint}
,所以老实说我不明白哪里出了问题。
刚刚找到解决方案。通过 CloudFront 为 S3 网站提供服务时,必须将以下代码添加到 origin
部分,即使其他地方未指定这样做。
custom_origin_config {
http_port = "80"
https_port = "443"
origin_protocol_policy = "http-only"
origin_ssl_protocols = ["TLSv1", "TLSv1.1", "TLSv1.2"]
}
我有一个使用两个模块的计划:bucket-website
和 cloudfront-website
除存储桶模块内的其他内容(策略等)外,还有以下用于创建存储桶并将其用作网站的资源:
resource "aws_s3_bucket" "bucket-website" {
bucket = "${var.bucket_name}"
region = "${var.region}"
website {
index_document = "index.html"
}
tags = "${local.common_tags}"
}
此模块还具有以下输出:
output "website_endpoint" {
value = "${aws_s3_bucket.bucket-website.website_endpoint}"
}
cloudfront-website
模块具有包含所有这些云端属性(IP、缓存内容等)的资源,但相关部分是:
resource "aws_cloudfront_distribution" "distribution" {
.....
origin {
domain_name = "${var.domain_name}"
origin_id = "${var.domain_name}"
}
.....
}
plan中调用cloudfront模块传递如下参数:
domain_name = "${module.bucket-website.website_endpoint}"
我可以确认这个值是正确的,因为在terraform apply
的日志中可以看到:
origin.123456.domain_name: "" => "foo.s3-website-eu-west-1.amazonaws.com"
origin.123456.origin_id: "" => "foo.s3-website-eu-west-1.amazonaws.com"
如果我仅使用 AWS 控制台进行此设置,即获取存储桶的静态 Web 端点(不同于标准存储桶端点),这与我将使用的相同端点并将其用作 Cloudfront 的来源。
但是,出于某种原因,Terraform 抱怨域名:
* aws_cloudfront_distribution.distribution: error creating CloudFront Distribution: InvalidArgument: The parameter Origin DomainName does not refer to a valid S3 bucket.
而且我已经没主意了。一切看起来都很好。终点是正确的。我检查了其他例子,他们也使用 ${aws_s3_bucket.<BUCKET_RESOURCE_NAME>.website_endpoint}
,所以老实说我不明白哪里出了问题。
刚刚找到解决方案。通过 CloudFront 为 S3 网站提供服务时,必须将以下代码添加到 origin
部分,即使其他地方未指定这样做。
custom_origin_config {
http_port = "80"
https_port = "443"
origin_protocol_policy = "http-only"
origin_ssl_protocols = ["TLSv1", "TLSv1.1", "TLSv1.2"]
}