繁体   English   中英

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

[英]AWS Lambda becomes unresponsive after TypeError (Node.js 4.3)

我正在使用带有Node.js 4.3的AWS Lambda,并在代码中使用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);
    }
});

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

我得到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的原因以及如何在将来避免这种情况的想法?

事实上,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超时,然后它变得无响应。

据透露,这是一个错误,AWS团队已知将近一年:
https://forums.aws.amazon.com/thread.jspa?threadID=238434&tstart=0

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

context.callbackWaitsForEmptyEventLoop = false;

并将所有'require'块放在处理程序中,没有什么真正起作用。 防止Lambda死机的唯一方法是设置更大的超时,10s应该足以作为针对此bug的变通防护。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM