尝试访问DynamoDB时,AWS Lambda node.js超时

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试访问DynamoDB时,AWS Lambda node.js超时相关的知识,希望对你有一定的参考价值。

尝试访问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无法在分配的时间范围内返回表列表,并且权限问题通常会出现在日志中。

感谢您查看这个。

答案

我猜你的Lambda在私有子网中。在这种情况下,默认情况下,您的Lambda将不具有出站Internet访问权限。您需要创建NAT网关或NAT实例,以允许受VPC保护的资源访问Internet外部。从VPC的角度来看,DynamoDB API在Internet之外。

另一答案

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

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

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

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

这可以用于任何全球AWS服务,S3等

以上是关于尝试访问DynamoDB时,AWS Lambda node.js超时的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda:即使在STS:AssumeRole成功之后,lambda函数仍然使用旧的IAM角色

AWS Lambda 测试不从 DynamoDB 表返回数据

无服务器框架 + AWS + Lambda + DynamoDB + GraphQL + Apollo Server = 无法使 POST 请求工作

AWS API Gateway 的访问权限

计算AWS lambda调用并按api键分段数据

无服务器框架+ AWS + Lambda + DynamoDB + GraphQL + Apollo Server =无法使POST请求工作