SQS и Lambda

Начиная с прошлой недели стало возможным использовать Amazon Simple Queue Service (SQS) как триггер для вызова Lambda функций. Довольно востребованная функциональность, если подумать. Обычное использование очереди: есть какой-то вычислительные ресурс (например EC2), который регулярно опрашивает очередь на предмет новых сообщений; если сообщение появляется в очереди, вычислительный ресурс его обрабатывает и снова попадает в цикл ожидания. Если сообщений в очереди много, за чем можно следить при помощи метрик Amazon CloudWatch, то количество обработчиков можно увеличить, используя AutoScasling. Таким образом нужно было держать вычислительный ресурс, который бы «следил» нет ли в очереди сообщений. Сейчас это полностью можно заменить сервисом Amazon Lambda. А учитывая то, что Amazon Lambda автоматически «скэйлится», то не нужно думать об увеличении вычислительных мощностей в ответ на увеличение сообщений в очереди.

Как это работает? Для начала нужна очередь. Создается она буквально в один клик в консоли или вызов одной команды в командной строке. Для FIFO очередей Lambda пока не работает, только для стандартных.

Потом нужно создать Lambda функцию и в качестве триггера указать SQS и выбрать созданную очередь.

Нужно не забыть про права доступа, которые должны быть у функции. Обязательно включить туда права на SQS:

{ 
"Version": "2012-10-17", 
"Statement": [ { 
       "Sid": sid, "Effect": "Allow", "Action": [ "sqs:DeleteMessage", "sqs:ChangeMessageVisibility", "sqs:ReceiveMessage", "sqs:GetQueueAttributes" ], "Resource": “arn:aws:sqs:region:123456789012:test-queue“ } ] }

Выбрать какое количество сообщений данная Lambda функция будет обрабатывать. По умолчанию 10. Это также является максимальным значением.
Для примера возьмем функцию на Python, которая только распечатывает сообщения:

Lambda будет автоматически «скэйлится» исходя из количества сообщений в очереди. Так же количество одновременно исполняемых функций можно ограничить параметром Concurrency в свойствах функции. Сообщение будет признано обработанным, если функция вернет положительный статус. В этом случае сообщение будет удалено из очереди. Если же завершение функции будет неуспешным в случае ошибки или завершению по timeout, сообщение будет возвращено в очередь для последующей обработки.

Помещаем сообщение в очередь:

$ aws --region eu-central-1 sqs send-message --queue-url https://sqs.eu-central-1.amazonaws.com/123456789012/SQS2LambdaQueue --message-body "hello, world"

И в CloudWatch логах Lambda функции видим сообщение о выполнении:

Документация доступна по адресу https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *