两个 CloudFront 分布:
我尝试的选项是拥有两个独立的 CloudFront Web 分发,一个用于 s3 存储桶中的静态站点(A 版本),另一个用于 s3 存储桶中的另一个静态站点(B 版本)。我尝试使用 Route53 加权路由策略,其中我为 www.domain.com Route53 记录添加了两个记录,一个指向 CloudFront 分发 A,权重为 0,另一个指向 CloudFront 分发 B,权重为 0。我想进行 A/B 测试。
使用 www.domain.com 作为产品分发 A 的备用 CNAME。
使用 *.domain.com 作为 Prod 分发 B 的备用 CNAME。
我的内容始终从 A 获取。我希望它以相同的比例从两个版本获取。
对此有什么帮助吗?
答案1
您无法使用 CloudFront 执行此操作。
tl;dr:您的通配符与在另一个发行版上配置了特定的、冲突的主机名的主机名不匹配。
您在分发 B 上创建了通配符替代主机名,以尝试解决此限制:
如果备用域名已存在于另一个 CloudFront 分配中,则您无法将备用域名添加到 CloudFront 分配中,即使您的 AWS 账户拥有该其他分配。
当然,这种限制是有原因的,它也解释了为什么即使您的 DNS 配置按预期工作,分发 B 也永远不会看到您的请求。
规则的例外...
但是,您可以添加通配符备用域名(例如 *.example.com),其中包含(重叠)非通配符备用域名(例如 www.example.com)。重叠域名可以位于同一分配中,也可以位于单独的分配中,只要两个分配都是使用同一 AWS 账户创建的即可。
...没有提供您预期的异常。
当 Web 浏览器连接到端点时,如何浏览器到达那里的信息没有被保留——是静态 A 记录、别名、CNAME、整个 CNAME 级联,还是 hosts 文件中的条目?服务器不知道,因为这些信息没有被保留……它知道您到达的 IP 地址,但该地址来自由许多发行版共享的池,因此您的请求如何到达特定的 CloudFront 边缘(遵循哪组 DNS 记录,您的“A”或“B”——它们甚至可能不是 CloudFront 端的不同 IP 地址)不能用于确定哪个发行版应该为您的请求提供服务。
CloudFront 为了确定哪个分发应该为特定请求提供服务,唯一的机制是Host:
传入 http 请求中的 HTTP 标头(也可能是 SNI 协商,但无论 CloudFront 是否使用它,这都不会改变任何内容)。
将请求视为属于特定分布的决定并不基于其他任何因素 —— 它不可能,因为没有其他可用因素作为依据。
通过逻辑扩展,只有一个分发可以与任何给定的传入请求Host:
标头相关联,例如www.example.com
(您的分发“A。”)
另一个发行版(“B”)*.example.com
实际上只能满足以下请求:除了一切 www.example.com
(或您与分发版关联的任何其他更具体的备用域名,这些域名原本会与该通配符匹配),因为同一帐户上的另一个具有更具体主机名的分发版(“A”)声称该特定主机名www.example.com
是通配符的例外*
。
本质上,首先检查请求是否具有与主机名完全匹配的分布,并且只有当不匹配时,才会将具有通配符的分布用于请求。
答案2
我得到的一个解决方案是:我尝试使用两种不同的服务。我为我的 www.domain.com Route53 记录添加了两条记录,一条指向 CloudFront Distribution A,权重为 0,另一条直接指向位置 B 的 s3 Bucket (www.domain.com),权重为 0。WRR 有效。但是,我认为我们不能使用 S3/Cloudfront 风格的 WRR,因为两者之间的性能差异很大,以至于 A/B 测试对 S3 版本并不公平。客户端将从 Cloudfront 边缘服务器获得更好的响应时间。
我还有另一个选择,即在 Route 53 中设置流量策略。我想我应该选择这个。还有其他我可以尝试的选项吗?既能满足 AB 测试要求,又具有成本效益?