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 CDN 缓存永远不会失效,因为 S3 缓存永远不会改变。 CloudFront 不需要多次向 S3 请求一个文件。我想我已经使用 CloudFront 分发设置成功配置了它。
CloudFront 应使用 header Cache-Control: max-age=365000000, immutable
提供所有文件(immutable 是 2016 年部分支持的新值)
我不明白怎样才能达到预期的效果。我应该在 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.
我有一个 S3 存储桶,上面有 CloudFront CDN。
这个 S3 存储桶是 "immutable",这意味着一旦我将文件上传到那里,我就永远不会删除或更新它。这样所有客户端都非常积极地缓存来自 S3/CloudFront 的文件是安全的。
目前,Etags 运行良好,大多数时候客户会收到 304 响应。但是获得 304 响应仍然涉及往返,可以通过更积极的缓存来避免。
所以我想要这样的行为:
CloudFront CDN 缓存永远不会失效,因为 S3 缓存永远不会改变。 CloudFront 不需要多次向 S3 请求一个文件。我想我已经使用 CloudFront 分发设置成功配置了它。
CloudFront 应使用 header
Cache-Control: max-age=365000000, immutable
提供所有文件(immutable 是 2016 年部分支持的新值)
我不明白怎样才能达到预期的效果。我应该在 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.