Прочитать все записи в DynamoDB с помощью задачи своевременной проверки

Скажем, у меня есть 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++;
        })
    });

};

Я хочу выполнить сканирование ВСЕХ элементов в таблице, но я не хочу вызывать всплеск чтения. Есть ли способ запустить эту лямбда-функцию как задачу, читая N элементы каждый T раз, пока не будут охвачены все элементы?


person Yar    schedule 30.08.2018    source источник
comment
Некоторая комбинация Limit: N в параметрах сканирования плюс управление разбивкой на страницы, а затем решение проблемы повторного сканирования каждые T секунд, возможно, с помощью setTimeout / setInterval. Вам нужно будет сохранить LastEvaluatedKey из ответа K, чтобы заполнить ExclusiveStartKey в запросе K + 1.   -  person jarmod    schedule 30.08.2018


Ответы (2)


Вы можете использовать функцию AWS Step, чтобы управлять своей функцией Lambda. Функция AWS Step может находиться в режиме ожидания между вызовами Lambda. Ваша Lambda может вернуть LastEvaluatedKey и получить его как параметр от функции Step.

person cementblocks    schedule 31.08.2018

Итак, есть разные подходы к решению этой проблемы, и я думаю, что перепробовал их все. Решение, предложенное @cementblocks, работает, но это своего рода излишество для такой небольшой проблемы, поскольку вам нужно обрабатывать все сбои обратного вызова, и если порядок важен для вас, это ненадежный вариант.

В итоге я импортировал свой DynamoDB в Redshift. Это просто, надежно, и после импорта в Redshift вы можете выполнять все запросы, которые захотите.

Здесь соответствующие документы на странице вики AWS.

person Yar    schedule 05.09.2018