答案 0 :(得分:15)
根据http://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html,Lambda调用或HTTP集成的默认限制为 30s ,此限制不可配置。
答案 1 :(得分:12)
你不能增加超时,至少现在不行。您的终点必须在10秒或更短时间内完成。您需要努力提高端点的速度。
http://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html
答案 2 :(得分:8)
截至2017年12月,最大值仍为29秒,但应该能够自定义超时值。
这可以在APIGateway中每种方法的“集成请求”中设置。
答案 3 :(得分:2)
虽然您无法增加超时,但如果工作可以拆分,您可以将lambda链接在一起。
使用aws sdk:
var aws = require('aws-sdk');
var lambda = new aws.Lambda({
region: 'us-west-2' //change to your region
});
lambda.invoke({
FunctionName: 'name_of_your_lambda_function',
Payload: JSON.stringify(event, null, 2) // pass params
}, function(error, data) {
if (error) {
context.done('error', error);
}
if(data.Payload){
context.succeed(data.Payload)
}
});
来源:Can an AWS Lambda function call another AWS文档:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html
答案 4 :(得分:1)
可以减少超时,但不能增加超过29秒。方法的后端应在29秒之前返回响应,否则API网关将引发504超时错误。
或者,如以上某些答案中所建议,您可以更改后端以发送状态代码202(已接受),表示已成功接收到请求,然后后端继续进行进一步处理。当然,在实施解决方法之前,我们需要考虑用例及其要求
答案 5 :(得分:0)
我想评论“ joarleymoraes”帖子,但没有足够的声誉。唯一要添加的是您不必重构以使用异步,它仅取决于您的后端以及如何拆分它+客户端重试。
如果您没有看到很高的504,并且还没有准备好进行异步处理,则可以在它们上实现客户端retries with exponential backoff,这样就不会造成永久性故障。
AWS开发工具包会自动执行带有退避的重试,因此可以帮助简化操作,特别是因为Lambda Layers将允许您维护功能的SDK,而不必不断更新部署包。
一旦执行此操作,将导致这些超时的可见性降低,因为它们不再是永久性故障。这可以为您腾出一些时间来解决核心问题,即您首先看到的是504。这肯定意味着将代码重构为具有更高的响应能力,将大型功能拆分为更多的“微服务”类型概念,并减少外部网络调用。
重试的另一个好处是,如果您重试应用程序中的所有5xx响应,则它可以涵盖很多不同的问题,您可能会在正常执行过程中看到这些问题。通常在所有应用程序中都认为这些问题永远不会100%避免,因此最好的做法是进行计划并为最坏的情况做计划!
所有这些,您仍然应该减少lambda执行时间或进行异步处理。这将使您可以将超时值设置为较小的数字,从而使失败更快。由于不必等待29秒重试失败的请求,因此有助于减少对前端的影响。