我正在尝试使用 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")
}
答案 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。