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)
};
await lambda.invoke(params).promise();
另一个选择是将消息放入 SQS 中,并配置 Lambda 触发器,当 SQS 队列中有新消息时,触发 Lambda 调用。对于 SNS 通知也适用同样的方法。
其他选项包括 Kinesis、DynamoDB Streams 等等,但核心思想相同:通过 API Gateway 调用的函数必须只是代理到另一个 Lambda。这个代理如何工作(例如向 SQS、SNS 发送消息,直接异步调用另一个函数等)并不重要,重要的是解决 API Gateway 的 30 秒请求限制的概念。
X-Amz-Invocation-Type
是否可行?我只能看到 REST API 的 HTTP Headers 选项。 - user2950747