在TypeError(Node.js 4.3)之后,AWS Lambda变得没有响应

时间:2017-05-15 11:38:43

标签: javascript node.js aws-lambda

我将AWS Lambda与Node.js 4.3一起使用,并让DynamoDB加入代码:

dynamodb.get(params, function(err, data) {
    if (err) {
        console.log("Error: " + JSON.stringify(err));
        callback("Error: DB problem");
    }
    else {
            callback(null, data.Item.someAttribute);
    }
});

我知道这是错的,我需要在访问之前检查该项是否存在。现在不是重点。

我得到TypeError: TypeError:无法读取属性' someAttribute'未定义的

没关系,没有这样的项目,就会失败。在lambda变得没有响应之后,还有其他健康的请求来到lambda,而lambda每次都会因超时而失败。 正如您在下面的日志(来自CloudWatch)中看到的那样,即使错误发生后40(!)分钟,lambda仍然没有响应。而且我知道在那里没有任何事情发生,如果我在代码中打印"输入到Lambda"这可以在第一次请求中看到。在任何时候,没有这样的打印请求,Lambda刚刚死了。

START RequestId: xxx Version: 1
2017-05-12T09:20:18.739Z    Input to Lambda: ...
2017-05-12T09:20:19.770Z    xxx TypeError: Cannot read property 'someAttribute' of undefined at ...
END RequestId: xxx
REPORT RequestId: xxx   Duration: 1094.61 ms    Billed Duration: 1100 ms
RequestId: xxx Process exited before completing request

START RequestId: xxx Version: 1
END RequestId: xxx
REPORT RequestId: xxx   Duration: 3002.12 ms    Billed Duration: 3000 ms
2017-05-12T09:24:08.556Z xxx Task timed out after 3.00 seconds

...

START RequestId: xxx Version: 1
END RequestId: xxx
REPORT RequestId: xxx   Duration: 3001.15 ms    Billed Duration: 3000 ms
2017-05-12T10:01:14.672Z xxx Task timed out after 3.00 seconds

修复代码并将其重新上传到Lambda使其正常工作,但是如何使某些错误导致整个端点无响应。等待几个小时也让Lambda再次工作。 我正在考虑删除"使用严格的",但它看起来不是一个好的解决方案。 关于什么可能是死亡lambda的原因以及如何在将来避免这种情况的想法?

1 个答案:

答案 0 :(得分:0)

事实上,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. 据透露,这是一个错误,AWS团队已经知道差不多一年了: https://forums.aws.amazon.com/thread.jspa?threadID=238434&tstart=0

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

    context.callbackWaitsForEmptyEventLoop = false;
    

    并将所有'require'块放在处理程序中,没有任何实际工作。防止Lambda死机的唯一方法是设置更大的超时,10s应该足以防止这个bug的变通方法。