使用 CloudFront 进行蓝/绿部署

Pet*_*r M 20 deployment amazon-cloudfront

我正在寻找一种使用CloudFront进行蓝/绿部署的方法。

有没有人有一个很好的解决方案来从一个 CloudFront 分布转移到另一个分布,或者每个人真的只是创建他们的分布然后再也不接触它?

我的 CloudFront 分配包含一个用于静态内容(javascript 等)的S3和一个指向 AWS ELB 的自定义源。

CloudFront 没有变化

在正常情况下,我们根本不会对 CloudFront 分配进行任何更改。我们通过更改 S3 中静态内容文件的名称对 S3 源中的静态内容进行版本控制,并在弹性负载均衡器 (ELB) 下滚动部署到 EC2 实例。但是,有时我们需要对 CloudFront 分发本身进行测试和更改,或者对我们的环境进行足够大的更改,以至于我们需要指向新环境中的新 ELB。

两个 CloudFront 分配

我尝试的第一个选项是拥有两个单独的 CloudFront Web Distributions,一个用于我当前的环境或 A 环境,另一个用于我的新环境或 B 环境。我尝试使用 Route53加权路由策略,其中我为 www.domain.com Route53 记录添加了两条记录,一条指向权重为 1 的 CloudFront Distribution A,另一个指向权重为 0 的 CloudFront Distribution B。计划是在我想从分配 A 转移到分配 B 时更改权重。 但是,一次只有一个 CloudFront 分配可以注册www.domain.com备用域名 (CNAME),否则您会收到以下错误:

com.amazonaws.services.cloudfront.model.CNAMEAlreadyExistsException: One or more of the CNAMEs you provided are already associated with a different resource. (Service: AmazonCloudFront; Status Code: 409; Error Code: CNAMEAlreadyExists; Request ID: ef84a5f0-44e7-11e5-9315-0ba167bb108a)
Run Code Online (Sandbox Code Playgroud)

一个 CloudFront 分配

第二种选择是保留一个 CloudFront Web 分配。我有 S3 和自定义源指向我的 A 和 B 环境,然后当我想从一个环境移动到另一个环境时,我更新 CloudFront缓存行为以指向另一个源。这是非常混乱的,因为这些更新需要 15-60 分钟,更新进度不可见,根据更改的性质,您可能需要使用CloudFront Invalidation跟进,这样您就不会提供缓存内容来自旧环境以及新内容。

谢谢你的建议!

mpa*_*paf 10

两个 Cloudfront 发行版

由于 AWS 允许在同一 AWS 账户中的通配符备用 CNAME 之间重叠,因此您可以通过以下方式在两个 Cloudfront 分配之间切换:

  • 使用 www.domain.com 作为 Prod 分发 1 的备用 CNAME
  • 使用 *.domain.com 作为 Prod 分发 2 的备用 CNAME
  • 将您的 CNAME DNS www.domain.com 指向分布 1 或分布 2。(*.cloudfront.net)。
  • 从您不想再提供内容的分发中删除备用 CNAME。

但是,两个不同的分发 DNS (*.cloudfront.net) 可能指向相同的边缘节点,这意味着提供内容的方式是将 cloudfront.net CNAME 与为其提供服务的边缘节点匹配,然后通过匹配主机名。在这种情况下,如果您的两个分布都使用相同的边缘节点(例如可以使用 进行检查dig),则切割将不干净。

例如,如果两个发行版共享一个或多个边缘节点,则带有 Alt CNAME www.domain.com 的发行版 1 将优先于带有更通用 *.domain.com 的发行版 2,直到 CNAME 从所有边缘节点的发行版 1 配置中删除. 因此,在过渡期间,从一个请求中检索到的版本可能与另一个不同。


Gar*_*y H 8

这里的游戏有点晚了,但对于其他正在寻找这个的人。我相信这可以使用 lambda@edge 来完成。类似于 A/B 测试。 https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html。您可以实现当用户请求 url 时触发的 lambda 函数。选择提供来自不同来源或 url 前缀的蓝色/绿色内容。cookie 值将确定将提供哪个部署。当第一个请求到达(没有 cookie)时,随机设置 cookie 说 95% 蓝色 5% 绿色。