Amazon API 网关超时

我在 API 网关方面有些问题。我做了一些 API 方法,有时它们的工作时间超过10秒,亚马逊返回504错误。下面是截图:

enter image description here

请帮助! 我怎样才能增加超时?

谢谢!

114317 次浏览

您不能增加超时时间,至少现在不能。端点必须在10秒或更短时间内完成。您需要努力提高端点的速度。

Http://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html

虽然不能增加超时时间,但是如果工作是可以分开的,那么可以将 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)
}
});

来源: < a href = “ https://stackoverflow. com/questions/31714788/Can-an-AWS-Lambda-function-call-another # answer-31745774”> 一个 AWS Lambda 函数能否调用另一个函数 AWS 文档: < a href = “ http://docs.AWS.amazon.com/AWSJavaScriptSDK/best/AWS/Lambda.html”rel = “ nofollow noReferrer”> http://docs.AWS.amazon.com/awsjavascriptsdk/latest/AWS/lambda.html

现在,根据 http://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html,Lambda 调用或 HTTP 集成的默认限制是 30多岁,而这个限制是不可配置的。

Lambda 函数将在最大值后超时。API 网关请求将在29秒后超时。你不能改变这一点,但是你可以用异步执行模式来解决它,我写了一篇关于:

Https://joarleymoraes.com/serverless-long-running-http-requests/

截至2017年12月,最大值仍然是29秒,但应该能够自定义超时值。

Https://aws.amazon.com/about-aws/whats-new/2017/11/customize-integration-timeouts-in-amazon-api-gateway/

这可以在 APIGateway 中每个方法的“集成请求”中设置。

超时可以减少,但不能增加超过29秒。方法的后端应该在29秒之前返回响应,否则 API 网关将抛出504超时错误。

或者,如上面的一些答案所示,您可以将后端更改为发送状态代码202(Accepted) ,这意味着已成功接收请求,然后后端继续进一步处理。当然,在实现工作区之前,我们需要考虑用例和它的需求

我想评论“ joarleymoraes”的帖子,但没有足够的声誉。唯一要补充的是,你不必重构使用异步,它只是取决于你的后端和你如何分割它 + 你的客户端重试。

如果您没有看到高比例的504,也没有为异步处理做好准备,那么可以在它们上面实现客户端 用截断二进制指数避退算法重试,这样它们就不会永久失败。

AWS SDK 自动实现带有后退的重试,因此它可以帮助简化重试,特别是因为 Lambda Layers允许您为您的功能维护 SDK,而无需不断更新部署包。

一旦您这样做了,将导致对这些超时的可见性降低,因为它们不再是永久性失败。这可以为您争取一些时间来处理核心问题,即您首先看到的是504。这当然意味着要重构代码以获得更多响应,将大型函数分解为更多“微服务”类型的概念,并减少外部网络调用。

重试的另一个好处是,如果您重试来自应用程序的所有5xx 响应,它可以涵盖许多在正常执行期间可能看到的不同问题。通常在所有应用程序中都认为这些问题永远不可能100% 可以避免,因此最好的做法是继续前进并做最坏的打算!

尽管如此,您仍然应该减少 lambda 的执行时间或者进行异步操作。这将允许您将超时值设置为一个小得多的数字,这将使您更快地失败。这有助于减少对前端的影响,因为重试失败的请求不必等待29秒。

直到2021年5月21日,这仍然是一样的。最长时间的硬限制是30秒。下面是关于 API 网关配额的官方文档。 Https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html#http-api-quotas

不能增加超时限制,因此应在30秒内返回响应。我通常的解决办法是:

  • 以异步方式发送结果 另一个进程并向客户端发送一个响应 成功启动进程 X 和其他进程应通知 一旦客户端完成(点击一个端点,发送一个异步方式 你可以找到很多关于这个话题的有趣的资源
  • 充分利用 lambda 中多处理的潜力 功能和增加内存,以便更快的计算时间
  • 最后,如果您需要以同步方式返回结果,则 Lambda 函数不能做这项工作,你可以集成 API 网关 直接使用 step 函数,这样就会有多个 lambda 函数并行工作。这看起来很复杂,但实际上 很简单

Lambda 函数的最大执行时间为15分钟,但是由于 APIGateway 有严格的29秒超时策略,所以您可以按照以下步骤来克服这个问题。

要立即修复,请尝试增加 lambda 函数的大小。例如: 如果您的 lambda 函数有128MB 的内存,您可以将其增加到256MB。更多的内存有助于函数更快地执行。

或者

您可以使用 lambdaInvoke ()函数,它是“ aws-sdk”的一部分。使用 lambdaInvoke ()而不是通过 APIGateway,您可以直接调用该函数。但这仅在服务器端有用。

或者

解决这个问题的最佳方法是-> 向 APIGateway 发出请求-> 在函数内部将接收到的数据推入 SQS队列-> 立即返回响应-> 准备一个 lambda 函数,当 SQS 队列中的数据可用时触发-> 在这个触发函数内部执行实际的时间复杂的执行-> 将数据保存到数据存储-> 如果调用来自客户端(浏览器/移动应用程序) ,然后实现长轮询,从相同的数据存储获得最终处理结果。

现在,由于 api 在将数据推送到 SQS之后立即返回响应,您的主函数执行时间将大大减少,并且将解决 APIGateway 超时问题。

还有其他方法,比如使用 WebSocket、编写事件驱动代码等等。但是上述方法的实现和管理要简单得多。

到2022年,我们终于有了一个变通方案。不幸的是,AWS 并没有改变 API 网关,所以这仍然是29秒,但是,你可以在 lambda 本身使用一个内置的 HTTPS 端点: 单功能微服务的内置 HTTPS 端点 它被证实没有超时——所以基本上你可以有整整15分钟的 lambda 超时窗口: < a href = “ https://twitter.com/alex _ casalboni/status/1511973229740666883”rel = “ norefrer”> https://twitter.com/alex_casalboni/status/1511973229740666883

例如,下面是如何使用 aws-cdk 和 type 脚本定义具有 http 端点的函数:

 const backendApi = new lambda.Function(this, 'backend-api', {
memorySize: 512,
timeout: cdk.Duration.seconds(40),
runtime: lambda.Runtime.NODEJS_16_X,
architecture: Architecture.ARM_64,
handler: 'lambda.handler',
code: lambda.Code.fromAsset(path.join(__dirname, '../dist')),
environment: {
...parsedDotenv
}
})


backendApi.addFunctionUrl({
authType: lambda.FunctionUrlAuthType.NONE,
cors: {
// Allow this to be called from websites on https://example.com.
// Can also be ['*'] to allow all domain.
allowedOrigins: ['*']
}
})

WebSocket API 的自定义超时时间在50到29,000毫秒之间,HTTP API 的自定义超时时间在50到30,000毫秒之间。WebSocketAPI 的默认超时时间为29秒,HTTPAPI 的默认超时时间为30秒