Seb*_*ber 7 caching cache-control amazon-s3 amazon-web-services amazon-cloudfront
我有一个S3存储桶,其上面有CloudFront CDN.
这个S3存储桶是"不可变的",这意味着一旦我在那里上传文件,我就永远不会删除它或更新它.所有客户端都可以非常积极地缓存来自S3/CloudFront的文件.
目前,Etags工作得非常好,客户大多数时间都会收到304回复.但是获得304响应仍然需要通过更积极的缓存来避免往返.
所以我想要这样的行为:
CloudFront CDN缓存永远不会失效,因为S3缓存永远不会更改.CloudFront不需要再次向S3询问文件多次.我想我已经使用CloudFront分配设置成功配置了它.
CloudFront应该使用标头提供所有文件Cache-Control: max-age=365000000, immutable(截至2016年,immutable是一个新的,部分支持的值)
我不明白我怎样才能达到预期的效果.我应该在CloudFront或S3级别处理吗?我已经阅读了一些关于为每个S3文件配置适当标头的内容.是不是有一个全局设置来提供我可以使用的自定义http标头的所有文件?
Chr*_*mon 17
我应该在CloudFront或S3级别处理吗?
目前没有在Cloudfront或S3中添加自定义http标头的全局设置.要将HTTP标头添加到对象,必须在S3中单独设置它们,以便在存储桶中的每个对象上单独设置.它们存储在对象的元数据中 - 可以在AWS S3控制台中的每个对象的"元数据"部分中找到.
通常,在将对象添加到存储桶时设置标头最简单 - 这样做的确切机制取决于您使用的客户端应用程序或sdk.
例如,使用aws cli命令,您可以使用以下--cache-control选项:
aws s3 cp test.txt s3://mybucket/test2.txt \
--cache-control max-age=365000000,immutable
Run Code Online (Sandbox Code Playgroud)
要修改现有对象,该s3cmd实用程序有一个modify选项,如本答案中所述:https://stackoverflow.com/a/22522942/6720449
或者您可以使用aws s3命令将对象复制回自身修改元数据,如本答案中所述:https://stackoverflow.com/a/29280730/6720449.例如,替换存储桶中所有对象的元数据:
aws s3 cp s3://mybucket/ s3://mybucket/ --recursive --metadata-directive REPLACE \
--cache-control max-age=365000000,immutable
Run Code Online (Sandbox Code Playgroud)
CloudFront CDN缓存永远不会失效
这是一个相当严格的要求-你不能阻止CloudFront的缓存中不断得到无效.也就是说,如果创建Cloudfront失败的用户具有足够的权限,则没有任何设置可以阻止创建Cloudfront失败.因此,以迂回的方式,您可以通过确保没有用户,角色或组具有使用cloudfront:CreateInvalidationIAM权限在分发中创建失效的权限来防止失效- 这可能不实用.
但是,Cloudfront可能会选择在违反后端的Cache-Control的情况下使缓存无效,这有几个原因 - 例如,如果设置了最大TTL设置并且它小于max-age.
| 归档时间: |
|
| 查看次数: |
4563 次 |
| 最近记录: |