Назад | Перейти на главную страницу

AWS SQS + SNS + Lambda

Мне было интересно, могу ли я отправить сообщение в очередь SQS и подписать на него тему SNS, чтобы активировать лямбду для отправки электронного письма.

SQS -> SNS -> (Лямбда) -> SES

Я знаю, что сообщения SNS можно отправлять в SQS, но мне любопытно, возможно ли обратное

Одна вещь, которую я сделал, - это создала будильник CloudWatch на ApproximateNumberOfMessagesVisible (>= 1 for 5 minutes) для очереди SQS. Аварийный сигнал публикуется в теме SNS, которая запускает лямбда-функцию. Лямбда-функция зацикливается, пока не очистит очередь.

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

Ты не можешь пойти SQS -> SNS, только SNS -> SQS.

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

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

SQS очередь может быть подписана на SNS тема и так обработать полученные SNS Сообщения. В настоящее время это невозможно в другом направлении без дополнительного кодирования (см., Например, Lambda Вопросы-Ответы).

Я бы сказал, что есть несколько вариантов, как это сделать, но это не так элегантно, как использование более распространенной системы, управляемой событиями. AWS event->SQS->Lambda. В противном случае вам может потребоваться настроить / реализовать код, как SQS очереди обрабатываются:

  1. вы можете реализовать свой собственные источники событий
  2. ты можешь иметь немного промежуточный экземпляр EC2 слушать SQS очереди, а затем вызвать Lambda на мероприятиях SQS

Об этом спросили и ответили некоторое время назад, но, только что подумав об этом, я подумал, что добавлю подход.

Как уже упоминалось, Источники событий может быть лучшим выбором здесь. В качестве альтернативы, и я не тестировал это и не думал об этом (так что это своего рода академический), но это можно сделать с помощью шаблона Fan-Out с SNS следующим образом:

 1. Create a SNS topic.............................: SNS-topic-01
 2. Subscribe a SQS queue to that topic............: SQS-queue-01
 3. Subscribe a Lambda Function to that topic......: LAMBDA-func-01

Используя эту конфигурацию, отправка сообщения в тему SNS помещает его в очередь SQS, одновременно вызывая сопутствующую лямбда-функцию. Эта функция Lambda будет написана для чтения той же самой очереди SQS, но с Длинный опрос включен (до 20 секунд), чтобы он не читал очередь до завершения постановки в очередь (т.е. состояние гонки).

По сути, эта схема точно в срок вызывает одну лямбда-функцию для каждого помещенного в очередь сообщения SQS. Я не знаю, как одновременные читатели Long Poll работают с SQS (... неужели кто-то упал?), Но это просто еще один способ решить эту проблему. знак равно