Создаем собственный сервис по доступности трекера с уведомлением в телеграм или AWS Serverless – стильно, дешево, надежно

Привет всем. 

Наверняка, арбитражники, кто хоть немного интересуется технической стороной хождения трафика по проводам, слышали про Amazon Web Services, или сокращенно AWS. Некоторые, возможно даже поднимали там бесплатный сервер, который AWS предлагает в рамках free tier (бесплатного периода) в течение первого года со дня регистрации аккаунта. Да, сервер слабенький, но для впн и тестов новых интернет-проектов вполне подходит. Я туда даже трекер пробовал ставить, работает ¯\_()_/¯.

Однако, бесплатное пользование отнюдь не ограничивается одним лишь сервером, AWS предлагает множество самых разнообразных сервисов для всех, кто связан с интернет-технологиями. 
В рамках данной статьи мы соберем свой сервис по проверке доступности сайтов в интернете, изучим несколько сервисов AWS, и сделаем первоначальную настройку аккаунта для безопасной дальнейшей работы. 

Если вы хотите на практике “потыкать” AWS и самостоятельно повторить действия, описанные в статье, то вначале предлагаю сходить приготовить себе чашечку чая и отключить отвлекающие мессенджеры.

Готовы приступить? Поехали! 

Итак, как же будет работать наш супер сервис? 

Логика простая – каждые пять минут мы будем вызывать страницу нашего сайта (например, страницу админки нашего трекера Binom), если ответ положительный (код 200) – все хорошо, если страница не найдена (код 404), получили ошибку сервера (код 502) или любой другой не подходящий нам код – будем слать уведомление в телеграм. 

И самое важное. Работа нашего сервиса не будет стоить нам ни цента. Нам не нужно будет поднимать сервер, наш скрипт будет запускаться где-то в облаке AWS и будет абсолютно serverless. 

Начнем по порядку, вначале немного теории, и затем перейдем к практике. 

Итак, что же такое serverless? AWS описывает это понятие как бессерверную технологию, которая позволяет вам создавать ваш интернет проект не заботясь о серверах, их администрировании и безопасности. Подробности можете прочитать по ссылке https://aws.amazon.com/ru/serverless/

Рассмотрим пример на нашем варианте: мы продумываем логику нашего приложения – проверять заданную страницу сайта, если ответ положительный, то наш скрипт завершается, а если получена ошибка – шлет сообщение в телеграм, смс, емейл или возможно даже останавливает все рекламные кампании, чтобы наш бюджет не тратился в пустую если мы вне доступа. 

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

Далее вы (или знакомый программист) пишете код, который превращает наш алгоритм в функции (у AWS они называются лямбда-функции) языка программирования. В нашем случае таким языком будет Python. 

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

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

Оплата сервиса начисляется за количество запусков наших функций, и фактическое время их выполнения. 

Но, как я уже писал выше, у AWS имеется так называемый free tier https://aws.amazon.com/ru/free/ – более 60 продуктов и сервисов предоставляется с определенным бесплатным уровнем доступа. Это сделано для того, чтобы пользователи могли детальнее ознакомиться с платформой AWS, ее продуктами и сервисами, не переживая, что они получат счет в конце месяца. 

Одним из таких сервисов является AWS Lambda – бессерверные функции от AWS. Уровень бесплатного пользования данного сервиса включает 1 миллион запросов и 400 тысяч Гб-секунд вычислений в месяц. И не только в первый год, а на постоянной основе! Даже если мы будем проверять десять разных сайтов раз в минуту, нам этого хватит с огромным запасом. 

Детали описаны по ссылке https://aws.amazon.com/ru/lambda/ 

Но давайте проверим. Отдельно посчитаем количество запусков, и количество Гб-секунд. 

Регулярный запуск функции 1 раз в минуту это 60 раз в час, 1440 раз в сутки, 43 200 раз в 30 дней. Из миллиона. Даже если мы будем проверять 10 разных сайтов, каждый в отдельной функции, нам этого хватит с более чем двукратным запасом. 

Теперь считаем Гб-секунды.

Цена продолжительности напрямую зависит от объема оперативной памяти, выделенной для функции в диапазоне от 128Мб до 3Гб с шагом 64Мб. Поскольку у нас задача стоит крайне простая – сделать запрос к веб-странице в интернете, и возможно сделать еще один запрос к серверу телеграм, нам вполне хватит минимальных 128Мб. И по времени это займет меньше секунды. Но для ровного счета – допустим что это занимает ровно секунду. 

Мы уже посчитали, что за месяц на одну функцию понадобится 43 200 запусков функции. Каждый раз по секунде – это 43 200 секунд. 

