【问题标题】:AWS Lambda node.js timeout when trying to access DynamoDB尝试访问 DynamoDB 时 AWS Lambda node.js 超时
【发布时间】:2021-12-03 22:42:35
【问题描述】:

我在尝试访问 DynamoDB 问题时遇到了这些 AWS Lambda node.js 超时之一,但症状看起来不同,我找到的解决方案不能解决这个问题。

超时设置为 5 分钟,内存设置为 128MB,但使用量不超过 30MB。
该角色的 IAM 策略是:

  • AWSLambdaFullAccess
  • AmazonDynamoDBFullAccess
  • AWSLambdaVPCAccessExecutionRole

默认 VPC 有 7 个安全组,默认安全组包括:

  • 入站:所有流量、所有协议、所有端口范围,
  • 出站:所有流量,所有协议,所有端口范围,0.0.0.0/0

这是代码

var aws = require('aws-sdk');

exports.handler = function(event, context) {
  var dynamo = new aws.DynamoDB();

  dynamo.listTables(function(err, data) {
    if (err) {
      context.fail('Failed miserably:' + err.stack);
    } else {
      context.succeed('Function Finished! Data :' + data.TableNames);
    }
  });
};

以及结果:

START RequestId: 5d2a0294-fb6d-11e6-989a-edaa5cb75cba Version: $LATEST
END RequestId: 5d2a0294-fb6d-11e6-989a-edaa5cb75cba
REPORT RequestId: 5d2a0294-fb6d-11e6-989a-edaa5cb75cba  Duration: 300000.91 ms  Billed Duration: 300000 ms  Memory Size: 128 MB Max Memory Used: 21 MB  
2017-02-25T15:21:21.778Z 5d2a0294-fb6d-11e6-989a-edaa5cb75cba Task timed out after 300.00 seconds

解决的相关 node.js 版本问题here 对我不起作用并返回"ReferenceError: https is not defined at exports.handler (/var/task/index.js:6:16)"。 AWS 也弃用了 0.10 版。
这是带有 https 参考的代码

var aws = require('aws-sdk');

exports.handler = function(event, context) {
  var dynamo = new aws.DynamoDB({
  httpOptions: {
    agent: new https.Agent({
      rejectUnauthorized: true,
      secureProtocol: "TLSv1_method",
      ciphers: "ALL"
    })
  }
});

  dynamo.listTables(function(err, data) {
    if (err) {
      context.fail('Failed miserably:' + err.stack);
    } else {
      context.succeed('Function Finished! Data :' + data.TableNames);
    }
  });
};

结果

START RequestId: 6dfd3db7-fae0-11e6-ba81-a52f5fc3c3eb Version: $LATEST
2017-02-24T22:27:31.010Z    6dfd3db7-fae0-11e6-ba81-a52f5fc3c3eb    ReferenceError: https is not defined
    at exports.handler (/var/task/index.js:6:16)
END RequestId: 6dfd3db7-fae0-11e6-ba81-a52f5fc3c3eb
REPORT RequestId: 6dfd3db7-fae0-11e6-ba81-a52f5fc3c3eb  Duration: 81.00 ms  Billed Duration: 100 ms     Memory Size: 128 MB Max Memory Used: 26 MB  
RequestId: 6dfd3db7-fae0-11e6-ba81-a52f5fc3c3eb Process exited before completing request

将超时设置为 5 分钟,我无法相信 AWS 无法在分配的时间范围内返回表列表,并且权限问题通常会出现在日志中。

感谢您对此进行调查。

【问题讨论】:

  • 更新:使用“No VPC”可以正确完成,所以这绝对是一个 VPC 问题:START RequestId:11930536-fb72-11e6-a386-25115dc82eee 版本:$LATEST END RequestId:11930536-fb72- 11e6-a386-25115dc82eee 报告请求 ID:11930536-fb72-11e6-a386-25115dc82eee 持续时间:978.54 毫秒计费持续时间:1000 毫秒内存大小:128 MB 使用的最大内存:28 MB 如何对 VPC 错误配置进行故障排除?
  • 显然 VPC 是您真正的问题,但对于 https is not defined 问题,您只需将 var https = require('https') 添加到文件顶部即可。
  • 您运行此 Lambda 函数的 VPC 是否有 NAT 网关?您选择的 VPC 和子网中只有私有 IP 的实例可以实际路由到互联网吗?
  • 谢谢@idbehold;我会试试的。
  • @jarmod: 没有 NAT - 我只需要一个 NAT 到互联网吗?

标签: node.js amazon-dynamodb aws-lambda


【解决方案1】:

我猜您的 Lambda 位于私有子网中。在这种情况下,默认情况下您的 Lambda 将没有出站互联网访问权限。您需要创建一个 NAT 网关或 NAT 实例,让 VPC 保护的资源可以访问外部 Internet。从 VPC 的角度来看,DynamoDB API 位于 Internet 之外。

【讨论】:

    【解决方案2】:

    您不再需要创建 NAT 网关/实例

    您可以为 Dynamo DB 创建一个 VPC 端点,它将在私有子网中打开 Lambda 以访问 Dynamo。在您的 VPC 中创建一个与您为 lambda 设置的 VPC/子网设置一致的终端节点,您将不会遇到访问问题。

    您可以限制对特定服务或资源的访问。

    https://aws.amazon.com/blogs/aws/new-vpc-endpoints-for-dynamodb/

    这适用于任何全球 AWS 服务、S3 等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-01-22
      • 2015-10-12
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 2021-03-05
      • 2020-12-11
      相关资源
      最近更新 更多