我正在寻找一种使用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 分配 A,另一条指向权重为 0 的 CloudFront 分配 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)
一个 CloudFront 分配
第二种选择是保留一个 CloudFront Web 分配。我有 S3 和自定义源指向我的 A 和 B 环境,然后当我想从一个环境移动到另一个环境时,我更新 CloudFront缓存行为以指向另一个源。这非常混乱,因为这些更新需要 15 到 60 分钟,无法看到更新的进度,并且根据您的更改的性质,您可能需要使用CloudFront 失效来跟进,这样您就不会提供缓存的内容来自旧环境和新内容。
谢谢你的建议!
两个 Cloudfront 发行版
由于 AWS 允许同一 AWS 账户中的通配符备用 CNAME 之间存在重叠,因此您可以通过以下方式在两个云端分配之间切换:
但是,两个不同的分发 DNS (*.cloudfront.net) 可能指向相同的边缘节点,这意味着提供内容的方式是将 cloudfront.net CNAME 与为其提供服务的边缘节点进行匹配,然后通过以下方式进行匹配主机名。在这种情况下,如果您的两个分布都使用相同的边缘节点(例如可以使用 进行检查
dig
),则切割将不干净。这里的比赛有点晚了,但对于其他正在寻找这个的人来说。我相信这可以使用 lambda@edge 来完成。类似于 A/B 测试。 https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html。您可以实现当用户请求 url 时触发的 lambda 函数。选择提供来自不同来源或 url 前缀的蓝色/绿色内容。cookie 值将确定将提供哪个部署。当第一个请求到达(无 cookie)时,将 cookie 随机设置为 95% 蓝色 5% 绿色。
从臀部拍摄,在云锋分布中切换原点需要多长时间?1) 在 ELB 后面部署新代码,对其进行预热 2) 将此 ELB 作为新源添加到您的云前端分布,同时删除旧源 3) 一旦切换,拆除旧 ELB 后面的旧代码。
为了避免与 CloudFront 更新或 DNS 更新相关的延迟,您可以交换 ELB 后面的自动缩放组。1) 在新的 ASG 中部署新代码,进行预热 2) 使用这个新的 ASG 注册您现有的 ELB 3) 从您的 ELB 中注销旧的 ASG 4) 切换后,拆除旧的 ASG。
我也一直在研究这个主题并有一个解决方法(见下文)。
背景:
CloudFront 要求分配配置中的 CNAME 在您的整个账户中是唯一的。因此,通过 DNS 控制蓝/绿到不同的发行版是行不通的。有一个 hack 会使用通配符,但这不能保证提供正确的文件。通过 DNS 和 CloudFront 控制蓝/绿是不可行的。
此外,更改 CloudFront 中的任何配置(包括 CNAME)会导致 15-60 分钟的等待时间,而更改会传播到边缘服务器。此外,不是一个理想的设置。
解决方法:
对于单页应用程序,此配置可能会起作用:
现在将 CloudFront 配置为使用您的存储桶来提供文件。此时,一切都取决于您的缓存设置。由于 CloudFront 需要永远,请在我们的 S3 对象上设置 CacheControl 标头。对于 index.html,我们使用 5 分钟,其他一切都使用 1 天。当需要切换时,交换 S3 目录名称。在 5 分钟内,该应用程序将针对所有意图和目的上线。
对于已经运行的应用程序,我们在代码中内置了构建版本,并在应用程序的根目录中构建了一个构建配置 json 文件。然后app会偶尔请求json文件,检查版本,如果过期,提示刷新。
限制
您不能很好地执行浸泡测试。我想可以将 index.html 的 TTL 增加到几个小时或几天(取决于您的需要),这将有助于确保客户端在本地缓存过期时获得新版本。
在这篇博文中,作者通过 Lambda@Edge 使用 AWS 文档中的代码实现了 ab 测试(您可以在此处查看他们的示例:https ://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-示例.html)。
基本上,您所做的是创建一个指向两个不同来源的 Cloudfront 分发。然后您可以使用 Lambda@Edge 将流量引导到任一来源(通过 Cookie),当然您可以通过 Lambda 实现其他事情,例如对流量进行加权或翻转等。添加更多来源和逻辑也很容易.