Создаем Telegram-бота в AWS Lambda

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

CloudFlare Workers - не удалось

Вообще этот пост должен был быть про работу с Cloudflare Workers, но там возникли небольшие проблемы. Я пытался завести там телеграм-бота и долго недоумевал почему же он никак не хочет отвечать.
Разгадка оказалась неожиданной - Telegram не захотел дружить с SSL-сертификатом который отдает CloudFlare.

  1. Создал воркер и написал простенький JS-код чтобы бот просто отвечал мне ‘Hello!’
  2. Создал бота в BotFather
  3. Сделал запрос setWebHook к API Telegram чтобы привязать адрес воркера к боту
1
curl -F "url=https://hello_bot.xxxkek.workers.dev/" https://api.telegram.org/bot963534439:AAGcDjk8tWFceexFlyTyS-OOiQJKaiU-qKw/setWebhook
  1. Попробовал написать боту - бот не ответил
  2. Танцевал с бубном вокруг пытаясь понять что не так
  3. Сделал запрос 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 для этого блога.

Telegram Client

А теперь расскажу что и как:

Создаем функцию в AWS Lambda

Вписываем название функции.

AWS Lambda

Затем добавляем триггер по которому должна запускаться функция.

AWS Lambda
AWS Lambda

Security выставим в Open.

AWS Lambda

Кликаем на значок лямбды.

AWS Lambda

Вставляем код и кликаем на Deploy.

AWS Lambda

Код

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
exports.handler = async (event) => {
let body = JSON.parse(event.body);
let text = body.message.text.trim();

let answer = {
"method":"sendMessage",
"chat_id": body.message.chat.id,
"reply_to_message_id" : body.message.message_id,
"parse_mode": "html",
"text": '<a href="https://t.me/iv?url=' + text + '&rhash=55555ccc0e7e41">[IV]</a> ' + text,
};

const response = {
statusCode: 200,
body: JSON.stringify(answer),
headers: {
'Content-Type': 'application/json'
},
};
return response;
};

Кликаем на API Gateway и находим ссылку на триггер.

AWS Lambda

Создаем бота в Telegram

Идем к @BotFather, создаем нового бота и получаем токен.

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)

Очень удобно один раз настроить все и доверить обслуживание специализированным сервисам.