Node.js lambda.invoke通过节点AWS SDK的调用在5分钟内超时,而lambda在4分钟内完成

Node.js lambda.invoke通过节点AWS SDK的调用在5分钟内超时,而lambda在4分钟内完成,node.js,amazon-web-services,aws-lambda,aws-sdk,Node.js,Amazon Web Services,Aws Lambda,Aws Sdk,我有一个Lambda函数,该函数设置为5分钟超时,有时当我使用节点SDK调用该函数时,5分钟后会出现超时错误 但是,当我在收到客户端错误后检查了CloudWatch日志,并且看到函数在执行约3:30分钟后成功完成时 我还注意到,客户端将在CloudWatch日志读取函数完成之前2分钟记录超时(即,客户端错误时间戳为4:08,CloudWatch成功结束时间戳为4:10),但我假设这是日志写入之间的延迟,而不是运行时间。我想我会提到它,以防这是值得思考的事情 据我所知,当函数在两分钟内运行时,它总

我有一个Lambda函数,该函数设置为5分钟超时,有时当我使用
节点
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)'
错误如下所示:

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)'
{TimeoutError:连接在3000000毫秒后超时
在ClientRequest上。(…/node\u modules/aws sdk/lib/http/node.js:83:34)
在Object.onceWrapper(events.js:273:13)
在ClientRequest.emit(events.js:182:13)
在ClientRequest.EventEmitter.emit(domain.js:442:20)
在Socket.emitRequestTimeout(_http_client.js:661:40)
在Object.onceWrapper(events.js:273:13)
在Socket.emit(events.js:182:13)
位于Socket.EventEmitter.emit(domain.js:442:20)
在套接字上超时(net.js:449:8)
在ontimeout(timers.js:425:11)
消息:“30万毫秒后连接超时”,
代码:“TimeoutError”,
时间:2018-10-05T20:08:35.719Z,
地区:'us-east-1',
主机名:“lambda.us-east-1.amazonaws.com”,
retryable:true}'TimeoutError:连接在ClientRequest的30000ms\n后超时。(…/node\u modules/aws sdk/lib/http/node.js:83:34)\n在Object.onceWrapper(events.js:273:13)\n在ClientRequest.emit(events.js:182:13)\n在ClientRequest.EventEmitter.emit(domain.js:442:20)\n在Socket.emitRequestTimeout(\u http\u client.js:661:40)\n在Object.onceWrapper(events.js:273:13)\n在Socket.emit(events.js:182:13)\n位于Socket.EventEmitter.emit(domain.js:442:20)\n位于Socket.\u onTimeout(net.js:449:8)\n位于onTimeout(timers.js:425:11)'
您调查过吗

context.callbackWaitsForEmptyEventLoop = false;
这里有一个相关的SO帖子:

您是否尝试增加lambda函数的内存限制?我可以尝试,但我确实认为存在SDK/客户端问题,因为我在控制台中没有看到错误。此外,最大内存使用量低于100MB。这里缺少的是Lambda函数的代码和函数执行日志。我看到这种行为的大多数时候是函数没有正确终止,即没有调用回调函数,只是完成了运行。@Kalev-函数代码太大了。它大部分时间返回,日志显示返回成功,而不仅仅是代码的成功运行。所以我确实认为这是客户端。@getglad-当您从AWS web控制台使用相同的参数运行函数时,您看到了什么行为?此外,创建一个复制行为的最小示例将大大有助于隔离问题这解决了问题,但不是一个好的做法,因为当
false
调用
callbackaitsforeptyeventloop
时,调用
AWS Lambda在调用回调后立即冻结进程
callbackaitsforeptyeventloop并不是一个坏做法,事实上,在几乎所有的生产设置中,您都必须使用它您已经打开了(我的)SQL连接池等,不幸的是,这只是Lamdba上的一个事实。也就是说,如果函数中有可以关闭的东西,那么就执行它,而不是使用上面的解决方案。