AWS lambda函数在超时错误后停止工作

我有一个简单的lambda函数asynchronous进行API调用,然后返回数据。 99%的时间工作很好。 如果API耗时过长,那么lambdaconfiguration的超时就会按预期给出错误。 现在的问题是,当我做任何后续调用的lambda函数永久给我超时错误。

"errorMessage": "2016-05-14T22:52:07.247Z {session} Task timed out after 3.00 seconds" 

为了testing这种情况,我将lambda超时设置为3秒,并有一种方法来在lambda中触发这两个函数。

使用Javascript

 function now() { return response.tell('success'); } function wait() { setTimeout(function() { return response.tell('success'); }, 4000); } 

当我打电话给nowfunction没有问题。 当我调用wait函数,我得到超时错误,然后任何后续调用now给我同样的错误。

这是一个预期的行为? 我会认为任何后续的lambda函数调用应该工作。 我知道我总是可以增加configuration超时,但宁愿不。

你应该看看你的函数句柄如何处理特定的context.callbackWaitsForEmptyEventLoop

如果该布尔types为false ,那么setTimeout将不会被触发,因为您可能早些时候已经回答/处理了lambda调用。 但是,如果callbackWaitsForEmptyEventLoop的值是true – 那么你的代码将做你正在寻找的东西。

另外 – 通过callback直接处理所有东西可能更容易,不需要“手写”超时,更改configuration超时等等。

例如

 function doneFactory(cb) { // closure factory returning a callback function which knows about res (response) return function(err, res) { if (err) { return cb(JSON.stringify(err)); } return cb(null, res); }; } // you're going to call this Lambda function from your code exports.handle = function(event, context, handleCallback) { // allows for using callbacks as finish/error-handlers context.callbackWaitsForEmptyEventLoop = false; doSomeAsyncWork(event, context, doneFactory(handleCallback)); }; 

那么如果你在你的函数configuration中定义了3秒,这个超时将覆盖你的代码中的时间,所以确保从你的lambda函数configuration中增加超时,并再次尝试wait(),它应该工作!

我遇到了同样的问题,实际上在很多情况下,Lambda变得没有反应,例如:

  1. parsing无效的json:

     exports.handler = function(event, context, callback) { var nonValidJson = "Not even Json"; var jsonParse = JSON.parse(nonValidJson); 
  2. 访问未定义variables的属性:

     exports.handler = function(event, context, callback) { var emptyObject = {}; var value = emptyObject.Item.Key; 
  3. 访问RDS后不closuresmySql连接会导致Lambda超时,然后变为无响应。

当我说没有响应,它甚至没有加载,即第一次打印内部处理程序不打印,Lambda只是退出每超时运行:

 exports.handler = function(event, context, callback) { console.log("Hello there"); 

这是AWS团队近一年来所知的一个错误:
https://forums.aws.amazon.com/thread.jspa?threadID=238434&tstart=0

不幸的是,它仍然不是固定的,经过一些testing显示,实际上Lambda试图重新启动(重新加载容器?),只是没有足够的时间。 如果将超时设置为10秒,则在执行时间〜4s后,Lambda开始工作,然后在下一次运行中performance正常。 我也尝试玩设置:

 context.callbackWaitsForEmptyEventLoop = false; 

并把所有'需求'块内处理程序,没有真正的工作。 防止Lambda死亡的唯一方法是设置更大的超时时间,10s应该足以解决这个问题。

在Amazon控制台AWSconfiguration中,您必须将默认超时从3秒更改为更多(最长5分钟)