S3/CloudFront,使用 header "Cache-Control: max-age=365000000, immutable" 提供所有文件

S3/CloudFront, serve all files with header "Cache-Control: max-age=365000000, immutable"

我有一个 S3 存储桶,上面有 CloudFront CDN。

这个 S3 存储桶是 "immutable",这意味着一旦我将文件上传到那里,我就永远不会删除或更新它。这样所有客户端都非常积极地缓存来自 S3/CloudFront 的文件是安全的。

目前,Etags 运行良好,大多数时候客户会收到 304 响应。但是获得 304 响应仍然涉及往返,可以通过更积极的缓存来避免。

所以我想要这样的行为:

我不明白怎样才能达到预期的效果。我应该在 CloudFront 还是 S3 级别处理它?我已经阅读了一些关于为每个 S3 文件配置适当的 header 的内容。是否没有全局设置可以使用我可以使用的自定义 http header 为所有文件提供服务?

Should I handle that at CloudFront or S3 level?

目前没有用于在 Cloudfront 或 S3 中添加自定义 http headers 的全局设置。要将 http headers 添加到 objects,它们必须在 S3 中单独设置在存储桶中的每个 object 上。它们存储在 object 的元数据中 - 并且可以在 AWS S3 控制台中每个 object 的元数据部分找到。

通常,在将 object 添加到存储桶时设置 headers 最简单 - 这样做的确切机制取决于您使用的客户端应用程序或 sdk。

例如使用 aws cli 命令,您可以使用 --cache-control option:

aws s3 cp test.txt s3://mybucket/test2.txt \
    --cache-control max-age=365000000,immutable

要修改现有的 object,s3cmd 实用程序有一个 modify 选项,如此 SO 答案中所述:https://whosebug.com/a/22522942/6720449

或者您可以使用 aws s3 命​​令将 objects 复制回自己修改元数据,如 SO 答案中所述:https://whosebug.com/a/29280730/6720449。例如替换存储桶中所有 object 的元数据:

aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
    --cache-control max-age=365000000,immutable

CloudFront CDN cache should never get invalidated

这是一个非常严格的要求 - 您无法阻止云端缓存 永远 失效。也就是说,如果创建 Cloudfront 的用户具有足够的权限,则没有任何设置可以 阻止 创建 Cloudfront 失效。因此,以一种迂回的方式,您可以通过确保没有用户、角色或组有权使用 cloudfront:CreateInvalidation IAM 权限在分发中创建失效来防止失效——这可能不切实际。

但是,有几个原因可能会导致 Cloudfront 违反后端的 Cache-Control 选择使缓存无效 - 例如如果设置了 Maximum TTL 设置并且它小于 max-age.