我正在使用具有S3源的AWS cloudfront。我使用webpack插件使用chunked hash file names对我的所有静态文件(不包括index.html)进行缓存 - 我将在每个新版本上使用cloudfront功能无效。
我计划使用jenkins构建来运行aws s3 sync ./dist s3://BUCKET-NAME/dist
--recursive --delete
,这将根据需要换出新的分块文件。然后我将覆盖index.html
文件以使用新的chunked引用。在将旧文件换成新文件所花费的几秒钟(最大值)期间,用户可能会从cloudfront尚未缓存资源的区域向网站发出请求,此时他们可以使用该文件。因为我刚刚删除了它们,所以将不可用。
我找不到任何有关避免这种边缘情况的信息。
答案 0 :(得分:4)
是的,可能会发生在不同边缘位置附近的人遇到丢失的文件。要解决此问题,您需要更改执行新部署的方法,因为缓存清除和时间在请求 - 响应级别是不可预测的。一种常用的模式是在S3中为每个新部署保留不同的目录(路径),如下所示。
For release v1.0
/dist/v1.0/js/*
/dist/v1.0/css/*
/dist/index.html <- index.html for v1.0 release which has reference for js & css in /dist/v1.0 path
For release v1.1
/dist/v1.1/js/*
/dist/v1.1/css/*
/dist/index.html <- index.html for v1.1 release which has reference for js & css in /dist/v1.1 path
每次部署后,用户将收到index.html的旧版本(v1.0)或新版本(v1.1),这些版本在过渡期间仍然有效,直到边缘缓存被终止。< / p>
您可以使用Jenkins自动化版本控制,无论是递增版本还是使用parameterize build plugin。
这对于进行不可变部署也很有用,在发生严重问题的情况下,您可以回滚到以前的部署。除此之外,您还可以配置S3生命周期管理规则以存档旧版本。
答案 1 :(得分:1)
以下是我解决这个问题的方法。
删除flat不会解决问题。 由于你有分块的哈希文件名,我假设你只有index.html不是哈希文件名。
收集所有需要删除的旧文件
aws s3 ls s3://bucket
部署新版本中的所有文件。
aws s3 cp ./dist s3://bucket
现在使用mv或删除
删除旧文件aws s3 rm files you collected before except index.html
您的新网站现在将随新应用一起提供。
希望它有所帮助。
答案 2 :(得分:0)
名为Stout的库可以自动为您完成所有操作。这是节省时间的主要方法。我和他们没有关系,我真的很喜欢。
一些好处:
用法:
stout deploy --bucket my-bucket-name --root path/to/website