CloudFlare 或 AWS CDN 链接

CloudFlare or AWS CDN links

我有一个安装在页面上的脚本,它将从 S3 存储桶加载更多 JS 和 CSS。

我有版本,所以当我在 Github 上发布 1.1.9 时,它将部署到 S3 上的 /my-bucket/1.1.9/

问题,如果我想要像符号 link /my-bucket/v1 -> /my-bucket/1.1.9 这样的东西,我如何使用 AWS 或 CloudFlare 实现它?

我的想法是,我想通过将新版本部署到我的存储桶或任何 CDN 来发布它,然后当我准备好时,我想切换 v1 到最新的 1.x.y版本发布。我希望所有网站都指向 /v1 并在有新版本时获取最新版本。

是否有 CDN 或 AWS 服务或配置允许我创建一种类似于 linux 的符号 link?

使用 CloudFront 的简单解决方案需要对您的路径设计稍作更改:

桶:

/1.1.9/v1/foo

浏览器:

/v1/foo

CloudFront 源路径(在源选项卡上)

/1.1.9

在将请求发送到源服务器之前,将您配置为源路径的任何内容添加到浏览器请求的任何内容的开头

请注意,更改此设置意味着您还需要执行缓存失效,因为响应是根据请求的内容而不是获取的内容进行缓存的。

这里有一个潜在的竞争条件,在你更改配置和失效之间——配置更改和失效请求之间的操作顺序没有关联——配置更改 followed通过 失效可能会在之后完成,¹ 因此可能需要失效、更新配置、失效、验证分发是否已进入稳定状态,然后再次失效。您不需要单独使对象失效,只需 /*/v1*。最好只重写直接请求的资源,而不是它的依赖项。另请记住,浏览器缓存可以节省大量成本,如果您随着时间的推移使用相同的请求 URI 来表示不同的对象,您将无法充分利用它。

CloudFront 中更复杂的路径重写需要 Lambda@Edge Origin Request 触发器(或者您可以使用 Viewer Request,但这些 运行 更频繁,因此成本更高并增加整体延迟)。


¹ 无效请求——虽然这没有记录并且严格来说是轶事——似乎涉及一些时间旅行。失效是有时间戳的,看起来它们使缓存在时间戳之前的任何内容失效,而不是在它们传播到边缘位置之前。从架构上讲,如果 CloudFront 的设计使得失效不会主动清除内容,而只是用作缓存的指令,以便在失效请求的时间戳之前将任何缓存的对象视为陈旧对象,从而允许实际清除在后台进行。对于任何其他解释来说,失效似乎完成得太快了。这意味着在分发 returns 到稳定的 Deployed 状态之后创建一个无效请求将确保所有旧的东西都被真正清除,并且在最初提交更改时另一个无效请求将捕获大部分散乱者可能在传播更改之前从缓存中提供服务。根据观察到的完成时间,更改和失效似乎确实通过独立管道传播到边缘。