Tyl*_*ler 8 node.js amazon-dynamodb aws-sdk aws-lambda
我遇到了一个问题,即 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");
}
}
});
Run Code Online (Sandbox Code Playgroud)
大幅增加超时后,发现最终抛出网络错误:
{
"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)"
]
}
Run Code Online (Sandbox Code Playgroud)
根据此线程,此问题似乎是由 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"
})
}
});
Run Code Online (Sandbox Code Playgroud)
在将数据从 lambda“放入”到 DynamoDB 时遇到随机 lambda 超时问题。Lambda 驻留在 VPC 中(根据组织策略)。
问题:某些(随机)Lambda 容器在放入数据时会持续失败并超时(设置为 30 秒),而其他容器则在几毫秒内完成放入数据。
根本原因:配置了两个子网(按照 AWS 的建议)。一个是私有子网,另一个是公共子网。当一个新的 lambda 容器被剥离时,它会随机选择一个子网。如果它选择公共子网,它将始终失败。如果选择私有子网,则只需几毫秒即可完成。
解决方案:删除公共子网,并配置两个私有子网。
| 归档时间: |
|
| 查看次数: |
10857 次 |
| 最近记录: |