128Мб – это 0.125 от Гб, соответственно, чтобы получить Гб-секунды нам надо умножить 43200 на 0.125. Получается 5 400 Гб-секунд. Из 400 бесплатных тысяч. Впечатляет, да? 

С начальной теорией закончили, пора переходить к практике. 

Для начала работы нам понадобится бесплатный аккаунт в AWS.

Зарегистрировать его вы можете по адресу https://aws.amazon.com/ru/ 

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

Единственный момент, которых хотел бы отметить – обязательно поставьте длинный, сложный пароль, запишите его в надежном месте и никому не показывайте.

И так, зарегистрировали и подтвердили аккаунт. Что дальше? 

Дальше немного коснемся безопасности главного аккаунта.

У AWS множество разных сервисов, у каждого сервиса свои возможности, к каждому могут иметь доступ различные пользователи аккаунта, и каждому пользователю нужны свои права. 

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

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

Вам это надо? Думаю что нет. Для этого AWS создали продвинутую систему распределения прав пользователей и принято что пользователям надо давать минимальные права, которые им нужны для работы.

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

Поэтому, в списке лучших решений (у AWS они называются best practices) принято создавать индивидуальные аккаунты для разных людей, и каждому давать минимально необходимые права. Даже если вы работаете в своем аккаунте в одиночку – сделайте себе новый аккаунт пользователя с правами администратора. У вас также останется доступ к любому сервису AWS, но при этом, в случае если ваш логин с паролем попадут к злоумышленнику, и он начнет делать в аккаунте что-то плохое (иначе он бы не был злоумышленником, ваш кэп(с)), например, запускать сервера для майнинга крипты, у вас будет возможность зайти в аккаунт из-под главного аккаунта, и принять меры.

Если же вы будете постоянно сидеть под главным аккаунтом, и ваши доступы утекут – восстановить доступ будет гораздо сложнее и гораздо дольше по времени. Не надо так делать.

Поэтому, первым делом мы идем по ссылке 

https://console.aws.amazon.com/iam/home?region=us-east-1#/users, нажимаем кнопку Add User,

Вводим любое имя, и ставим чекбокс AWS Management Console access. 

Пароль можете задать сами или вам его придумает AWS. 

Нижний чекбокс Require password reset убираем чтобы не тратить время на пересоздание пароля при следующем логине. Жмем Next:Permissions 

На следующей странице выбираем Attach existing policies directly, ставим чекбокс AdministratorAccess и жмем Next:Tags. 

Пропускаем страницу с тегами, жмем Next:Review и на следующей странице – Create User. Пользователь создан.

Обязательно скопируйте и сохраните ссылку, которую AWS выдал вам для логина. Все созданные пользователи вашего аккаунта должны логиниться только по ней. 

Следующим шагом добавим еще один уровень безопасности главного аккаунта – двухфакторную аутентификацию. В этом случае, даже если ваш пароль главного аккаунта попадет к злоумышленникам, им понадобится дополнительно ввести одноразовый код, который меняется каждые 30 секунд.

