Дублирует ли AWS Lambda каждое сообщение?
У меня есть сборка CodePipeline, работающая в AWS, и все прекрасно работает, за исключением того, что внутри CodePipeline нет хорошего механизма уведомлений. Похоже, что принятым решением для этого является настройка CloudWatch для вызова Lambda или SNS для отправки вашего сообщения.
Итак, я создал небольшую Java-программу для отправки сообщений в Slack на основе событий CloudWatch CodePipeline. Это работает хорошо, за исключением того, что каждое отдельное сообщение повторяется полдюжины раз или больше. Кажется, это отличается от всех других постов, которые я читал о дублированных казнях Lambda, где вы иногда получаете дубликат здесь или там.
Я знаю, что стандартный ответ заключается в том, что Lambda хочет обеспечить доставку, поэтому события могут быть повторены, что нормально - если каждые 20 или 100 сообщений я получу дубликат, я буду в порядке. Но я не могу залить канал Slack более чем 50 сообщениями за каждый простой запуск CP. Не говоря уже о том, что я полагаю, что мне выставляют счета за каждое из этих Lambda-исполнений, хотя на самом деле мне нужно получать только 4 за цикл.
Я не хочу настраивать БД для отслеживания уникальных идентификаторов - опять же, это добавляет сложности и стоимости (выполнение по-прежнему происходит). Такое ощущение, что что-то неправильно настроено. Например, есть ли причина, по которой CloudWatch по каким-то причинам будет собирать то же сообщение и пересылать его в Lambda? Или причина, по которой Lambda считает, что выполнение нужно повторить, даже если оно успешно завершено?
1 ответ
Я предполагаю, что это зависит от того, как вы настроили свой прослушиватель событий CloudWatch. Если не соблюдать осторожность, вы будете запускать действия при переходах этапа CodePipeline или действия, а не изменения состояния CodePipeline. Скопировано из главы Обнаружение и реагирование на изменения в состоянии конвейера с помощью событий Amazon CloudWatch в руководстве пользователя CodePipeline:
Вы можете настроить уведомления, которые будут отправляться при изменении состояния для:
- Указанные трубопроводы или все ваши трубопроводы. Вы управляете этим с помощью "detail-type": "Изменение состояния выполнения CodePipeline Pipeline".
- Определенные этапы или все ваши этапы, в пределах указанного конвейера или всех ваших конвейеров. Вы управляете этим с помощью "detail-type": "Изменение состояния выполнения этапа CodePipeline".
- Указанные действия или все действия на указанном этапе или на всех этапах в указанном конвейере или всех ваших конвейерах. Вы управляете этим с помощью "detail-type": "Изменение состояния выполнения действия CodePipeline".
Например, если вас интересует только когда завершится CodePipeline, вы должны настроить CloudWatch Events следующим образом:
{
"source": [
"aws.codepipeline"
],
"detail-type": [
"CodePipeline Pipeline Execution State Change",
],
"detail": {
"state": [
"SUCCEEDED",
"FAILED",
"CANCELED"
],
"pipeline": [{ "Ref": "myPipeline" }]
}
}
Комментарии:
- Обратите внимание, что
STARTED
,RESUMED
а такжеSUPERSEDED
был исключен из списка состояний выше (который может или не может быть то, что вам нравится) - Помните, что изменение состояния выполнения отличается от состояния изменения этапа выполнения, которое, в свою очередь, отличается от изменения состояния выполнения действия.
- Оставьте
pipeline
часть конфигурации для прослушивания событий со всех CodePipeline s, которые вы имеете, в отличие от конкретных. - Читайте больше в руководстве пользователя CodePipeline, упомянутом ранее.