如何用Terraform为S3对象指定多种Content-Type?
为AWS S3对象配置对应Content-Type的解决方案
你可以通过Terraform的本地变量定义MIME类型映射,结合字符串处理函数提取文件后缀,实现自动匹配对应Content-Type。具体实现如下:
- 定义MIME类型映射:创建本地变量,将常见文件后缀与标准Content-Type对应起来,可按需扩展。
- 提取后缀并匹配类型:通过正则函数获取文件后缀,转小写后从映射表中查找对应类型,无匹配时使用默认值。
修改后的完整代码:
locals { mime_types = { "js" = "application/javascript" "jpg" = "image/jpeg" "txt" = "text/plain" "html" = "text/html" "css" = "text/css" # 可根据需要添加更多类型,比如png、json等 } } resource "aws_s3_object" "object" { for_each = fileset("${path.module}/travel-agency-html-template", "**/*") bucket = aws_s3_bucket.My_bucket.bucket key = each.value source = "${path.module}/travel-agency-html-template/${each.value}" etag = filemd5("${path.module}/travel-agency-html-template/${each.value}") # 提取文件后缀并匹配对应Content-Type,无匹配则用默认二进制流类型 content_type = lookup( local.mime_types, lower(try(regex("\\.([^.]+)$", each.value)[0], "")), "application/octet-stream" ) depends_on = [aws_s3_bucket_policy.bucket_policy] }
代码说明
local.mime_types:集中维护后缀与Content-Type的映射关系,后续新增文件类型只需在此添加。regex("\\.([^.]+)$", each.value)[0]:用正则提取文件名最后一个.后的后缀部分。try(..., ""):处理无后缀文件的情况,避免正则匹配失败报错。lower(...):统一转小写,兼容HTML、JPG这类大写后缀的文件。lookup(..., "application/octet-stream"):从映射表取值,无匹配时使用通用二进制流类型作为默认值。
内容的提问来源于stack exchange,提问作者charles uneze
相关产品推荐
相关产品推荐

