异步 Lambda 代理集成

Xer*_*x23 2 java aws-lambda aws-api-gateway

我正在尝试从 AWS API Gateway 异步调用 AWS Lambda 函数。

我有一个长时间运行(2-3 分钟)的 Lambda 函数,我想从 HTTP Post 请求异步调用这个 Lambda 函数。我将 API 网关配置为 Lambda 代理集成(因为我想将未修改的主体传递给函数)这工作正常,但 30 秒后,由于 API 网关执行时间限制,我得到 504。

但是我无法调用异步函数。根据AWS docs,如果我设置haeder“X-Amz-Invocation-Type”应该是可能的,但这没有任何区别。

有人知道是否可以异步调用函数并使用代理集成?

Tha*_*ssi 5

AWS 表示,如果您将X-Amz-Invocation-Type标头设置为Event,这是可能的,但几个月前我遇到了同样的必要性,这对我不起作用,所以我不确定情况是否仍然如此,或者是否只是我错误配置了它。也许你当时和我一样错过了同样的事情:我没有像文档建议的那样在集成请求中添加 InvocationType 标头,所以这很可能是你的情况,但我仍然不能保证它有效)

文件说:

在 API Gateway 控制台中配置 Lambda 异步调用

在集成请求中,添加 X-Amz-Invocation-Type 标头。

在 Method Request 中,添加 InvocationType 标头并将其映射到集成请求中的 X-Amz-Invocation-Type 标头,使用静态值“Event”或 method.request.header.InvocationType 的标头映射表达式。对于后者,客户端在向 API 方法发出请求时必须包含 InvocationType:Event 标头。

如果这有效,那么您就可以开始了。

然而,我当时所做的是创建一个中间 Lambda,它实际上充当实际 Lambda 的代理。

有多种选项可以异步执行您的函数,但无论如何您都需要两个 Lambda 函数。

一种选择是通过 API Gateway 调用的函数异步调用另一个函数(它将实际执行您想要的任务)。

const params = {
        FunctionName: 'YOUR_FUNCTIONS_NAME',
        InvocationType: 'Event',
        Payload: JSON.parse(event.body) // this is the event coming from API Gateway
    };
    await lambda.invoke(params).promise(); // await here is only going to wait for the HTTP request to be successful. Once the 2nd Lambda is invoked, it will return immediately
Run Code Online (Sandbox Code Playgroud)

另一种选择是将消息放入 SQS 并配置一个触发器,以便在 SQS 队列中有新消息时调用您的 Lambda。同样的事情也适用于 SNS 通知。

其他选项包括 Kinesis、DynamoDB Streams 等,但思路是一样的:通过 API Gateway 调用的函数必须是其他 Lambda 的代理。此代理将如何工作(向 SQS、SNS 发送消息,直接异步调用其他函数等)并不重要,重要的是绕过 API 网关 30 秒请求限制的概念。

  • 不是您……无法异步调用 Lambda 代理集成,因为 API Gateway 需要代理响应格式……但是对于异步调用,不会返回任何响应。 (2认同)