DynamoDB 导致 Lambda 超时

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)

没有限制读取

读取延迟似乎最小

Tyl*_*ler 6

大幅增加超时后,发现最终抛出网络错误:

{
    "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)

  • 这里棘手的事情是,为了能够调试这些问题,您需要让 DynamoDB 调用失败。如果在 Lambda 中使用,请确保调用在 Lambda(或 API 网关)超时之前失败。我们在这里详细介绍了它 - https://seed.run/blog/how-to-fix-dynamodb-timeouts-in-serverless-application (2认同)

Sys*_*DLL 5

在将数据从 lambda“放入”到 DynamoDB 时遇到随机 lambda 超时问题。Lambda 驻留在 VPC 中(根据组织策略)。

问题:某些(随机)Lambda 容器在放入数据时会持续失败并超时(设置为 30 秒),而其他容器则在几毫秒内完成放入数据。

根本原因:配置了两个子网(按照 AWS 的建议)。一个是私有子网,另一个是公共子网。当一个新的 lambda 容器被剥离时,它会随机选择一个子网。如果它选择公共子网,它将始终失败。如果选择私有子网,则只需几毫秒即可完成。

解决方案:删除公共子网,并配置两个私有子网。

  • Lambda 函数位于 VPC 中,因为它访问 Aurora RDS。有关如何从 VPC 中的 lambda 访问互联网(本例中为 DynamoDB 端点)的更多信息,请参阅 https://aws.amazon.com/premiumsupport/knowledge-center/internet-access-lambda-function/ (2认同)