DynamoDB导致Lambda超时

时间:2016-05-26 16:52:47

标签: 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");
    }
  }
});

No throttled reads

Read latency appears to be minimal

3 个答案:

答案 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对我有用。