我正试图用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")
}
默认情况下,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"
}
如果您有不同类型的各种对象要上传,您可能会发现使用共享模块hashicorp/dir/template
更容易,该模块在其实现中包括从文件名后缀到适当的content_type
值的默认映射表,因此您可以潜在地处理具有传统文件名后缀的文件目录,然后将结果系统地映射到S3对象中。