Когда SNS повторяет сообщение в Lambda, и могу ли я форсировать его? - PullRequest
0 голосов
/ 26 февраля 2020

Я настроил лямбду следующим образом:

exports.handler = async (event) => {
  throw new Error('I AM SAD');
};

Она может быть вызвана как из SNS topi c, так и из шлюза API.

Я также настроил SNS topi c с двумя подписками; один отправляет сообщения напрямую в Lambda (используя протокол Lamba); другой отправляет его через API-шлюз (HTTPS). Я хотел бы, чтобы SNS повторил отправку сообщения при сбое лямбды. Но это только похоже на работу через API Gateway. Когда лямбда вызывается напрямую, SNS пытается только один раз (и сообщает об УСПЕХЕ).

Я знаю, что есть какая-то политика повторения даже для SNS -> Lambda, но когда это срабатывает? Для SNS -> HTTP он запускается при получении кода ошибки HTTP.

С Очереди недоставленных сообщений Amazon SNS - Amazon Simple Notification Service :

Ошибки на стороне клиента могут возникать, когда Amazon SNS имеет устаревшие метаданные подписки. Эти ошибки обычно возникают, когда владелец удаляет конечную точку (например, функцию Lambda, подписанную на топику Amazon SNS c) или когда владелец меняет политику, связанную с подписанной конечной точкой, таким образом, чтобы Amazon SNS не доставлял сообщения в конечная точка. Amazon SNS не повторяет доставку сообщения, которая завершается с ошибкой в ​​результате ошибки на стороне клиента.

Является ли неисправная лямбда (как показано выше) рассматриваемой как клиентская боковая ошибка? Могу ли я вызвать ошибку на стороне сервера?

1 Ответ

1 голос
/ 27 февраля 2020

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

SNS пытается только один раз (и сообщает об УСПЕХЕ).

Это как разработан. SNS успешно передал запрос в службу Lambda для асинхронного вызова вашей функции Lambda с полезной нагрузкой сообщения, опубликованной вами в SNS.

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

Amazon SNS вызывает вашу функцию асинхронно с событием, которое содержит сообщение и метаданные.

...

Для асинхронного вызова Lambda ставит сообщение в очередь и обрабатывает повторные попытки. Если Amazon SNS не может связаться с Lambda или сообщение отклонено, Amazon SNS повторяет попытки через несколько часов. Подробности см. В разделе «Надежность» в разделе часто задаваемых вопросов Amazon SNS.

https://docs.aws.amazon.com/lambda/latest/dg/with-sns.html

Как только запрос на вызов был передан, SNS больше не участвует в событие.

Служба Lambda повторяет неудачные вызовы.

Несколько AWS служб, таких как Amazon Simple Storage Service (Amazon S3) и Amazon Simple Notification Service ( Amazon SNS), вызывать функции асинхронно для обработки событий. Когда вы вызываете функцию асинхронно, вы не ждете ответа от кода функции. Вы передаете событие Лямбде, а Лямбда обрабатывает все остальное. Вы можете настроить, как Lambda будет обрабатывать ошибки, и отправлять записи вызовов в нисходящий ресурс для объединения компонентов вашего приложения.

https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html

By по умолчанию вы должны увидеть журналы, в которых указано, что Lambda вызвала вашу функцию выброса исключений всего 3 раза, через 1 минуту, а затем через 2 минуты.

...