Существует ли причина, по которой большие JSON-файлы (4000 объектов) не записываются в DynamodB, а небольшие файлы (10 объектов) работают - PullRequest
1 голос
/ 27 октября 2019

Получение сообщения Task timed out after 3.01 seconds в cloudwatch при попытке прочитать large JSON(66mb) из S3 bucket и записать данные в DynamodB.

Меньшие файлы JSON читают и записывают в мою таблицу DynamodB, но когда файл JSONсодержит большее количество объектов (4000 объектов, файл 66 МБ), в этом случае лямбда-функция просто возвращает Task timed out after 3.01 seconds.

const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const documentClient = new AWS.DynamoDB.DocumentClient( {
    convertEmptyValues: true
} );


exports.handler = async (event) => {
    const{name} = event.Records[0].s3.bucket;
    const{key} = event.Records[0].s3.object;

    const params = {
        Bucket: name,
        Key: key
    }

    try {
    const data = await s3.getObject(params).promise();
    const carsStr = data.Body.toString();
    const usersJSON = JSON.parse(carsStr);
    console.log(`USERS ::: ${carsStr}`);

     for (var i = 0; i < usersJSON.length; i++) {
             var record = usersJSON[i];
              console.log("Inserting record: " + record);

            var putParams = {
                Item: record,
                ReturnConsumedCapacity: "TOTAL",
                TableName: "cars"
            };

            await documentClient.put(putParams).promise();
            }


    } catch(err) {
        console.log(err);
    }

};

Ответы [ 2 ]

1 голос
/ 28 октября 2019

По умолчанию время ожидания AWS Lambda составляет 3 секунды, поэтому вы видите ошибку времени ожидания в журналах. Вы можете увеличить его в соответствии с вашими потребностями и максимум до 900 секунд

Согласно официальной документации

Тайм-аут - количество времени, которое позволяет Lambdaфункция для запуска, прежде чем остановить его. По умолчанию это 3 секунды. Максимально допустимое значение составляет 900 секунд.

Примечание: Увеличение времени ожидания, безусловно, является решением для задачи, требующей более длительного времени выполнения. Но всегда учитывайте оптимизацию кода, прежде чем увеличивать время ожидания.

0 голосов
/ 27 октября 2019

Вместо того чтобы использовать Lambda для записи в DynamoDB, заполните свою таблицу на своем компьютере для разработки.

Если вы ожидаете, что большие файлы JSON часто приходят в ваше хранилище S3, для запуска Lambda вам нужно увеличитьвремя ожидания по умолчанию для вашей функции. Максимальное время ожидания составляет 15 минут. Время ожидания по умолчанию составляет 3 секунды.

Вы также можете увеличить количество единиц емкости записи DynamoDB в вашей таблице. Емкость записи представляет одну запись в секунду для элемента размером до 1 КБ. Например, предположим, что вы создаете таблицу с 10 единицами емкости записи. Это позволяет выполнять 10 операций записи в секунду для элементов размером до 1 КБ в секунду.

Документация: https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughput.html#ProvisionedThroughput.CapacityUnits.Write

...