我将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的原因以及如何在将来避免这种情况的想法?
答案 0 :(得分:0)
事实上,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的变通方法。