如何部署新的 cloudfront s3 版本而不会出现短暂的不可用?

apd*_*pdm 5 amazon-s3 amazon-web-services amazon-cloudfront

我正在使用带有 S3 源的 AWS cloudfront。我正在使用 webpack 插件对我的所有静态文件(index.html 除外)使用分块哈希文件名进行缓存破坏,我将在每个新版本中使用 cloudfront 功能使其失效。

我计划使用 jenkins 构建来运行aws s3 sync ./dist s3://BUCKET-NAME/dist --recursive --delete,它将根据需要换出新的分块文件。然后我将覆盖index.html文件以使用新的分块引用。在将旧文件交换为新文件所需的几秒钟(最大)期间,用户可能会从 cloudfront 尚未缓存资源的区域向网站发出请求,此时他们将不可用,因为我刚刚删除了它们。

我找不到有关避免这种边缘情况的任何信息。

Ash*_*han 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
Run Code Online (Sandbox Code Playgroud)

每次部署后,用户将收到旧版本(v1.0)或新版本(v1.1)的index.html,该版本在过渡期间仍然有效,直到边缘缓存被破坏。

您可以使用 Jenkins 自动化版本控制,无论是增加版本还是使用参数化构建插件

这对于执行不可变部署也很有用,在出现关键问题的情况下,您可以回滚到以前的部署。除此之外,您还可以配置 S3 生命周期管理规则来归档旧版本。