尝试访问 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 版本问题已在
此处
解决,但它对我不起作用,并返回
“ReferenceError:https 未在 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 将没有出站互联网访问权限。你需要创建一个 NAT 网关或 NAT 实例,以便让 VPC 保护的资源访问外部互联网。从 VPC 的角度来看,DynamoDB API 位于互联网之外。
您不再需要创建 NAT 网关/实例
您可以为 Dynamo DB 创建 VPC 端点,它将在私有子网中打开 Lambda 以访问 Dynamo。在您的 VPC 中创建一个与您为 lambda 设置的 VPC/子网一致的端点,这样您就不会遇到访问问题。
您可以限制对特定服务或资源的访问。
https://aws.amazon.com/blogs/aws/new-vpc-endpoints-for-dynamodb/
这可以针对任何全球 AWS 服务、S3 等完成