1

我目前有两个 Lambda@Edge 函数:

  • 语言重定向:根据查看器请求调用,返回 302 或将请求传递给 CloudFront
  • HSTS:在查看器响应时调用,添加响应标头

目前的流量是:

viewer request -> language-redirect

if 302 -> viewer response
if not 302 -> pass on to CloudFront -> HSTS -> viewer response

是否可以将两者结合在一个函数(组合)中,每个查看器请求仅调用一次?

viewer request -> combined

if 302 -> viewer response
if not 302 -> pass on to CloudFront -> combined -> viewer response

目标是调用一次相同的函数,而不是调用两次相同的函数。

4

1 回答 1

5

CloudFront 的 Lambda@Edge 增强中有 4 个不同的触发事件。它们与缓存的交互以粗体显示,稍后变得很重要:

  • 查看器请求 - 在每次请求时触发,在请求到达时检查缓存之前;不缓存自发生成的响应
  • 源请求 - 仅在缓存未命中时触发,在请求到达源之前;如果此触发器生成响应,则不会向源发送 HTTP 请求,并且响应将存储在缓存中,如果可缓存
  • Origin Response - 仅在缓存未命中时触发,当响应从源返回时,在检查响应的可缓存性并存储在缓存中之前;如果此触发器修改响应,则修改后的响应将存储在缓存中(如果可缓存)
  • 查看器响应 - 在响应返回查看器之前立即触发,无论是缓存命中还是未命中;对此触发器所做的响应的任何修改都不会被缓存

一个 Lambda 函数,正确编写以了解它在事务周期内的触发位置,可以在这些点的任意组合处触发——但由于这些事件都发生在不同的时间,因此不可能处理多个一次调用触发函数的事件。

但是,请注意上面的粗体字。在许多情况下,您可以通过使用源端触发器来显着减少触发器调用的数量。如上所述,使用这些触发器会导致触发器的响应可缓存——因此,当您的重定向触发器触发时,如果它生成重定向,则可以缓存重定向,并且下一个请求不需要调用触发器全部。同样,将您的 HSTS 标头添加到原始响应触发器中的可缓存响应意味着未来的缓存命中将返回带有 HSTS 标头的修改后的响应,而不会触发触发器。


更新:2021 年,CloudFront(终于!)推出了一项名为响应标头策略的新功能,它允许您将静态 HTTP 响应标头配置为 CloudFront 分配的一部分。这允许添加静态响应标头,例如 HSTS(如原始问题中所述),而无需使用 Lambda@Edge 或 CloudFront 函数。

于 2018-09-20T22:31:22.357 回答