Создаем Telegram-бота в AWS Lambda
Привет! Сегодня я расскажу о том как впервые применил AWS Lambda для чего-то полезного. Про облачные функции я задумывался давно, но никак не мог придумать им применение
так как задачи в том чтобы периодически запускать какую-то небольшую функцию у меня не возникало. А вот в качестве решения для ботов к различным мессенджерам этот инструмент подходит хорошо.
CloudFlare Workers - не удалось
Вообще этот пост должен был быть про работу с Cloudflare Workers, но там возникли небольшие проблемы. Я пытался завести там телеграм-бота и долго недоумевал почему же он никак не хочет отвечать.
Разгадка оказалась неожиданной - Telegram не захотел дружить с SSL-сертификатом который отдает CloudFlare.
- Создал воркер и написал простенький JS-код чтобы бот просто отвечал мне ‘Hello!’
- Создал бота в BotFather
- Сделал запрос setWebHook к API Telegram чтобы привязать адрес воркера к боту
1 | curl -F "url=https://hello_bot.xxxkek.workers.dev/" https://api.telegram.org/bot963534439:AAGcDjk8tWFceexFlyTyS-OOiQJKaiU-qKw/setWebhook |
- Попробовал написать боту - бот не ответил
- Танцевал с бубном вокруг пытаясь понять что не так
- Сделал запрос getWebhookInfo к API Telegram
1 | curl https://api.telegram.org/bot1354631759:AAGRrBqd8xe5G1bctFgTNzWD7lBxr-bzMB4/getWebhookInfo |
И увидел там сообщение об ошибке
1 | SSL error {error:1416F086:SSL routines:tls_process_server_certificate:certificate verify failed} CloudFlare... |
Тут я решил временно отложить этот сервис и пойти в AWS Lambda
AWS Lambda - заработало
Тут все заработало сразу и я решил сделать простенького бота который будет генерировать мне ссылку на Telegram Instant View для этого блога.
А теперь расскажу что и как:
Создаем функцию в AWS Lambda
Вписываем название функции.
Затем добавляем триггер по которому должна запускаться функция.
Security выставим в Open.
Кликаем на значок лямбды.
Вставляем код и кликаем на Deploy.
Код
1 | exports.handler = async (event) => { |
Кликаем на API Gateway и находим ссылку на триггер.
Создаем бота в Telegram
Идем к @BotFather, создаем нового бота и получаем токен.
Затем делаем запрос к Telegram Bot API для привязки URL для вебхука. Сделать это можно и из браузера, но мне удобнее при помощи curl.
Подставляем в запрос ссылку на триггер и токен который выдал нам BotFather.
1 | curl -F "url=https://2vvvvvvvz4.execute-api.eu-central-1.amazonaws.com/HelloBot" https://api.telegram.org/bot999999999:AAGcDDDDDDDDDDDDDDDDDDDDDDDDDiU-qKw/setWebhook |
Проверяем статус вебхука.
1 | curl https://api.telegram.org/bot999999999:AAGcDDDDDDDDDDDDDDDDDDDDDDDDDiU-qKw/getWebhookInfo |
Все работает
Бот отвечает довольно быстро. Бесплатные лимиты - миллион запросов к AWS Lambda. Для простеньких ботов этого более чем достаточно)
Также в AWS можно прикутить кучу разных триггеров и дергать другие AWS-сервисы. При должной фантазии можно конструировать очень интересных ботов.
А может шаред хостинг?
В этот момент приходит мысль о том что для создания бота в Telegram достаточно практически любого шаред-хостинга. Просто вместо облачной функции будет скрипт на php.
Это будет работать также быстро, стоить будет очень дешево и будут отсутствовать лимиты на кол-во запросов. Бонусом можно работать с файлами и БД по-старинке.
Но это все звучит как-то несовременно. Мы же тут про serverless)
Очень удобно один раз настроить все и доверить обслуживание специализированным сервисам.