Amazon web services 如何用另一个CloudFront发行版替换我的CloudFront发行版,而不让用户停机

Amazon web services 如何用另一个CloudFront发行版替换我的CloudFront发行版,而不让用户停机,amazon-web-services,amazon-cloudfront,Amazon Web Services,Amazon Cloudfront,初始设置 在AWS上,我有一个弹性Beanstalk EB服务器,它提供页面服务。 在任何一个月内,对于一个特定的请求,它都将始终提供相同的数据,因此我建立了Cloudfront发行版,以更好地为客户服务并减少服务器点击。 在Route53中,将域配置为指向Cloudfront分发 所有客户访问都是通过此域进行的 每月 我部署了一个新版本的EB服务器 然后,我想使CloudFront中的所有页面无效,以便它能够从EB服务器获取最新数据。 但是失效是缓慢和昂贵的,所以我的计划是创建一个新的Clou

初始设置

在AWS上,我有一个弹性Beanstalk EB服务器,它提供页面服务。 在任何一个月内,对于一个特定的请求,它都将始终提供相同的数据,因此我建立了Cloudfront发行版,以更好地为客户服务并减少服务器点击。 在Route53中,将域配置为指向Cloudfront分发 所有客户访问都是通过此域进行的 每月

我部署了一个新版本的EB服务器 然后,我想使CloudFront中的所有页面无效,以便它能够从EB服务器获取最新数据。 但是失效是缓慢和昂贵的,所以我的计划是创建一个新的Cloudfront发行版。然后修改我的Route53域以指向新的CloudFront,然后在完成后删除原始的CloudFront发行版

问题在于,如果您设置了另一个发行版已经使用的备用CName,CloudFront不允许您创建新发行版。所以,我不能创建我的新发行版,除非我禁用并删除了现有的发行版,然后我必须部署我的新发行版,这需要很长时间,而且网站将在这段时间内关闭

我的选择如下

部署新的EB服务器 指向新EB服务器负载平衡器的点路由53 禁用CloudFront分发,然后等待。 删除CloudFront分发,然后等待。 创建新的CloudFront发行版,然后等待。 将路由53域指向新的CloudFront分发
有一个笑话的变体说,有些人在遇到问题时会想,‘我知道,我会使用缓存。’现在他们有两个问题

一般来说,在使用CDN时,需要失效,特别是立即失效是一种反模式。有几种方法可以解决这个问题:

最好在分发版中提供内容链接时,对链接进行版本设置。你说它每月都会变化,所以也许/image-2015-04.jpg是上个月的图像,现在是/image-2015-05.jpg。 使用缓存控制头,以便每次或可能每小时对内容进行重新验证
使用Route53来实现这一点是粗略的-不仅DNS有TTL缓存周期,而且并非所有服务器都支持短TTL。

有一个笑话说,有些人在遇到问题时会想,‘我知道,我会使用缓存。’现在他们有两个问题

一般来说,在使用CDN时,需要失效,特别是立即失效是一种反模式。有几种方法可以解决这个问题:

最好在分发版中提供内容链接时,对链接进行版本设置。你说它每月都会变化,所以也许/image-2015-04.jpg是上个月的图像,现在是/image-2015-05.jpg。 使用缓存控制头,以便每次或可能每小时对内容进行重新验证
使用Route53来实现这一点是粗略的-不仅DNS有一个TTL缓存周期,而且并非所有服务器都支持短TTL。

您实际上不必等待分发被删除才能重用cname。我也做类似的事情

创建一个新发行版,该发行版的设置与我当前的发行版相同,但不包括cname设置 从旧发行版中删除cname,保存 立即将cname添加到新发行版 更新DNS以指向新的分发 保留旧的分发版,直到两者都部署完毕 禁用然后删除,以进行清理
由于我使用了cloudfront发行版的别名,所以我不担心解析程序缓存我以前cloudfront提供的DNS名称。这对我来说效果相当不错。

实际上,你不必等到发行版被删除后再重新使用cname。我也做类似的事情

创建一个新发行版,该发行版的设置与我当前的发行版相同,但不包括cname设置 从旧发行版中删除cname,保存 立即将cname添加到新发行版 更新DNS以指向新的分发 保留旧的分发版,直到两者都部署完毕 禁用然后删除,以进行清理
由于我使用了cloudfront发行版的别名,所以我不担心解析程序缓存我以前cloudfront提供的DNS名称。这对我来说效果相当不错。

我想您可能会认为需要使用缓存控制头或版本控制是正确的,但我只是想让它保持简单。然而,还有另一种情况无法解决——代码更改。如果我需要部署一个新版本的服务器,并且它依赖于新的css/javascript等,那么它们都需要在CloudFront中失效-在这种情况下你会怎么做?你的服务器可能链接到静态内容。在代码更改的情况下,使用新内容的新唯一路径。这是非常常见的-Ruby有一个自动完成这项工作的资产管道。作为一个简单的例子-也许你的main.css变成了main-{{git hash}}.css。静态内容(如css)部署在软件中,即它不存储在单独的S3缓存中,但关键是所有内容都经过CloudFront,所以CloudFront只服务于现有的widget.css,而不是试图获取
服务器上有一个新的。我不太喜欢在实际代码中添加版本控制的想法,只是为了处理Cloudfront问题。问题是这不是Cloudfront问题,而是缓存尤其是CDN的工作方式。好吧,我不想为了让它们与CDN一起工作而更改代码,这不是不合理的,是吗?我想你可能会正确地认为需要使用缓存控制头或版本控制,但我只是想让它保持简单。然而,还有另一种情况无法解决——代码更改。如果我需要部署一个新版本的服务器,并且它依赖于新的css/javascript等,那么它们都需要在CloudFront中失效-在这种情况下你会怎么做?你的服务器可能链接到静态内容。在代码更改的情况下,使用新内容的新唯一路径。这是非常常见的-Ruby有一个自动完成这项工作的资产管道。作为一个简单的例子-也许你的main.css变成main-{{git hash}}.css。静态内容(如css)部署在软件中,即它不存储在单独的S3缓存中,但关键是所有内容都经过CloudFront,所以CloudFront只服务于现有的widget.css,而不是试图从服务器获取新的widget.css。我不太喜欢在我的实际代码中添加版本控制的想法,只是为了处理Cloudfront问题。问题是这不是Cloudfront问题,而是缓存尤其是CDN的工作方式。好吧,我不想为了让它们与CDN一起工作而对代码进行更改,这不是不合理的,是吗?现在尝试,但是与部署EB服务器相比,为什么Cloudfront的部署速度如此之慢呢?这是因为Cloudfront需要将更改部署到全球大约100个POP上。可能会更快,提醒你。。。但它要做的事情远不止一个EB部署。现在就开始尝试,但为什么在Cloudfront中部署要比部署EB服务器慢得多呢?这是因为Cloudfront需要将更改部署到全球大约100个POP上。可能会更快,提醒你。。。但是,除了一次EB部署,it还有很多事情要做。