Могу ли я ограничить одновременные вызовы AWMS Lambda?

У меня есть функция Lambda, которая запускается PUT в ведро S3.

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

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

Как ограничить количество одновременных вызовов Лямбды?

Ответ 1

Нет, это одна из тех вещей, которые мне бы очень хотелось увидеть поддержку Lambda, но в настоящее время это не так. Одна из проблем заключается в том, что если бы было много операций S3 PUT, то AWS пришлось бы каким-то образом приостанавливать все вызовы Lambda, и в настоящее время нет поддержки для этого.

Если вы создали механизм блокировки в вашей функции Lambda, что бы вы сделали с запросами, которые вы не обрабатываете из-за блокировки? Вы просто выбросите эти уведомления S3?

Решение, рекомендуемое большинством людей, состоит в том, чтобы S3 отправил уведомления в очередь SQS, а затем планировалось, что ваша функция Lambda будет выполняться периодически, например, один раз в минуту, и проверьте, есть ли элемент в очереди, которая должна быть обрабатываются.

В качестве альтернативы, S3 отправляет уведомления в SQS и просто имеет экземпляр t2.nano EC2 с однопоточной службой, опросив очередь.

Ответ 3

Я предлагаю вам использовать Kinesis Streams (или, альтернативно, DynamoDB + DynamoDB Streams, которые по существу имеют одинаковое поведение).

Вы можете видеть потоки Kinesis Streams как очереди. Хорошая часть состоит в том, что вы можете использовать поток Kinesis как триггер для вас Lambda. Таким образом, все, что вставлено в эту очередь, автоматически передается вашей функции по порядку. Таким образом, вы сможете обрабатывать эти события S3 один за другим, одно выполнение Lambda после другого (по одному экземпляру за раз).

Для этого вам нужно создать функцию Lambda с простой целью получить события S3 и поместить их в поток Kinesis. Затем вы сконфигурируете этот поток Kinesis как ваш Lambda Trigger.

Поток событий

Когда вы настраиваете поток Kinesis в качестве Lambda Trigger, я предлагаю вам использовать следующую конфигурацию:

  • Размер партии: 1
    • Это означает, что ваш Lambda будет вызван с только одним событием из Kinesis. Вы можете выбрать большее число, и вы получите список событий такого размера (например, если вы хотите обработать последние 10 событий в одном выполнении Lambda вместо 10 последовательных Lambda-исполнений).
  • Начальная позиция: горизонт Trim
    • Это означает, что он будет вести себя как очередь (FIFO)

Немного больше информации о Серия WES May Webinar - потоковая обработка данных с помощью Amazon Kinesis и AWS Lambda.

Я надеюсь, что это поможет любому, у кого есть аналогичная проблема.

P.S. Имейте в виду, что Kinesis Streams имеют свои собственные pricing. Использование потоков DynamoDB + DynamoDB может быть более дешевым (или даже бесплатным из-за неисключительного

Ответ 4

Попросите S3 "Поместить события" вывести сообщение в очередь (вместо включения функции лямбда). Сообщение должно содержать ссылку на объект S3. Затем РАСПИСАЙТЕ лямбда, чтобы "SHORT POLL всю очередь".

PS: События S3 не могут инициировать поток Kinesis... только SQS, SMS, Lambda (см. http://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html#supported-notification-destinations). Kinesis Stream является дорогостоящим и используется для обработки событий в реальном времени.