[Go, Serverless] Пишем телеграм бота на Go и AWS Lambda
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
Что будем делать?Будем писать простой телеграм бот, отвечающий тем же сообщением, что и отправили.
Почему AWS Lambda ?
- Удобство деплоя, просто пишешь sls deploy, и lambda уже выгружена
- Платишь только за время, когда lambda работает
- Не надо настраивать никаких серверов, и беспокоиться о масштабировании
Что понадобится?
- Установленный go
- Nodejs и npm для установки serverless
- AWS аккаунт для деплоя
TLDR
- Клонируем репозиторий https://github.com/R11baka/echotgbot
- Устанавливаем в .env файле BOT_TOKEN переменную
- Компилируем бинарник env GOOS=linux go build -o bin/webhook main.go
- Выгружаем лямбду с помощью sls deploy
- Устанавливаем webhook с помощью BOT_TOKEN
Регистрация в AWS
- Регистирируем пользователя в AWS aws console и получаем aws_access_key_id, и aws_secret_access_key и прописываем их в .aws/credentials файле
Вот как выглядит мой .aws/credentials
cat ~/.aws/credentials
[default]
aws_access_key_id = ADEFEFEFFEBDXK3
aws_secret_access_key = Zy6ewfir/zGaT1B2/o9JDWDSssdrla
region = us-west-1
Регистрация ботаДля начала, нам надо зарегистировать бота в BotFather. Идем по ссылке, отправляем команду BotFather /newbot, придумываем имя боту, описание. В конце, BotFather вернет нам токен бота.Этот токен понадобится,нам для дальнейшей разработки.Установка ServerlessServerless-это framework, облегчающий настройку, деплой AWS Lambda функций. Написан на node, поэтому для его установки понадобится nodejs и npm. Устанавливаем serverless через npmnpm install -g serverless После установки serverless проверяем, все ли установилось
sls -v
Framework Core: 2.35.0 (standalone)
Plugin: 4.5.3
SDK: 4.2.2
Components: 3.8.2
Теперь можно приступить к конфигурации serverless. Все настройки для serverless лежат в serverless.yml файле,который мы и создадим со следующим контентом
service: echoBot
useDotenv: true
configValidationMode: error # если в конфиге,чтото неправильно ,то ошибка
frameworkVersion: '>=1.28.0 <2.50.0'
provider:
region: "us-west-1"
lambdaHashingVersion: "20201221"
name: aws
runtime: go1.x
logRetentionInDays: 30 # сколько дней хранить логи
endpointType: regional
tracing: # включаем трейсинг для лямбды
apiGateway: true
lambda: true
iam:
role:
statements:
- Effect: "Allow"
Resource: "*"
Action:
- "xray:*"
package:
patterns:
- "bin/webhook" # деплоить только бинарник
functions:
webhook:
handler: bin/webhook
timeout: 15
description: simple echo bot
memorySize: 128 # размер памяти в мегабайтах для функции
environment:
BOT_TOKEN: ${env:BOT_TOKEN}
events:
- http:
path: /webhook
method: ANY
cors: false
Имлементация логики бота на Go
- Устанавливаем библиотеки telebot.v2 и aws-lambda-go
➜ go mod init testBot
go: creating new go.mod: module testBot
➜ go get -u gopkg.in/tucnak/telebot.v2
go: gopkg.in/tucnak/telebot.v2 upgrade => v2.3.5
go: github.com/pkg/errors upgrade => v0.9.1
➜ go get github.com/aws/aws-lambda-go
go: github.com/aws/aws-lambda-go upgrade => v1.23.0
2. Создаем файл main.go с контентом
package main
import (
"encoding/json"
"fmt"
"github.com/aws/aws-lambda-go/events"
"github.com/aws/aws-lambda-go/lambda"
tb "gopkg.in/tucnak/telebot.v2"
"os"
)
func main() {
settings := tb.Settings{
Token: os.Getenv("BOT_TOKEN"),
Synchronous: true,
Verbose: true,
}
tgBot, err := tb.NewBot(settings)
if err != nil {
fmt.Println(err)
panic("can't create bot")
}
tgBot.Handle(tb.OnText, func(m *tb.Message) {
message := m.Text
tgBot.Send(m.Sender, message)
})
lambda.Start(func(req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
var u tb.Update
if err = json.Unmarshal([]byte(req.Body), &u); err == nil {
tgBot.ProcessUpdate(u)
}
return events.APIGatewayProxyResponse{Body: "ok", StatusCode: 200}, nil
})
}
Текущая документация в tucnak/telebot.v2 немного устарела, и если просто написать return вместо return events.APIGatewayProxyResponse{Body: "ok", StatusCode: 200}, nil, то телеграм будет повторно отправлять сообщения к боту.Deploy бота
- Создаем файл .env и вставляем API_TOKEN полученный от BotFather
echo API_TOKEN={API_TOKEN_FROM_BOTFATHER} > .env
- Проверяем serverlss конфиг с помощью команды. Не должно быть никаких ошибок.
sls print
- Потом собираем бинарник
env GOOS=linux go build -o bin/webhook main.go
- И выгружаем его с помощью serverless
serverless deploy -v
При успешной выгрузке, мы получим в конце
Service Information
service: echoBot
stage: dev
region: us-west-1
stack: echoBot-dev
resources: 11
api keys:
None
endpoints:
ANY - https://y7p31bwnu1.execute-api.us-west-1.amazonaws.com/dev/webhook
functions:
webhook: echoBot-dev-webhook
layers:
None
https://y7p31bwnu1.execute-api.us-west-1.amazonaws.com/dev/webhook => этот эндпоинт и token бота нужен нам, чтобы установить webhook
Интеграция с telegramОсталось сообщить телеграму, какой эндпоинт дергать при получении сообщения. Делается это командой setWebhook
curl https://api.telegram.org/bot{YOUR_TOKEN}/setWebhook?url={YOUR_DEPLOYED_AWS_URL}
Проверка что webhook установлен, происходит с помощью getWebhookInfo
➜ ~ curl https://api.telegram.org/bot1324913549:AAE1zYMH6K3hF2TOgUQoIP-E1g4rMIamck/setWebhook\?url\= https://y7p31bwnu1.execute-api.us-west-1.amazonaws.com/dev/webhook
{"ok":true,"result":true,"description":"Webhook was set"}
➜ ~ curl https://api.telegram.org/bot1324913549:AAE1zYMH6K3hF2TOgUQoIP-E1g4rMIamck/getWebhookInfo
{"ok":true,"result":{"url":"https://y7p31bwnu1.execute-api.us-west-1.amazonaws.com/dev/webhook","has_custom_certificate":false,"pending_update_count":0,"max_connections":40,"ip_address":"184.169.148.254"}}
ОшибкиЕсли что-то пошло не так,идем в CloudWatch и смотрим логи,или же из консоли также можно посмотреть логи
sls logs -f webhook
===========
Источник:
habr.com
===========
Похожие новости:
- [Космонавтика, Транспорт] Crew Dragon с астронавтами вернулся на Землю с МКС
- [JavaScript, Google Chrome, WebAssembly] Что вошло в релиз движка V8 версии 9.0 (перевод)
- [Node.JS, Serverless] Запускаем приложение на Express.js в Yandex Cloud Functions
- [Flutter] Решение задач позиционирования при просмотре карты во Flutter
- [Разработка под Android] Google Play сократит названия приложений с 50 до 30 символов
- [Разработка мобильных приложений, Разработка под Android] Как мы интегрировали Huawei Mobile Services в два этапа
- [MongoDB] Эффективное моделирование данных и проектирование схем в Hackolade и MongoDB (перевод)
- [Автомобильные гаджеты] Что же происходит сейчас с Tesla в Китае?
- [JavaScript, Google Chrome, API, Google API] Content Indexing API: страницы, доступные в offline. Доклад с RamblerFront #9
- [Законодательство в IT, IT-компании] Патентный тролль: Как отсудить 308 млн долларов у Apple (перевод)
Теги для поиска: #_go, #_serverless, #_golang, #_serverless, #_go, #_serverless
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 20:17
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
Что будем делать?Будем писать простой телеграм бот, отвечающий тем же сообщением, что и отправили. Почему AWS Lambda ?
cat ~/.aws/credentials
[default] aws_access_key_id = ADEFEFEFFEBDXK3 aws_secret_access_key = Zy6ewfir/zGaT1B2/o9JDWDSssdrla region = us-west-1 sls -v
Framework Core: 2.35.0 (standalone) Plugin: 4.5.3 SDK: 4.2.2 Components: 3.8.2 service: echoBot
useDotenv: true configValidationMode: error # если в конфиге,чтото неправильно ,то ошибка frameworkVersion: '>=1.28.0 <2.50.0' provider: region: "us-west-1" lambdaHashingVersion: "20201221" name: aws runtime: go1.x logRetentionInDays: 30 # сколько дней хранить логи endpointType: regional tracing: # включаем трейсинг для лямбды apiGateway: true lambda: true iam: role: statements: - Effect: "Allow" Resource: "*" Action: - "xray:*" package: patterns: - "bin/webhook" # деплоить только бинарник functions: webhook: handler: bin/webhook timeout: 15 description: simple echo bot memorySize: 128 # размер памяти в мегабайтах для функции environment: BOT_TOKEN: ${env:BOT_TOKEN} events: - http: path: /webhook method: ANY cors: false
package main
import ( "encoding/json" "fmt" "github.com/aws/aws-lambda-go/events" "github.com/aws/aws-lambda-go/lambda" tb "gopkg.in/tucnak/telebot.v2" "os" ) func main() { settings := tb.Settings{ Token: os.Getenv("BOT_TOKEN"), Synchronous: true, Verbose: true, } tgBot, err := tb.NewBot(settings) if err != nil { fmt.Println(err) panic("can't create bot") } tgBot.Handle(tb.OnText, func(m *tb.Message) { message := m.Text tgBot.Send(m.Sender, message) }) lambda.Start(func(req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { var u tb.Update if err = json.Unmarshal([]byte(req.Body), &u); err == nil { tgBot.ProcessUpdate(u) } return events.APIGatewayProxyResponse{Body: "ok", StatusCode: 200}, nil }) }
curl https://api.telegram.org/bot{YOUR_TOKEN}/setWebhook?url={YOUR_DEPLOYED_AWS_URL}
➜ ~ curl https://api.telegram.org/bot1324913549:AAE1zYMH6K3hF2TOgUQoIP-E1g4rMIamck/setWebhook\?url\= https://y7p31bwnu1.execute-api.us-west-1.amazonaws.com/dev/webhook
{"ok":true,"result":true,"description":"Webhook was set"} ➜ ~ curl https://api.telegram.org/bot1324913549:AAE1zYMH6K3hF2TOgUQoIP-E1g4rMIamck/getWebhookInfo {"ok":true,"result":{"url":"https://y7p31bwnu1.execute-api.us-west-1.amazonaws.com/dev/webhook","has_custom_certificate":false,"pending_update_count":0,"max_connections":40,"ip_address":"184.169.148.254"}} sls logs -f webhook
=========== Источник: habr.com =========== Похожие новости:
|
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 20:17
Часовой пояс: UTC + 5