Для этого рекомендую установить любую из двух программ на мобильный телефон – Google Authenticator (https://te-st.ru/entries/google-authenticator/) и Authy (https://authy.com/). 

Подключить их просто. – устанавливаете приложение на телефон, переходите по ссылке: https://console.aws.amazon.com/iam/home?region=us-east-1#/security_credentials

Нажимаете Activate MFA, выбираете Virtual MFA device, затем Show QR code, сканируете qr код через приложение, и вводите два кода подряд из приложения. 

Вот так коды выглядят в приложении Authy:

Все, поздравляю, ваш главный аккаунт надежно защищен. 

Последний подготовительный этап при настройке аккаунта – настроить предупреждение о превышении заданного уровня затрат на аккаунте. Этап совсем не обязательный, т.к., как я уже писал выше, наш сервис не будет стоить нам ничего, но в дальнейшем, если вы продолжите работать с AWS, и по каким-то причинам превысите ожидаемый уровень затрат, система отправит вам емейл, который предупредит о превышении ожидаемого бюджета. 

Таким образом, это защитит нас от случайных непредвиденных трат, а значит это важно, не пренебрегайте этой настройкой.

В дальнейшем можно настроить, чтобы вместо е-мейла приходило сообщение в телеграм. 

Итак, переходим в настройки аккаунта по ссылке https://console.aws.amazon.com/billing/home?region=us-east-1#/preferences 

Отмечаем чекбокс Receive Billing Alerts и нажимаем сохранить.

Тут же нажимаем на ссылку Manage Billing Alerts или переходим по ссылке: https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#

Видим примерно такую картину:

Нам нужно создать предупреждение о превышении затрат, поэтому переходим в подраздел Billing в левом меню. 

Здесь мы видим что у нас не создано ни одного “аларма”, и что AWS предлагает нам 10 алармов бесплатно и 1000 бесплатных е-мейл уведомлений в месяц. 

Нажимаем кнопку Create alarm. 

На открывшейся странице ничего не меняем кроме установки значения в условиях метрики. Я установлю там 1 доллар, и соответственно, когда затраты аккаунта превысят этот доллар – я получу емейл.

Жмем Next. 


В блоке Notification – Select an SNS topic выбираем Create new topic, в открывшемся поле вводим название темы уведомления, например Alarm_1dollar, (без пробелов, только буквы, цифры, дефис и нижнее подчеркивание) и ниже в Email endpoints – свой емейл для уведомлений. Далее нажимаем Create topic и жмем Next. 

Система попросит нас ввести название самого аларма, не путайте с названием темы уведомления выше. Вводим Alarm 1$. Жмем Next. Нам откроется превью нашего созданного аларма, кратко все просматриваем и жмем внизу кнопку Create alarm.

Аларм создан и ожидает подтверждения нашего е-мейл:

Переходим в свой электронный ящик и видим там письмо от AWS. Если не видим, то смотрим спам или проверяем через некоторое время. 

Открываем его, читаем, и жмем по ссылке Confirm subscription. 

После этого открывается страница, сообщающая что наша подписка на аларм активирована.

Готово! Теперь, как только затраты на вашем аккаунте превысят 1 доллар, AWS пришлет вам письмо и вы сможете оперативно принять меры и недопустить дальнейшие затраты, если конечно они для вас неожиданны. 

Подготовку аккаунта закончили, переходим к разработке самого сервиса. 

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

Залогинившись, переходим по ссылке в сервис, который называется AWS Lambda.  

По ссылке. https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions

И сразу жмем кнопку Create function.

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

Выбираем Author from scratch.

Задаем название функции, пусть будет Check-server-online, среду программирования выбираем Python 3.7.

Жмем Create function. 

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

Ниже идет поле, для редактирования самой функции и разные сопутствующие настройки к ней. 

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

Сюда мы запишем наш Апи-ключ от бота телеграм. В случае, если по какой-то причине в дальнейшем ключ изменится, его легко можно будет изменить, не влезая в сам код. 

Далее идут настройки функции. 

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

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

Справа идет блок базовых настроек. Здесь все просто – можно выставить размер оперативной памяти для функции и максимальное время ее работы, после которой сервер с функцией будет выключен независимо от успешности выполнения.. На некоторых сайтах, особенно с включенным https соединение первый раз может занимать довольно продолжительное время, и трех секунд таймаута может не хватить. 

Давайте поменяем время таймаута с трех до пяти секунд. Нажимаем Edit. 

В открывшемся окне ставим 5 секунд и жмем Save. 

Остальные настройки можно даже не рассматривать, они нам точно не понадобятся. 

Далее нам надо загрузить код нашей функции. Для вас я подготовил его по ссылке 

https://drive.google.com/open?id=1ITLYEezMHVn2Kb7_MK2kbNif-XK8VEhs, вы можете скачать его в архиве. В таком виде его и надо загрузить. 

Выбираем загрузку из zip файла, нажимаем на Upload и загружаем наш скачанный архив: 

Должно получиться как-то так:

И в правом верхнем углу нажимаем кнопку Save. Страница перезагрузится и наша функция будет загружена и сохранена. 

Следующий этап – получение Апи ключа от телеграм. Сделать его очень просто. 

Бот в Telegram создается при помощи системного бота под названием @BotFather. Находим его в поиске телеграм, отправляем ему команду /newbot, выбираем имя, которое будет отображаться в списке контактов, и адрес. Например, «Бот мониторинг» с адресом «monitor600_bot». 

Если адрес не занят, а имя введено правильно, BotFather пришлет в ответ сообщение с токеном — «ключом» для доступа к созданному боту. Его нужно сохранить и никому не показывать. 

Ключ получили, надо добавить его к нашему коду. 

Добавляем строку TELEGRAM_BOT_ACCESS_TOKEN в название ключа, а в значение сам апи-ключ. 

Сохраняем, нажав на кнопку Save. Функция готова! Осталось ее протестировать и настроить запуск по расписанию. 

Нажимаем Test (рядом с кнопкой Save). 

Появляется окно, в котором мы должны задать параметры для функции. Мы будем передавать два значения: ссылку на страницу для проверки и айди чата в телеграм. Сделано это для того, чтобы вы могли проверять несколько страниц, и каждая страница будет отправлять уведомление своему юзеру. Мультиюзер сервис, все серьезно) 

