繁体   English   中英

DynamoDB 导致 Lambda 超时

[英]DynamoDB causing Lambda timeout

我遇到了一个问题,Lambda 功能偶尔会超时,除了 function 超时的通知之外没有任何错误消息。

为了找到问题的根源,我在 function 的各个点添加了日志记录,并确定一切正常,直到第一个 getItem() 请求从 DynamoDB 读取数据。 读取时间似乎超过了 3.00 秒超时。

自然地,我检查了我的 DynamoDB 表,看看是否有任何限制读取或错误。 DynamoDB 的指标显示没有限制或错误,读取时间最多保持在两位数毫秒。

很明显,有什么地方出了问题或在此过程中被丢弃了。 我该如何解决这个问题,或者至少抓住它并重试阅读?

这是面向读取的 function 用于 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");
    }
  }
});

没有限制读取

读取延迟似乎很小

在显着增加超时后,我发现最终会抛出网络错误:

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

根据此线程,此问题似乎是由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"
    })
  }
});

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

问题:一些(随机)lambda容器在放入数据和超时(设置为30秒)时会一直失败,而其他容器在几毫秒内完成放置数据。

根本原因:配置了两个子网(由AWS建议)。 一个是私有子网,另一个是公有子网。 当一个新的lambda容器被分离出来时,它将随机选择一个子网。 如果它选择公共子网,它将一直失败。 如果它选择私有子网,它将在几毫秒内完成。

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

如果您要在VPC中启动Lambda,请尝试在私有子网而不是公共子网中启动。 我有同样的问题,并在私有子网中启动Lambda为我工作。

不要忘记将此添加到您在私有子网中运行的 Lambda 的 SG:出站 HTTPS 连接到您的 DynamoDB VPC 端点的前缀列表 ID

这花了我几个小时才意识到。 Lambda 使用 https 来联系您 VPC 中的 DynamoDB 网关。

在我们的案例中,lambda 位于内部公有子网的 vpc 中,我们必须为 DynamoDB 添加网关 VPC 端点。 网关端点具有 IP 前缀列表,必须将其添加到子网的 ACL 入站/出站。 然后它开始工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM