通过定时扫描任务读取DynamoDB中的所有记录
Read all the records in DynamoDB by a timely scan task
假设我有一个包含足够项目的 DynamoDB,当我使用这个基本的 Lambda 函数进行扫描时会抛出超时异常:
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.handler = function (event, context) {
var tableName = "TABLE_NAEM";
var params = {
TableName : tableName,
"ReturnConsumedCapacity": "TOTAL"
};
var counter = 1;
dynamodb.scan(params, function(err, data) {
if (err) {
context.done('error', 'reading ddb failed: ' + err);
}
data.Items.forEach(function(element) {
console.log(counter + "- " + element.whatever.S);
counter++;
})
});
};
我想扫描 Table 中的所有项目,但我不想引起阅读峰值。有没有办法 运行 此 Lambda 函数作为一项任务,每 T
次读取 N
项,直到涵盖所有项?
您可以使用 AWS Step Function 来帮助管理您的 Lambda 函数。
AWS Step Function 可以在 Lambda 调用之间休眠。您的 Lambda 可以 return LastEvaluatedKey 并将其作为 Step Function 的参数接收。
所以有不同的方法来解决这个问题,我想我已经尝试了所有方法。 @cementblocks 建议的解决方案有效,但对于这样一个小问题来说有点矫枉过正,因为您需要处理所有回调失败,如果顺序对您来说很重要,那么它不是一个可靠的选择。
我最终将 DynamoDB
导入到 Redshift
。它简单、可靠,一旦导入到 Redshift
,您就可以进行所有查询。
这是 AWS 维基页面中的 the related Docs。
假设我有一个包含足够项目的 DynamoDB,当我使用这个基本的 Lambda 函数进行扫描时会抛出超时异常:
var AWS = require('aws-sdk');
var dynamodb = new AWS.DynamoDB({apiVersion: '2012-08-10'});
exports.handler = function (event, context) {
var tableName = "TABLE_NAEM";
var params = {
TableName : tableName,
"ReturnConsumedCapacity": "TOTAL"
};
var counter = 1;
dynamodb.scan(params, function(err, data) {
if (err) {
context.done('error', 'reading ddb failed: ' + err);
}
data.Items.forEach(function(element) {
console.log(counter + "- " + element.whatever.S);
counter++;
})
});
};
我想扫描 Table 中的所有项目,但我不想引起阅读峰值。有没有办法 运行 此 Lambda 函数作为一项任务,每 T
次读取 N
项,直到涵盖所有项?
您可以使用 AWS Step Function 来帮助管理您的 Lambda 函数。 AWS Step Function 可以在 Lambda 调用之间休眠。您的 Lambda 可以 return LastEvaluatedKey 并将其作为 Step Function 的参数接收。
所以有不同的方法来解决这个问题,我想我已经尝试了所有方法。 @cementblocks 建议的解决方案有效,但对于这样一个小问题来说有点矫枉过正,因为您需要处理所有回调失败,如果顺序对您来说很重要,那么它不是一个可靠的选择。
我最终将 DynamoDB
导入到 Redshift
。它简单、可靠,一旦导入到 Redshift
,您就可以进行所有查询。
这是 AWS 维基页面中的 the related Docs。