Айди чата в телеграм можно узнать разными способами, например, написав боту @get_id_bot, в ответ он пришлет ваш цифровой айди аккаунта. 

Отправлять данные будем в формате Json. 

Вставляем в поле данных код с адресом нужной страницы и айди нашего аккаунта. В качестве проверяемой страницы будем использовать страницу демо-доступа трекера Бином. 

{

  “site”: “https://demo.binom.org/?page=Campaigns”,

  “chat_id”: “393262152”

}

Название теста можно вписать любое, из латинских букв и цифр, без пробелов. 

Должно получиться как-то так: 

Жмем кнопку Create внизу, создаем тест. 

Создали, нажимаем кнопку Test справа вверху и… наша функция успешно выполнилась! Конечно, если все правильно сделали.

В отчете можно увидеть сколько времени она выполнялась (1207 мс), сколько времени AWS с нас списал (1300мс, т.к. он округляет кратно 100 мс), сколько памяти мы затратили на выполнение (66 Мб) и сколько нам было выделено. И ниже логи, которые выдает наша функция. Очень полезно для отладки работы функции. 

Итак, наша функция создана, протестирована и готова к работе. Осталось настроить триггер, который будет ее регулярно запускать. 

Для этого в поле Designer нажимаем кнопку Add trigger: 

В появившемся выпадающем списке выбираем CloudWatch Events и ниже – Create a new rule. 

Появляются новые поля. В поле имени задаем название, например Check-server-online-5min 

Rule type оставляем Schedule Expression, в само поле значения вставляем: 

cron(0/5 * * * ? *) 

Кто немного знаком с линукс наверное в курсе, что cron – это служба запуска регулярных задач. 

В нашем случае cron(0/5 * * * ? *) означает, что событие, т.е. наша функция будет вызываться каждые 5 мину независимо от времени суток и дня недели. 

Должно получиться как-то так: 

Убеждаемся что внизу страницы стоит чекбокс Enable trigger и нажимаем кнопку Add: 

Триггер создан, поле Designer изменилось 

Но осталась еще одна вещь. Добавить к этому триггеру данные о странице и телеграм чат айди, которые мы передавали при тестировании. По умолчанию добавляется только сам триггер, без дополнительных данных. Давайте их добавим. 

Для этого переходим по ссылке https://console.aws.amazon.com/cloudwatch/home?region=us-east-1#rules: 

И обнаруживаем там наше правило запуска (триггер): 

Кликаем на название и попадаем на страницу с детальной информацией. 

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

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

Но в данный момент нам надо добавить параметры функции. В правом верхнем углу выбираем Actions -> Edit. 

Получаем окно редактирования. Здесь мы можем изменить график запуска, и сконфигурировать входные параметры. 

Нажимаем на Configure input в правом блоке: 

В раскрывшемся списке выбираем Constant (JSON text) и вставляем в появившееся поле строку с параметрами, которую мы вставляли при тестировании. Нажимаем Configure details: 

В следующем окне подтверждаем конфигурацию нажатием кнопки Update rule. 

Готово! Наша функция превращается в сервис, который будет мониторить доступность практически любой страницы в интернете. 

Помимо трекера и своих сайтов этот способ также позволяет проверять страницы google store. 

Немного доработки кода и это может стать отличным подспорьем для тех, кто льет серые тематики через свои приложения. 

Как еще serverless функции могут помочь арбитражнику? 

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

Постепенно я все что мог перенес на serverless функции. 

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

Также одна из функций заводит мне в трекер офферы. Алгоритм простой – я пересылаю боту сообщение от менеджера партнерской сети, телеграм отправляет его в функцию на AWS, а там уже делается парсинг всех айди офферов, и по каждому офферу функция лезет в партнерку, забирает ссылку и другие нужные данные, обрабатывает их, заводит в трекер и присылает обратно отчет в телеграм. Вся рутина сведена к минимуму. Удобно, эффективно, бесплатно) Минимум усилий, максимум результата. 

Как можно увидеть, автоматизировать в арбитраже можно довольно много рутинных вещей. Я даже не говорю сейчас про автоматическое заведение кампаний в источниках трафика, с подгрузкой креативов конкурентов из спай-сервисов, и оптимизацию потоков по десяткам критериев, чтобы кампании сами выходили в плюс. И все это реально, хоть и потребует дополнительного времени и получения новых навыков. Если не хотите отстать от более технологичных конкурентов – так или иначе вам придется в этом разбираться. Изучайте, тестируйте, развивайтесь. 

А если у вас остались вопросы по данной статье – пишите мне в телеграм @sspdsp 

Успехов!

Автор: Максим. 4 место в конкурсе статей.

Комменты