异步Lambda代理集成

5
我正在尝试从AWS API Gateway异步调用AWS Lambda函数。 我有一个运行时间很长(2-3分钟)的Lambda函数,并且我想从HTTP Post请求异步调用此Lambda函数。 我将API Gateway配置为Lambda代理集成(因为我希望将body不修改地传递给函数)。这是有效的,但在30秒后,由于API Gateway执行时间限制,我会得到504错误。
但是我无法管理异步调用该函数。 根据AWS文档,如果我设置haeder“X-Amz-Invocation-Type”,则应该可以实现这一点,但这没有任何区别。
请问是否有人知道是否可以异步调用函数并使用代理集成?
1个回答

7
AWS表示,如果您将X-Amz-Invocation-Type标头设置为Event,则可能实现此目的。但是,几个月前我也有同样的需求,但这种方法并没有奏效,所以我不确定它是否仍然适用,或者只是我配置错误。也许您当时和我一样错过了一些东西:我没有像文档建议的那样在“Integration Request”中添加一个“InvocationType”标头,因此很可能对您也是如此,但是我仍然不能保证它能正常工作。

文档中说:

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

在“Integration Request”中添加一个“X-Amz-Invocation-Type”标头。

在“Method Request”中添加一个“InvocationType”标头,并将其映射到与“Integration Request”中的“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

另一个选择是将消息放入 SQS 中,并配置 Lambda 触发器,当 SQS 队列中有新消息时,触发 Lambda 调用。对于 SNS 通知也适用同样的方法。
其他选项包括 Kinesis、DynamoDB Streams 等等,但核心思想相同:通过 API Gateway 调用的函数必须只是代理到另一个 Lambda。这个代理如何工作(例如向 SQS、SNS 发送消息,直接异步调用另一个函数等)并不重要,重要的是解决 API Gateway 的 30 秒请求限制的概念。

3
这不是你的错…… Lambda代理集成无法异步调用,因为API网关需要遵循代理响应格式。但是在异步调用中,没有返回响应。 - Michael - sqlbot
好知道,@Michael-sqlbot。你认为文档有误导还是我还有什么不明白的地方? - Thales Minussi
我最终采用了非代理集成和请求/响应映射。我认为@Michael-sqlbot是对的,代理集成不会异步工作。 - Xerox23
在 WebSocket API 上设置 X-Amz-Invocation-Type 是否可行?我只能看到 REST API 的 HTTP Headers 选项。 - user2950747

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接