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

7

我有一个计划,使用两个模块:bucket-websitecloudfront-website

在 bucket 模块中,除了策略和其他内容之外,还有以下资源用于创建并将其作为网站提供服务的对象:

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模块拥有一个包含所有CloudFront属性(IP地址、缓存等)的资源,但相关部分如下:

resource "aws_cloudfront_distribution" "distribution" {
.....
  origin {
    domain_name = "${var.domain_name}"
    origin_id   = "${var.domain_name}"
  }
.....
}

在计划中调用云前缀模块时,将传递以下参数:
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控制台进行设置,即获取Bucket的静态Web端点(与标准Bucket端点不同)并将其用作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个回答

16

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

1
您如何解决创建 Origin Access Identity 的问题,以便只有 CloudFront 分发可以访问您的 S3 存储桶? - GreenyMcDuff
我认为你需要在存储桶策略中通过为资源属性(标识符)分配发布 ARN 来完成这项操作。这只是一个猜测。如果有人正在寻找 Terraform 中确切的配置,则可以确认。 - user2347763

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接