【问题标题】:lambda.invoke call through Node AWS SDK is timing out at 5 minutes while Lambda is completing under 4 minutes通过 Node AWS SDK 的 lambda.invoke 调用在 5 分钟时超时,而 Lambda 在 4 分钟内完成
【发布时间】:2018-10-06 05:35:06
【问题描述】:

我有一个设置为 5 分钟超时的 Lambda 函数,有时当我使用 node SDK 调用该函数时,我会在 5 分钟后收到超时错误。

但是,当我在收到客户端错误后检查 CloudWatch 日志并看到该功能在大约 3:30 分钟的执行时间后成功完成时。

我还注意到,客户端将在 CloudWatch 日志读取功能完成前 2 分钟记录超时(即,客户端错误时间戳为 4:08,CloudWatch 成功结束时间戳为 4:10),但是我假设这是日志写入之间的滞后,而不是运行时间。我想我会提到它,以防万一这值得更多思考。

据我所知,当函数运行不到两分钟时,它始终得到积极响应。

代码如下:

let aws_config = new AWS.Config({
    region: 'us-east-1',
    credentials: credentials,
    httpOptions: { 
        proxy: process.env.HTTP_PROXY,
        timeout: 300000
    }
})

var lambda = new AWS.Lambda(aws_config);

lambda.invoke(params, (err, data: Result) => {
  ...
}

错误如下:

{ TimeoutError: Connection timed out after 300000ms
at ClientRequest.<anonymous> (.../node_modules/aws-sdk/lib/http/node.js:83:34)
at Object.onceWrapper (events.js:273:13)
at ClientRequest.emit (events.js:182:13)
at ClientRequest.EventEmitter.emit (domain.js:442:20)
at Socket.emitRequestTimeout (_http_client.js:661:40)
at Object.onceWrapper (events.js:273:13)
at Socket.emit (events.js:182:13)
at Socket.EventEmitter.emit (domain.js:442:20)
at Socket._onTimeout (net.js:449:8)
at ontimeout (timers.js:425:11)
message: 'Connection timed out after 300000ms',
  code: 'TimeoutError',
  time: 2018-10-05T20:08:35.719Z,
  region: 'us-east-1',
  hostname: 'lambda.us-east-1.amazonaws.com',
  retryable: true } 'TimeoutError: Connection timed out after 300000ms\n    at ClientRequest.<anonymous> (.../node_modules/aws-sdk/lib/http/node.js:83:34)\n    at Object.onceWrapper (events.js:273:13)\n    at ClientRequest.emit (events.js:182:13)\n    at ClientRequest.EventEmitter.emit (domain.js:442:20)\n    at Socket.emitRequestTimeout (_http_client.js:661:40)\n    at Object.onceWrapper (events.js:273:13)\n    at Socket.emit (events.js:182:13)\n    at Socket.EventEmitter.emit (domain.js:442:20)\n    at Socket._onTimeout (net.js:449:8)\n    at ontimeout (timers.js:425:11)'

【问题讨论】:

  • 您是否尝试增加 lambda 函数的内存限制?
  • 我可以尝试,但我真的认为存在 SDK/客户端问题,因为我没有在控制台中看到错误。此外,最大内存使用量低于 100MB。
  • 这里缺少的是 Lambda 函数的代码和函数执行日志。大多数时候我看到这种行为是函数没有正确终止,即没有调用回调函数而只是完成了运行。
  • @Kalev - 功能代码很大。它大部分时间都返回并且日志显示成功返回,而不仅仅是代码的成功运行。所以我确实认为这是客户端。
  • @getglad - 当您从 AWS Web 控制台使用相同参数运行该函数时,您会看到什么行为?此外,创建一个重现行为的最小示例将大大有助于隔离问题。

标签: node.js amazon-web-services aws-lambda aws-sdk


【解决方案1】:

你看过了吗

context.callbackWaitsForEmptyEventLoop = false;

这是一个相关的 SO 帖子: Why does AWS Lambda function always time out?

【讨论】:

  • context.callbackWaitsForEmptyEventLoop = false; 这解决了问题,但它不是一个好习惯,因为当你 false 时 callbackWaitsForEmptyEventLoop 比 AWS Lambda to freeze the process soon after the callback is called
  • callbackWaitsForEmptyEventLoop 是不错的做法,事实上,在几乎所有生产设置中,当您打开(My)SQL 连接池等时,您都必须使用它,这只是 Lamdba 上的生活事实很遗憾。话虽这么说,如果该函数有一些你可以关闭的东西,那么就去做而不是使用上面的解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 2021-01-03
  • 2020-07-07
  • 2016-09-12
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
相关资源
最近更新 更多