我遇到的问题是Lambda函数偶尔超时而没有任何错误消息,除了函数超时的通知。
为了找到问题的根源,我在整个函数的各个点添加了日志记录,并确定一切正常,直到第一个getItem()请求从DynamoDB读取数据。读取似乎超过了3.00秒超时。
当然,我检查了我的DynamoDB表,看看是否有任何限制读取或错误。 DynamoDB的指标显示没有限制或错误,读取时间最多只保持两位数毫秒。
显然有些事情出了问题或者一路走来。我该如何解决这个问题,或者至少抓住它并重试读取?
这是一个面向读取的Web API函数,因此响应时间至关重要。因此,增加超时不会解决问题。
dynamodb.getItem({
"TableName": "tablename",
"Key": { "keyname": { "S": "keyvalue" } },
"AttributesToGet": [ "attributeA", "attributeB" ]
}, function(err, data) {
if(err){
context.done(err);
} else {
if("Item" in data){
nextFunction(event, context);
} else {
context.done("Invalid key");
}
}
});
答案 0 :(得分:4)
在显着增加超时后,我发现最终会抛出网络错误:
{
"errorMessage": "write EPROTO",
"errorType": "NetworkingError",
"stackTrace": [
"Object.exports._errnoException (util.js:870:11)",
"exports._exceptionWithHostPort (util.js:893:20)",
"WriteWrap.afterWrite (net.js:763:14)"
]
}
根据this thread,此问题似乎是由Node.js和OpenSSL之间的问题引起的。听起来这个问题会影响Node.js 4.x及以上,但不会影响0.10。这意味着您可以通过将Lambda运行时降级到Node.js 0.10或在使用aws-sdk时添加以下代码来解决问题:
new AWS.DynamoDB({
httpOptions: {
agent: new https.Agent({
rejectUnauthorized: true,
secureProtocol: "TLSv1_method",
ciphers: "ALL"
})
}
});
答案 1 :(得分:0)
在将数据从lambda“放置”到DynamoDB时遇到随机lambda超时问题。 Lambda驻留在VPC中(根据组织策略)。
问题:某些(随机)lambda容器在放置数据和超时(设置为30秒)时始终会失败,而其他容器则在几毫秒内完成了数据放置。
根本原因:配置了两个子网(AWS建议)。一个是私有子网,另一个是公共子网。分离出一个新的lambda容器后,它将随机选择一个子网。如果选择公共子网,它将始终失败。如果选择专用子网,它将在几毫秒内完成。
解决方案:删除公共子网,而是配置两个私有子网。
答案 2 :(得分:0)
如果要在VPC中启动Lambda,请尝试在专用子网而不是公共子网中启动。 我遇到了同样的问题,因此在私有子网中启动Lambda对我有用。