«Всё нормально»… Или нет: получаем SMS-уведомления о сбоях сервера с помощью Amazon Lambda

Автор: | 10.08.2026

Тот факт, что ему пришлось пролистать длинный список писем, чтобы найти уведомление о сбое сервера, означало, что избежать последствий уже не удастся. Но время минимизировать ущерб еще оставалось. Ник быстро отреагировал на сбои серверов, которых, к счастью, было немного.

Словно сцена из черно-белой рекламы, Ник подумал: «Должен быть способ лучше!» Его «лучший способ» не включал покупку сервиса оповещений, который был бы слишком масштабным (и дорогим) для его небольшой команды в ThisData. Вместо этого он создал собственный сервис оповещений о сбоях, используя Amazon Lambda и Twilio.

«Я был уверен, что смогу сделать это быстро, потому что раньше уже работал с Twilio и знал, что всё пройдет гладко», — говорит Ник.

Руководство Ника ниже предельно понятно. И что еще лучше, оно работает без серверов. Так что вам не придется беспокоиться о том, что ваша система оповещений о сбоях выйдет из строя из-за проблем с сервером стороннего провайдера. Мы называем это «серверным сном».

*Читайте оригинальный пост Ника в блоге ThisData*

Звонок посреди ночи, когда ваши серверы «горят», — необходимое зло для многих разработчиков и сетевых администраторов. Если вашим сайтом пользуются по всему миру, он должен быть доступен 24/7. Мне было интересно проверить, насколько легко настроить простую систему оповещений об инцидентах с помощью Twilio, AWS CloudWatch, SNS и Lambda. Подсказка: это очень легко. В этом посте я покажу, как сделать это самостоятельно. Самое главное — решение бессерверное, поэтому его не нужно обслуживать. Вам не нужно беспокоиться, что сервер для реагирования на инциденты сам выйдет из строя!

Конечно, существуют платные инструменты управления инцидентами, такие как PagerDuty, OpsGenie и VictorOps. Cabot и OpenDuty — это альтернативы с открытым исходным кодом, которые вы можете разместить самостоятельно. Они обрабатывают эскалацию инцидентов внутри команды, отправляют уведомления через несколько каналов и многое другое. Но это не так интересно!

Прежде чем начать, вот что вам понадобится:

— аккаунт AWS

— аккаунт Twilio с номером телефона, поддерживающим голосовые вызовы

— 15 минут!

Что вы получите: голосовой звонок и текстовое сообщение, когда ваш сервис недоступен или работает со сбоями.

**Кратко**: создайте топик SNS, создайте Lambda-функцию с помощью кода ниже, которая будет запускаться этим топиком, и отправляйте уведомления в топик SNS с помощью CloudWatch.

Simple Notification Service, или SNS, — это сервис push-сообщений от Amazon. Именно здесь мы создаем «Топик», который описывает, как уведомлять нас.

— Откройте консоль AWS и перейдите в SNS.

— Нажмите «Topics», затем кнопку «Create new Topic».

— Назовите его «Incident_Response» и добавьте описание, например: «Уведомляет CTO через Lambda и SMS».

— Нажмите на только что созданный топик.

— Нажмите кнопку «Create Subscription».

— В выпадающем списке «Protocol» выберите «SMS».

— Введите свой номер телефона, включая код города.

Готово! Теперь у вас есть топик SNS, который при срабатывании отправит вам текстовое сообщение. В сообщении всегда будет указано имя тревоги CloudWatch, что дает контекст и помогает понять, что именно «горит».

*Интересный факт: ваши сообщения могут даже отправляться через Twilio, так как AWS использует их в качестве одного из партнеров по доставке!*

Можно было бы остановиться на SMS, но их недостаточно, чтобы разбудить меня ночью. Мне нужен звонящий телефон.

Давайте перейдем к AWS Lambda, чтобы настроить голосовые вызовы.

— Откройте Lambda в консоли AWS.

Нажмите кнопку «Create a Lambda function».

Выберите шаблон «Blank template».

Настройте триггер SNS, нажав на серый контур и выбрав «SNS» в нижней части выпадающего меню.

Выберите ваш топик Incident_Response.

Отметьте чекбокс «Enable trigger» — это настроит все необходимые разрешения для Lambda и создаст «подписку» в вашем топике SNS.

Нажмите Next.

Назовите функцию notifyCTOWithVoiceCall

Время кодить! Скопируйте и вставьте это в вашу Lambda:

Вам нужно будет обновить переменную toNumber в коде выше и добавить три переменные окружения с вашими учетными данными Twilio. Вы также можете зашифровать эти переменные с помощью помощников шифрования.

В верхней части страницы нажмите кнопку «Save and Test». Вы должны получить голосовой звонок, который поговорит с вами, а затем проиграет песню! Если нет, посмотрите в раздел «Log output». Там должно быть указано успешное выполнение и показан ответ Twilio или сообщения об ошибках. Если всё выглядит нормально, войдите в Twilio и проверьте отладчик.

Теперь у вас есть топик SNS, который отправит вам SMS и запустит Lambda-функцию, которая вам позвонит. Пора использовать это на практике!

Самый простой способ провести сквозное тестирование — создать тревогу, которая точно сработает. Перейдите в AWS CloudWatch.

— Нажмите «Alarms» на боковой панели, затем синюю кнопку «Create Alarm».

— Найдите метрику «CPU» и выберите метрику «CPUUtilization» для одного из ваших инстансов.

— Нажмите «Next».

— Назовите её «TestAlarm».

— Настройте пороговое значение: «whenever CPUUtilization is <= 100 for 1 consecutive period(s)». - Нажмите «Create Alarm». Поскольку загрузка вашего CPU будет ниже 100% (надеюсь!), как только вы нажмете «Create Alarm», вы получите звонок и SMS. Звонок вас разбудит, а текстовое сообщение даст немного контекста, прежде чем вы доберетесь до почты. Легко! Поздравляем! Вы успешно настроили простой инструмент для реагирования на инциденты, который практически бесплатен и не требует поддержки дополнительных серверов. Теперь вы можете создавать новые тревоги или обновлять существующие для тех критических моментов, когда вас нужно разбудить. Чтобы развить эту идею, следующим логичным шагом будет передача больше контекста из CloudWatch в голосовой вызов. Для этого нужно изучить, как CloudWatch передает атрибуты в Lambda, и использовать их в динамически генерируемом TwiML. Вы можете хранить информацию о дежурных в DynamoDB и настроить Lambda так, чтобы она определяла, кому звонить, в зависимости от дня. Вы также можете использовать API Twilio, чтобы убедиться, что на звонок ответили / подтвердили его получение, и эскалировать проблему другому разработчику, если первая линия защиты не отреагирует. Вы можете создать эндпоинт API Gateway, на который другие сервисы (например, внешние мониторы доступности) смогут отправлять POST-запросы для запуска вашей Lambda. Пространство для улучшений огромное, но я надеюсь, что это дало вам представление о том, насколько легко использовать Lambda. Дайте знать, как у вас всё прошло!