AWS Lambda:澄清从事件对象中检索数据

时间:2019-05-17 14:50:09

标签: javascript node.js amazon-web-services aws-lambda aws-api-gateway

目前,我认为我对如何从lambda函数提取/传递数据有基本的误解,我正在寻求澄清

示例:假设我想将一些数据传递给Lambda函数,即{"hello":"world"},并通过在AWS API Gateway中创建REST端点将数据传递给该Lambda函数来实现此目的。

目前,我了解有三种提取数据的方法:

1)event.queryStringParameters(有意义)

例如我们可以将查询参数附加到请求URL:https://fakefakefake.execute-api.us-west-2.amazonaws.com/test/myapi?hello=world以及lambda函数中:

const data = event.queryStringParameters.hello; // world

2)event.body(很有意义,由于“ Lambda代理集成”,这是可能的)

例如如果我们使用Lambda Proxy Integration将数据附加到POST / PUT / etc请求的主体中(即转发所有数据),则可以通过event.body和在lambda函数中进行访问(但请确保JSON.parse event.body,因为Lambda代理集成将通过字符串化的JSON(无效的/“真实的” JSON)传递:

const data = event.body.hello; // world

3)直接在事件对象上(不清楚)

例如目前尚不清楚这种情况-通过API网关中的REST端点设置将数据传递给lambda函数,然后可以直接从事件对象访问该数据?

const data = event.hello; // world

在情况3中,如何在Lambda函数中的事件对象上“直接”传递数据的示例是什么?我认为这种情况要求我在设置API / Lambda时创建一个“映射模板”,但是我仍然不清楚。

对于一个简单的Node脚本,情况2似乎具有从字符串化JSON解析事件主体的“开销”,因此这是可以理解的缺点,但是除了如何做到这一点之外,情况3还是何时使情况3是更理想的方法?

2 个答案:

答案 0 :(得分:5)

Lambda是独立服务,不需要与API Gateway集成。 queryStringParametersbodybody mapping templates,所有这些都不特定于Lambda,而是特定于Lambda-API网关集成。

如果您将Lambda与其他服务一起使用,则数据通常直接通过event对象传递,因此没有太多理由以其他方式传递数据。

例如,您可以将Lambda函数订阅到S3存储桶,并使用该功能以编程方式处理事件,例如将文件上传到存储桶。在这种情况下,存储桶名称,对象密钥,对象数据,元数据等信息将直接通过event对象传递。

而且,在将Lambda与API Gateway一起使用时,为什么要使用body mapping templates直接通过event对象将数据传递到Lambda函数?因为您可以更轻松地重用该功能用于其他目的(如果在您的方案中可行),因为您的Lambda函数将具有更简单的接口,而不是与API Gateway集成紧密相关的接口。

例如,您可以具有一个函数,该函数对传入的数字执行一些计算,可以通过API网关调用该数字,也可以从您的应用程序直接调用它。如果期望使用event.xevent.y而不是某些event.queryStringParameter.x来代替API网关,那么使用这种功能将更加容易。

答案 1 :(得分:2)

基于Matus的见解,我现在可以更好地回答上面的其余问题:

  • “在Lambda函数中,如情况3一样,如何直接在事件对象上传递数据的示例是什么?”

使用Lambda设置API网关以传递特定数据时,您需要使用在AWS API Gateway中进行设置的映射模板。

该映射模板本身是由Apache Foundation的Velocity Template Language (VTL)编写的。例如,Ex仅附加 “ hello”数据,因此可以const data = event.hello; // world的形式访问,例如:

    { 
      "hello": $input.params('$hello')
    }

注意: VTL非常强大,上面的示例并非实际用法,而是仅用于传达想法的最小数量的VTL,请参见herehere更多细节

在界面上跳转以设置映射模板对于入门示例来说有点麻烦,因此这里有说明性的步骤:

API Steps

警告::请务必仔细检查编辑器中实际显示的内容,因为当您更改下拉菜单时,映射模板有时可能会发生一些时髦/意外的行为。有时您还会遇到涉及映射模板的无法恢复的问题,最好是一开始就删除该方法并从API Gateway重新启动。

  • “对于简单的Node脚本,情况2似乎具有从字符串化JSON解析事件主体的“开销”,这是可以理解的缺点,但是为什么情况3或何时将是更理想的方法? em>

这一切都取决于您的Lambda如何接收其数据。

Matus的主要见解是,这最终都是实现细节。在这个人为设计的示例中,Lambdas(即通过AWS Gateway设置REST API,将GET / POST发送到该API并让Lambda对数据做些事情)可以通过3种方式检索数据:

(1)URL参数const data = event.queryStringParameters.hello; // world

(2)请求正文const data = event.body.hello; // world(请参见下面的注释)

(3)直接在事件对象const data = event.hello; // world

关于2的说明:这需要选择(a) Lambda代理集成,而不是使用映射模板,并且在代码中,您需要JSON.parse事件主体,然后才能访问数据,有关更多详细信息,请参见this answer

所有这些取决于从API网关获取的内容。在此特定示例中,我谈论的是执行REST请求以在由Lambda处理的API网关终结点上传递数据,但是许多其他服务/触发器可以将数据发送到Lambda脚本进行分析。

其他有用的资源: