Aws lambda 单页应用程序Lambda@Edge

Aws lambda 单页应用程序Lambda@Edge,aws-lambda,amazon-cloudfront,aws-lambda-edge,Aws Lambda,Amazon Cloudfront,Aws Lambda Edge,因此,我有一个由AWS Cloudfront提供的AWS S3水疗中心。我已配置以下错误页面行为: 404:未找到HTTP code200 这需要能够在客户端处理路由 现在我有一个Lambda@Edge函数,该函数由Cloudfront中的查看器响应事件触发,并设置一些自定义标题,如HSTS和X-Frame。除了实际的/index.html之外,该函数正在被调用并在所有资源上按预期工作。我倾向于认为这是因为它是由Cloudfront中前面提到的错误页面行为处理的,因为html的实际GET请求是由

因此,我有一个由AWS Cloudfront提供的AWS S3水疗中心。我已配置以下错误页面行为:

404:未找到HTTP code
200

这需要能够在客户端处理路由

现在我有一个Lambda@Edge函数,该函数由Cloudfront中的
查看器响应
事件触发,并设置一些自定义标题,如HSTS和X-Frame。除了实际的
/index.html
之外,该函数正在被调用并在所有资源上按预期工作。我倾向于认为这是因为它是由Cloudfront中前面提到的错误页面行为处理的,因为html的实际GET请求是由Cloudfront中的错误页面配置处理的

解决这个问题的实际方法是什么


我不知道为什么重定向没有触发lambda函数。有没有办法实现与配置中的错误页面相同的逻辑lambda@edge?

更新:服务的行为已更改

下面的答案在发布时是正确的,但不再适用。原点错误现在触发Lambda@Edge在原始响应触发器(但不是查看器响应触发器)中按预期运行

请注意,您可以在源响应触发器中生成自定义响应体,但您没有对读取从源返回的原始响应体(如果有)的编程访问权限。你可以替换它,或者让它保持原样——不管它是什么。这是因为Lambda@Edge在CloudFront从源站接收到整个响应后,源站响应触发器不会等待触发——它们似乎会在源站将完整、有效的响应头返回CloudFront后立即触发

使用HTTP响应时,请注意Lambda@Edge不公开源服务器返回给源响应触发器的HTML正文。您可以通过将静态内容正文设置为所需的值来生成它,或者通过将值设置为空来删除函数中的正文。如果不更新函数中的body字段,则原始服务器返回的原始body将返回给查看器

重要提示:每当您在CloudFront上测试更改时,请记住您的更改往往比您预期的更早开始工作——在分发状态变回部署的
之前,但您可能需要执行缓存失效,以使您的更改完全有效和可见。无效应该包括浏览器实际请求的路径,而不是从源站请求的路径(如果不同),或者
/*
使所有内容无效。从CloudFront查看响应时,如果存在
Age:
response头,则您正在查看缓存响应。还请记住,错误使用不同的计时器集缓存响应。这些是与缓存行为中的TTL值分开配置的。有关如何更改错误缓存最小TTL的说明,请参见我对的回答,该TTL默认为5分钟,并且通常不考虑
缓存控制
标题。这是一种保护措施,可防止过多错误到达原点(或触发Lambda函数),但如果您不知道其影响,则在测试和故障排除期间会造成混乱


(原答覆如下)

如果源站返回HTTP状态代码400或更高,CloudFront不会为源站响应和查看器响应事件执行Lambda函数

这意味着未经处理的错误将导致无响应触发器触发

但是,当源错误由自定义错误响应文档处理时,会在回退请求中触发源触发器,包括错误文档成功呈现时的源响应,您可以在这里找到解决方案

如果将其实现为源响应触发器而不是查看器响应触发器,则代码将运行,因为在获取
/index.html
(替换错误页)时,源返回200,这将调用源响应触发器,但查看器响应触发器仍然不会触发。此行为似乎没有完整的文档记录,但测试表明,只要使用触发器配置了与错误文档匹配的路径的缓存行为,则在成功获取错误文档时,源请求和响应触发器将分别触发

事实上,不管怎样,源响应触发器似乎对应用程序更有意义,因为它能够在响应进入缓存之前修改响应,并且添加的头将与响应一起缓存——这将导致触发器实际需要触发的次数总体上减少

您可以将其添加为原始响应触发器,等待发行版返回到部署的
,然后对
/*
执行缓存无效化(这样您就不会提供未添加标题的缓存页面),并且在无效化完成后,删除查看器响应触发器


旁白:我提交了一个功能请求,以支持在错误时触发响应触发器,但我不知道这是否是他们正在考虑添加的内容,显然我不是唯一一个,因为该功能已经实现并发布,如修订后的回答中所述。

这正是我要寻找的。我尝试同时添加两个触发器、查看器响应和源响应。遗憾的是,我忘记了使缓存失效,因此我从未真正触发源响应事件。我认为这不再是真的:@JedSchmidt correct——这随后被更改。Upda