2012-10-08 43 views

回答

17

S3不向CloudFront发送任何失效信息。默认情况下,CloudFront将保存信息,最长时间为缓存控制标头指定的最长时间,当从原始数据检索数据时它会设置此标头(如果感觉像这样,它可能会先从缓存中删除项目)。

您可以通过创建无效批次来使缓存条目无效。这会花费你的钱:每个月的第1000个请求是免费的,但除此之外,它每个请求的成本为0.005美元 - 如果你每天失去1000个文件,每月需要花费150美元(除非你可以使用通配符功能)。您当然可以使用Amazon Lambda函数来触发此事件,以响应s3事件。

另一种方法是在对象更改时使用不同的路径(实际上是世代缓存键)。同样,如果希望cloudfront获取新副本,则可以将查询参数追加到url并更改该查询参数(要执行此操作,您需要告诉CloudFront使用查询字符串参数 - 默认情况下会忽略它们)。

另一种方式,如果你只是不经常(但很大)的变化是简单地创建一个新的云端分布。

+0

我有一种可怕的感觉,情况是如此。看起来他们错过了一个功能。你能提供一个参考吗?还是只是没有指定?谢谢。 – Joe

+0

将一个新版本上传到S3意味着您想清除CloudFront中的缓存是一个错误的假设。是的,这可能是你正在寻找的行为,但是AWS会放任你放弃,这就是你想要的。在很多情况下,我会在CloudFront中将内容缓存,并知道它会根据我的设置过期,并会提前更新S3中的内容。就我而言,自动失效与我想要的相反。 –

+0

不假设,但它似乎是一个有用的参数。 – Joe

3

据我所知,所有的CDN都是这样工作的。

这就是为什么您通常使用类似foo-x.y.z.ext的东西来版本资产在CDN上。我不会使用foo.ext?x.y.z,因为某些浏览器和代理从不缓存?QUERY_STRING的资产。

一般来说,你可能要检查了这一点: https://developers.google.com/speed/docs/best-practices/caching

它包含了大量的最佳实践和进入细节做什么,它是如何工作。

关于S3和Cloudfront,我并不是非常熟悉缓存失效,但是冯检基所说的都是正确的。

有些提供程序还允许您直接清除缓存,但由于CDN的性质,这些更改几乎不会立即发生。另一种方法是设置较小的TTL(过期标题),以便资产更新更频繁。但我认为这也击败了CDN的目的。

在我们的案例(Edgecast)中,高速缓存失效是可能的(手动过程)且免费,但我们很少这样做,因为我们相应地版本化了我们的资产。

+0

感谢您的回答。我对S3和CloudFront(以及其他人)都很熟悉,我在询问这两种亚马逊产品之间的具体集成。 – Joe

+0

好的,我没有具体说明。所以是的 - 我的建议是仍然是版本资产,并在对象上设置“Cache-Control”标头。 – Till

+0

感谢看起来我只是要解决它。我仍然认为这是他们错过的一个必不可少且易于实现的功能。 – Joe