分发能否自动匹配请求中的子域以找出来源

Can a distribution automatically match the subdomain from a request to figure out the origin

我们在同一个域中添加了许多几乎相同的应用程序,每个应用程序都可以通过其特定的子域访问。每个应用程序都有特定的资产(不是很多)。

每个应用都引用相同的 cdn.mydomain.com 从云端获取资产。

资产以间隔命名。例如:

app1:

当 Cloudfront 在缓存中没有资产时,它会从正确的来源下载资产。

实际上,每次我们添加新应用程序时,我们都会在同一分布上创建新的来源和缓存行为。

我们正在努力简化该过程,以便 Cloudfront 能够从正确的来源获取资产而无需指定它。如果我们在一个分布中达到原点数量的限制,这将解决问题。

我们如何做到这一点,这可能吗?

我们正在考虑使用缓存配置创建 mydomain.com 的来源以转发 host header,但我们不确定这是否会成功。

起源与缓存行为相关,缓存行为与路径模式相关。你不可能真的做你想做的事。

我建议您应该为每个应用程序和每个子域创建一个分发。使用 aws-cli 编写脚本非常容易,因为一旦您按照自己喜欢的方式设置了它,您就可以使用它的配置输出作为模板来进行更多操作,而只需进行最少的更改。 (我使用 Perl 脚本构建最终的 JSON 来创建每个发行版,使用最少的输入,例如备用域名和证书 ARN,并将其输出通过管道传输到 aws-cli。)

我认为这是正确的方法,因为:

  • CloudFront 无法 select 基于 Host header 的来源。只有路径模式用于 select 原点。
  • Lambda@Edge 可以重写路径并可以检查 Host header,但它不能在 匹配完成之前重写路径 [= =67=]s 缓存行为(以及来源)。您不能使用 Lambda@Edge 导致 CloudFront 切换或 select 来源,除非您生成浏览器重定向,出于性能原因,您可能不想这样做。我已经提交了一个功能请求,以允许 Lambda 触发器向 CloudFront 发出信号,它应该 return 到处理的开始并且 re-evaluate 路径,但我不知道它是否被视为未来功能 -- AWS 倾向于将他们的未来功能计划保密,这是可以理解的。
  • 将您的站点合并到一个分布中不会提高效率或节省成本,因为资源不同
  • 如果您决定将 Host header 列入白名单,这意味着 CloudFront 将根据 Host header 单独缓存响应,就像它会如果您创建了多个发行版,请执行此操作。即使路径相同,如果 Host header 不同,它仍会缓存单独的响应,因为它必须确保合理的行为
  • 分配的默认限制是200,而来源和缓存行为的限制是25。两者都可以通过请求提出,但是他们可以给你的分配数量是无限的,而其他资源是有限的,因为它们会增加每个请求的系统工作量,最终会对性能产生负面影响
  • 单独的分发给您单独的日志和报告
  • 当每个应用都有自己的分布时,配置错误的爆炸半径较小

您还可以进入 Amazon Certificate Manager 和 * *.cdn.example.com 的通配符证书。然后使用例如app1.cdn.example.com 作为 app1 分发的备用域名并附加通配符证书。然后在 app2.cdn.app.com 发行版等

上重复使用相同的证书

请注意,您还有一个从当前解决方案中轻松迁移的策略:您可以创建一个使用 *.cdn.example.com 作为其备用域名的单一分发。对应用程序进行编码以使用它们自己的 unique-name-here.cdn.example.com。将所有 DNS 记录指向此处。稍后,当您使用特定备用域名 foo.cdn.example.com 创建分配时,CloudFront 将自动停止将这些请求路由到通配符分配,并开始将它们路由到具有特定域的分配。您将需要更改 DNS 条目...但 CloudFront 实际上会正确处理请求,将它们路由到 newly-created 分配,在您更改 DNS 之前 ,因为它有一些内部魔术将 non-wildcard 主机名匹配到正确的分布,无论浏览器是连接到新端点还是旧端点......所以迁移事件应该是一个 non-event.

无论如何,我建议通配符策略是一个很好的策略,这样您的每个应用程序都连接到一个特定的端点主机名,从而使您在将来具有更大的灵活性。