aws lambda应该归还什么?

时间:2018-04-23 19:32:07

标签: amazon-web-services aws-lambda

我是AWS Lambda和Lambda Edge的新手,我试图理解其目的。在Lambda Edge中,我在促销页面中看到它有点暗示Edge是一个中间件,你可以修改请求。

我在nodejs示例中看到,要继续处理请求,您可以使用id | err 1 | -0.0625 2 | 0.063829 ,但每当我使用它时,我都会得到502响应。

例如,我可以添加/修改标头,然后继续向Cloudformation或API Gateway后端发送请求,还是lambda必须返回某种对象?

这是一个示例(添加了日志显示标题,一切都很好,只是卷曲返回502):

callback(null, request);

1 个答案:

答案 0 :(得分:0)

在尝试使用Lambda @ Edge时,有时会让人们感到困惑的一个问题是,在Lambda控制台中成功测试脚本只测试您的代码是否可以在不抛出异常的情况下运行。

它没有测试的是您的测试事件是否类似于CloudFront将生成的测试事件,或者您的返回值是否实际上被CloudFront解释为有效。

传递的event是一个包含一条记录的复杂对象,内部有cf(CloudFront),其中包含request。如果您是响应触发器,它还包含response

Lambda@Edge Event Structure。 Lambda控制台中有各种类型的CloudFront交互测试事件模板。

因此,您需要从结构的正确部分获取原始事件的请求:

const request = event; // incorrect
const request = event.Records[0].cf.request; // correct

标题首先令人困惑,但这实际上是一个非常合理的工程设计的例子。 HTTP标头在HTTP / 1.x中不区分大小写,并且在http / 2中始终为小写,但JavaScript对象键始终区分大小写......因此标头的合理表示会考虑所有这些因素,以及事实上,一些标题可能出现不止一次,排序可能是相关的。

headers中,对象键始终为小写,每个值都是一个对象数组,其中包含key(必须与外键匹配,但字母除外)和{{1 (标题)。

value

此外,某些标题会被列入黑名单 - 出于安全或简单的理智原因,您无法添加或操作它们。

请参阅CloudFront开发人员指南的Lambda @ Edge部分中的Headers

此外,请记住,CloudFront是一个缓存,缓存具有缓存键 - 标识特定请求的唯一值,因此可以确定其他相同的请求实际上是相同的,并使用相同的响应。 CloudFront中的缓存键仅包含CloudFront配置为发送到源的内容 - 其中不包括您尚未列入白名单以便在缓存行为设置中转发到源的标头。尝试不恰当地设置或修改标头将导致502错误。在上面的示例中,您需要在缓存分发设置中将request.headers.bar = 'foo'; // incorrect request.headers['bar'] = [ { key: 'Bar', value: 'foo' } ]; // correct 标头列入白名单以转发到源。

通过尝试修改响应而不是请求,您可能会发现它最初更容易学习,因为它们更宽容。

请注意,在请求触发器中,您基本上有四种可能的结果:

  • 保留请求未经修改,并使用Bar将控制权返回给CloudFront,而不更改任何内容
  • 通过修改请求对象然后`return callback(null,request);
  • 来修改请求
  • 停止进一步的CloudFront处理,并通过构建有效的响应对象并调用return callback(null, request);
  • 直接生成响应
  • 通过将第一个return callback(null, response);响应设置为null以外的其他内容来抛出一个硬异常

在查看器请求触发器中,生成响应会将响应返回给查看器,而不会检查缓存并且不会缓存响应。

原始请求触发器仅在已经检查了缓存之后触发,并且该对象不存在。如果在原始请求触发器中生成响应,则响应将存储在缓存中并返回给请求者。如果在此触发器中生成响应,则永远不会将请求发送到原点。如果您修改了请求,它将被发送到源并且响应被缓存,除非配置为不被缓存。

原始响应触发器修改或替换来自原点的响应,修改后的响应存储在缓存中。

查看器响应触发器修改或替换从缓存或原点获取的响应。修改后的响应未缓存。

在可能需要的情况下,响应触发器也能够检查原始请求。