[英]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变得反应迟钝的情况很多,例如:
解析无效的json:
exports.handler = function(event, context, callback) { var nonValidJson = "Not even Json"; var jsonParse = JSON.parse(nonValidJson);
访问未定义变量的属性:
exports.handler = function(event, context, callback) { var emptyObject = {}; var value = emptyObject.Item.Key;
访问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.