2015-08-18 2 views
14

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

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

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

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

+0

* «Не уверен, что этот триггер предназначен для многократной загрузки или же загрузки» * ...не кажется ли вам, что это должно быть первым, что вы должны поработать над выяснением? Безгражданство не имеет к этому никакого отношения. Изучите содержимое события, создайте журнал того, что вы получаете в событии S3, и сохраните его для просмотра, и объяснение должно стать очевидным. Скорее всего, поведение в том, что вы используете для первоначальной загрузки объекта, делает больше операций S3, чем вы понимаете. –

+0

Вам нужно развернуть этот вопрос с более подробной информацией. В идеале образец кода. – kixorz

+3

Похоже, что загрузка разбивается на части. Вы хотите создать событие, укажите, что событие выполняется только на 's3: ObjectCreated: CompleteMultiPartUpload', [этот учебник] (http://docs.aws.amazon.com/lambda/latest/dg/with-s3 -example-configure-event-source.html) показывает, как это сделать, просто замените 's3: ObjectCreated: *' на 's3: ObjectCreated: CompleteMultiPartUpload'. – philippjfr

ответ

12

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

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

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

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

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

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

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

Этот идентификатор события представляет собой конкретное событие, для которого была вызвана лямбда, и должна быть одинаковой для всех лямбда-исполнений, которые отвечают за одно и то же событие 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 

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

+0

+1 Не относится к S3, для меня это происходит и для CloudWatch Lambda Triggers. Есть ли возможность предотвратить это, кроме увеличения таймаута. – titogeo

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 */ 
     ... 
    }); 
} 

Надеется, что это помогает!

Смежные вопросы