通过及时的扫描任务读取DynamoDB中的所有记录

时间:2018-08-30 00:36:04

标签: amazon-web-services aws-lambda amazon-dynamodb dynamodb-queries

假设我有一个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++;
        })
    });

};

我想对表中的所有项目进行扫描,但是我不想引起读取峰值。是否有一种方法可以将此Lambda函数作为任务运行,每N次读取T个项目,直到覆盖所有项目?

2 个答案:

答案 0 :(得分:1)

您可以使用AWS Step Function帮助管理Lambda函数。 AWS Step Function可以在Lambda调用之间休眠。您的Lambda可以返回LastEvaluatedKey并将其作为参数从Step Function接收。

答案 1 :(得分:0)

因此,有多种方法可以解决此问题,我想我已经尝试了所有方法。 @cementblocks建议的解决方案有效,但对于这样一个小问题来说有点过头了,因为您需要处理所有回调失败,并且如果顺序对您而言不是一个可靠的选择。

我最终将GoogleTranslate googleTranslate = new GoogleTranslate(); // Perform the translation by invoking the execute method, but first save the result in a String. // The second parameter is the source language, the third is the terget language String result = googleTranslate.execute("the text to be translated", "en", "de").get(); 导入到DynamoDB。它简单,可靠,一旦导入Redshift,您就可以执行所有需要的查询。

这是AWS Wiki页面中的the related Docs