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

时间:2016-05-14 23:13:07

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

我有一个简单的lambda函数,它异步地进行API调用然后返回数据。 99%的时间这个效果很好。当API需要更长时间然后lambda配置超时时,它会按预期给出错误。现在的问题是,当我对lambda函数进行任何后续调用时,它会永久地给出超时错误。

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

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

的Javascript

function now() { 
    return response.tell('success'); 
}

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

当我调用now函数时,没有问题。当我调用wait函数时,我收到超时错误,然后对now的任何后续调用都给出了同样的错误。

这是预期的行为吗?我认为对lambda函数的任何后续调用都应该有效。我知道我总是可以增加配置超时,但不愿意。

6 个答案:

答案 0 :(得分:15)

您应该查看函数句柄如何与特定的一起使用  context.callbackWaitsForEmptyEventLoop

如果该布尔类型为false,则不会触发setTimeout,因为您可能先前已经回答/处理了lambda调用。 但是,如果callbackWaitsForEmptyEventLoop的值为true - 则您的代码将执行您要查找的内容。

此外 - 通过回调直接处理所有内容可能更容易,无需“手写”超时,更改配置超时等等......

E.g。

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));
};

答案 1 :(得分:8)

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

答案 2 :(得分:4)

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

  1. 解析无效的json:

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

    exports.handler = function(event, context, callback)
    {
        var emptyObject = {};
        var value = emptyObject.Item.Key;
    
  3. 访问RDS后未关闭mySql连接导致Lambda超时,然后它变得无响应。

  4. 当我说反应迟钝时,它甚至没有加载,即处理器内的第一次打印没有打印,而Lambda只是在超时的每次运行中退出:

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

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

    不幸的是,它还没有修复,经过一些测试后,它发现事实上Lambda试图重新启动(重装容器?),没有足够的时间。如果将超时设置为10秒,则执行时间约为4秒后,Lambda开始工作,然后在下一次运行中表现正常。我也尝试过设置:

    context.callbackWaitsForEmptyEventLoop = false;
    

    并将所有'要求'处理程序内的块,没有真正有用。防止Lambda死机的唯一方法是设置更大的超时,10s应该足以防止这个bug的变通方法。

答案 3 :(得分:2)

在亚马逊控制台AWS配置中,您必须将默认超时从3秒更改为更多(最多5分钟)

答案 4 :(得分:0)

我只需要增加超时时间,错误就会消失。 我把它增加到5秒。 这对我来说没问题,因为我不会在制作中使用这个Lambda。

答案 5 :(得分:0)

我认为问题是由于IP地址,我们在AWS RDS入站/出站中提到了它。

如果您现在正在测试,并且您的node.js在本地ide上而不是在AWS上运行,那么您必须执行以下操作:

  1. 转到AWS RDS。

  2. 单击数据库实例。

  3. 单击该数据库实例的名称。
  4. 转到下面的“连接”部分,您可以在其中找到安全组角色。
  5. 安全组的类型将是入站,出站。
  6. 一个接一个地单击。它将打开一个新窗口。
  7. 同样会有入站和出站两个标签。
  8. 一个又一个地单击。
  9. 单击“编辑”。
  10. 选择“任何地方”而不是“自定义”。附言对入站/出站重复此操作。

全部设置。