S3/CloudFront,提供标题为"Cache-Control:max-age = 365000000,immutable"的所有文件

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.