S3 网站下载文件而不是显示页面

时间:2021-06-28 08:06:42

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

我正在尝试使用 Terraform 在 S3 上设置静态页面。当我访问端点时,我的浏览器会尝试下载文件而不是显示页面。

resource "aws_s3_bucket" "b1" {
  bucket = "my-bucket"
  website {
    index_document = "index.html"
    error_document = "error.html"
  }
  tags = {
    Name        = "my bucket"
    Environment = "dev"
  }
}

resource "aws_s3_bucket_policy" "bucket_policy" {
  bucket = aws_s3_bucket.b1.id

  policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "PublicReadGetObject",
      "Effect": "Allow",
      "Principal": "*",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::my-bucket/*"
    }
  ]
}
EOF

}

resource "aws_s3_bucket_object" "object" {
  bucket = aws_s3_bucket.b1.id
  key    = "index.html"
  source = "myfiles/index.html"
  etag   = filemd5("myfiles/index.html")
}

1 个答案:

答案 0 :(得分:0)

默认情况下,S3 对象具有通用内容类型 application/octet-stream,浏览器通常仅通过下载文件来处理该类型,因为没有足够的信息来选择更具体的处理方式。

您可以使用 content_type 参数为 aws_s3_bucket_object 设置不同的内容类型。 HTML 文件的预期内容类型是 text/html,因此您可以像这样配置您的对象:

resource "aws_s3_bucket_object" "object" {
  bucket       = aws_s3_bucket.b1.id
  key          = "index.html"
  source       = "myfiles/index.html"
  etag         = filemd5("myfiles/index.html")
  content_type = "text/html"
}

如果您有各种不同类型的对象要上传,您可能会发现使用 the shared module hashicorp/dir/template 更容易,它在其实现中包含一个从文件名后缀到相应 content_type 值的默认映射表,因此,您可以潜在地处理具有传统文件名后缀的文件目录,然后是 map the result systematically into S3 objects