我目前正在 AWS S3 上的静态网站上实施 Canary 发布和蓝绿部署。基本上,我创建了两个 S3 存储桶(v1 和 v2)和 2 个云前端(我没有附加 CNAME)。然后,我在 Route 53 中创建 2 个 A 别名记录,每个权重路由策略为 50%。但是,我只使用笔记本电脑和移动设备访问我的域被路由到 v1。我什至要求我的同事打开我的域,他们也被路由到 v1。
我真的很困惑为什么没有用户被路由到 v2?
S3 中的 AWS 静态 Web
我目前正在 AWS S3 上的静态网站上实施 Canary 发布和蓝绿部署。基本上,我创建了两个 S3 存储桶(v1 和 v2)和 2 个云前端(我没有附加 CNAME)。然后,我在 Route 53 中创建 2 个 A 别名记录,每个权重路由策略为 50%。但是,我只使用笔记本电脑和移动设备访问我的域被路由到 v1。我什至要求我的同事打开我的域,他们也被路由到 v1。
我真的很困惑为什么没有用户被路由到 v2?
S3 中的 AWS 静态 Web
将流量路由到您的 CloudFront 分配的分配dyyyexample.cloudfront.net
和dzzzexample.cloudfront.net
主机名将转到同一个位置。CloudFront 看不到您的 DNS 别名条目,因此它不知道遵循了哪个别名。
相反,它查看 TLS SNI 和Host
浏览器发送的 HTTP 标头。它使用此信息与您的分配的备用域名相匹配——无需更改 DNS。
您站点的主机名example.com
仅在您的一个分配上配置为备用域名,因为 CloudFront 不允许您在多个分配上预置相同的值。
如果您将该备用域名条目交换到另一个分布,所有流量都将转移到另一个分布。
简而言之,CloudFront 不直接和原生地支持蓝/绿或金丝雀。
解决方法是使用 Lambda@Edge 触发器和 cookie 将每个查看器锁定到一个或另一个源。Lambda@Edge 源请求触发器允许在请求进行时更改源。
文档中有一个A/B 测试示例,但该示例交换了路径。有关如何换出原点的信息,请参阅动态原点选择示例。结合这两者的逻辑允许跨两个存储桶(或任何两个备用后端)进行 A/B 测试。
如果您在 Cloudfront 中使用“重叠别名”,您所解释的内容应该会起作用。您将一个分发配置为侦听 app.example.com,将另一个分发到 *.example.com,并为 app.example.com 使用 Route53 加权路由
然而,加权路由可能不是金丝雀版本的理想解决方案。这是由于 DNS 传播/缓存以及它不具有粘性的事实。
就像迈克尔建议的那样,您可能希望考虑拥有 1 个云端并使用 Lambda@Edge 或 Cloudfront 函数路由到存储桶 A/B。 这是一个例子。