Terraform无法使用静态S3网站终结点创建CloudFront的来源

时间:2019-03-07 09:42:50

标签: amazon-web-services terraform terraform-provider-aws

我有一个使用两个模块的计划:bucket-websitecloudfront-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}"
  }
.....
}

对计划中的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},所以老实说我不明白这是怎么回事。

1 个答案:

答案 0 :(得分:0)

找到解决方案。通过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"]
    }