AWS SQS + SNS + Lambda

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

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

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

4 ответа

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

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

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

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

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

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

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

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

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

Как уже упоминалось, источники событий могут быть лучшим выбором здесь. В качестве альтернативы, и я не проверял это и не продумывал это (так что это своего рода академическое), но это может быть возможно сделать через шаблон разветвления с 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 (... один отбрасывается?), Но это просто еще один способ решить эту проблему. знак равно

Другие вопросы по тегам