2017-02-03 2 views
13

У меня есть функция Lambda, которая запускается PUT в ведро S3.Могу ли я ограничить одновременные вызовы AWMS Lambda?

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

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

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

+0

интересует, почему вы заботитесь сколько вызовы могут работать одновременно. – jarmod

+0

@jarmod Это было в то время, когда я думал о запуске изменений Terraform в Lambdas, и я не знал, как сделать дистанционное государственное блокирование в самой Terraform. Я отказался от этой идеи - отчасти потому, что вы не можете ограничить одновременный Lambdas, и отчасти потому, что я беспокоился о пятиминутных тайм-аутах. – alexwlchan

ответ

9

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

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

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

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

9

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

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

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

Event Flow

При настройке Kinesis поток в качестве лямбда Trigger Я предлагаю вам использовать следующую конфигурацию:

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

немного больше информации о AWS May Webinar Series - Streaming Data Processing with Amazon Kinesis and AWS Lambda.

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

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

+0

Этот ответ замечательный! OP должен действительно принять это решение. – GavinoGrifoni

0

Имейте 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 является дорогостоящим и используется для обработки событий в реальном времени.

12

AWS Lambda теперь поддерживает ограничения параллелизма на отдельные функции: https://aws.amazon.com/about-aws/whats-new/2017/11/set-concurrency-limits-on-individual-aws-lambda-functions/

enter image description here

+0

Это потрясающе. Мне удалось решить проблему параллелизма при обновлении файла на S3. Я использую лямбда-функцию для обновления файла на S3, используя счет параллелизма как 1. Это гарантирует, что в один момент только один экземпляр ec2 имеет доступ на запись к файлу. Это намного дешевле, чем использование любого управляемого DB на AWS для тривиального использования. –