Функция aws lambda, запускающая несколько раз для одного события

Я использую функцию aws lambda для преобразования загруженного wav файла в формате bucket в mp3 и последующего перемещения файла в другое ведро. Он работает правильно. Но есть проблема с запуском. Когда я загружаю небольшие wav файлы, функция лямбда вызывается один раз. Но когда я загружаю большой wav файл большого размера, эта функция запускается несколько раз.

Я искал эту проблему и обнаружил, что она без гражданства, поэтому она будет вызываться несколько раз (не уверен, что этот триггер для множественной загрузки или одной загрузки).

https://aws.amazon.com/lambda/faqs/

Есть ли способ вызвать эту функцию один раз для одной загрузки?

Ответы

Ответ 1

Краткая версия: Попробуйте увеличить тайм-аут в конфигурации вашей лямбда-функции.

Длинная версия:

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

События S3 являются асинхронными по своей природе, и лямбда-функция, прослушивающая события S3, решается как минимум 3 раза, прежде чем это событие будет отклонено. Вы упомянули, что ваша лямбда-функция выполняется только один раз (без ошибок) при загрузке меньшего размера, при которой вы выполняете конвертацию и повторно загружаете. Существует вероятность того, что время, необходимое для преобразования и повторной загрузки из вашего кода, больше, чем время ожидания вашей лямбда-функции.

Поэтому вы можете попытаться увеличить значение тайм-аута в своей конфигурации лямбда-функции.

Кстати, один из способов подтвердить, что ваша лямбда-функция вызывается несколько раз, - это поиск в журналах облачного прослушивания для идентификатора события (67fe6073-e19c-11e5-1111-6bqw43hkbea3) -

START RequestId: 67jh48x4-abcd-11e5-1111-6bqw43hkbea3 Version: $LATEST

Этот идентификатор события представляет собой конкретное событие, для которого было вызвано lambda, и должно быть одинаковым для всех лямбда-исполнений, которые отвечают за одно и то же событие S3.

Кроме того, вы можете искать время выполнения (Duration) в следующей строке журнала, которая отмечает завершение одного лямбда-исполнения -

REPORT RequestId: 67jh48x4-abcd-11e5-1111-6bqw43hkbea3  Duration: 244.10 ms Billed Duration: 300 ms Memory Size: 128 MB Max Memory Used: 20 MB

Если это не решение, оно, по крайней мере, даст вам место для отладки в правильном направлении. Дайте мне знать, как это происходит.

Ответ 2

Объект context содержит информацию о том, какой идентификатор запроса вы обрабатываете. Этот идентификатор не изменится, даже если одно и то же событие срабатывает несколько раз. Вы можете сохранить этот идентификатор каждый раз, когда запускается событие, а затем проверить, что последний идентификатор, который вы обрабатывали, не совпадает с текущим.

Вот мой последний код для исправления этой проблемы (NodeJS с обработчиком базы данных MongooseJS):

exports.handler = function(event, context, lambdaCallback) {        
    Events.findOneAndUpdate(
        { name: 'some-event-name' }, 
        { lastRequestId: context.awsRequestId }).then(function(event) {

        // Without specifying the option "new: true" the old document is returned
        // after the update, so we check the ID against the old value 

        if(event.lastRequestId == context.awsRequestId) {
            return;
        }

        /* Run the actual job */
        ...
    });
}

Надеюсь, это поможет!