Безсерверні технології: проєкти на TypeScript в AWS Lambda, створення Telegram-бота та моніторинг цін на газ Ethereum
У моїй попередній статті ми розглянули основи AWS Lambda та безсерверної архітектури. Обговорили, як працюють функції Lambda та які їхні переваги, а також розглянули деякі базові випадки використання. Тепер підемо далі та зануримося в більш просунуті практичні застосування Lambda. Цього разу розповім, як розгорнути проєкт на TypeScript у Lambda за допомогою GitHub Actions, створити Telegram-бота, який працює на Lambda, та побудувати практичний приклад, який відстежує ціни на газ Ethereum і надсилає оновлення через бота.
Для тих, хто надає перевагу відео, ось посилання на відео.
Telegram-бот для використання в AWS Lambda
Почніть зі створення функції AWS Lambda — так само, як ми робили в попередній статті. Але не вмикайте опцію «Enable function URL», оскільки ми не будемо викликати цю функцію Lambda ззовні. Коли ваша функція буде готова, встановіть час очікування на 30 секунд.
Вставте наступний код у вашу Lambda:
/*global fetch*/ const handler = async (event) => { // Bot's API token const token = 'YOUR_BOT_TOKEN'; // Chat ID or your own Telegram user ID const chatId = 'YOUR_CHAT_ID'; // Message you want to send const message = 'Hello, this is a message from my bot!'; const url = "https://api.telegram.org/bot" + token + "/sendMessage"; const params = { chat_id: chatId, text: message }; let response; try { // Send a request to the Telegram API const res = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(params), }); const data = res.json(); response = { statusCode: 200, body: data, }; } catch (e) { response = { statusCode: 500, body: e.message, }; } return response; }; module.exports = { handler };
У цьому коді вам знадобляться дві ключові інформації:
- YOUR_BOT_TOKEN: це API-токен для вашого Telegram-бота.
- YOUR_CHAT_ID: це або ID чату для групи чи каналу, куди ви хочете надіслати повідомлення, або ваш власний Telegram ID.
Щоб знайти свій ID, ви можете скористатися сторонніми ботами, такими як @getidsbot
. Запустіть бота, і він надішле ваш ID.
P.S. Не забудьте натиснути кнопку Deploy, якщо внесете будь-які зміни.
Створення Telegram-бота
Щоб отримати токен бота, вам потрібно створити бота за допомогою BotFather: — Відкрийте Telegram і знайдіть «BotFather» (офіційний бот для створення нових ботів).
— Розпочніть розмову з BotFather, набравши /start.
— Щоб створити нового бота, наберіть /newbot і дотримуйтесь інструкцій. Вас попросять вказати ім’я та користувацьке ім’я для бота.
— Після створення бота BotFather надасть вам API токен. Зберігайте цей токен у безпеці, оскільки будь-хто може використовувати його для управління ботом.
— Перейдіть до вашого бота і натисніть кнопку «Старт», щоб розпочати розмову.
Тестування бота
Маючи токен та ID користувача, оновіть код Lambda відповідно. Запустіть функцію Lambda, після чого отримаєте повідомлення в Telegram.
Розгортання проєкту на TypeScript в AWS Lambda за допомогою GitHub Actions
Пройдемося по налаштуванню робочого процесу GitHub Actions для розгортання проєкту на TypeScript в AWS Lambda. Нам потрібно буде вказати ім’я функції Lambda та ім’я бакету S3. Ось основний огляд того, як це працює:
- Код будується за допомогою Gulp.
- Aрхівуєм побудований код.
- Архів завантажується в бакет S3.
- Функція Lambda оновлюється, щоб вказати на новий архів S3.
Перехід до S3 та створення бакету: — Відкрийте посилання на AWS S3.
— Створіть бакет (моє ім’я — my-temporary-posts-bot-bucket).
Налаштування репозиторію GitHub:
— Перейдіть до GitHub і створіть новий репозиторій.
— Клонуйте репозиторій на ваш локальний комп’ютер.
— Відкрийте папку проєкту в терміналі і ініціалізуйте пакет npm, запустивши npm init -y.
— Створіть файл src/index.ts і перемістіть наш код з Lambda в цей файл.
— Встановіть необхідні пакети, такі як Gulp, запустивши:
npm install -D gulp gulp-rimraf gulp-sourcemaps gulp-typescript typescript
— Оновіть package.json, додавши скрипт «build»: «gulp build».
{ "name": "my-temporary-posts-bot-bucket", "version": "1.0.0", "description": "", "main": "dist/index.js", "types": "dist/index.d.ts", "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "build": "gulp build" }, "keywords": [], "author": "", "license": "ISC", "devDependencies": { "gulp": "^5.0.0", "gulp-rimraf": "^1.0.0", "gulp-sourcemaps": "^3.0.0", "gulp-typescript": "^6.0.0-alpha.1", "typescript": "^5.5.4" } }
— Створіть файл gulpfile.js.
const { series, src, dest } = require('gulp'); const rimraf = require('gulp-rimraf'); const ts = require('gulp-typescript'); const sourcemaps = require('gulp-sourcemaps'); const source = 'src'; const dist = 'dist'; const paths = { ts: [`${source}/**/*.ts`, `${source}/*.ts`], }; const clean = () => { return src(dist, { allowEmpty: true }).pipe(rimraf({ force: true })); }; const tsc = () => { const project = ts.createProject('tsconfig.json'); return src(paths.ts, { base: `./${source}` }) .pipe(sourcemaps.init()) .pipe(project()) .pipe(sourcemaps.write('.')) .pipe(dest(dist)); }; const copy = () => { return src(['node_modules/**/*'], { base: '.' }).pipe(dest(dist)); }; const buildSuccess = (cb) => { console.log('BUILD FINISHED SUCCESSFULLY'); return cb(); }; exports.build = series(clean, tsc, copy, buildSuccess);
— Створіть файл tsconfig.json.
{ "compilerOptions": { "module": "commonjs", "declaration": true, "noImplicitAny": false, "removeComments": true, "noLib": false, "emitDecoratorMetadata": true, "experimentalDecorators": true, "target": "es2016", "sourceMap": true, "outDir": "./dist", "rootDir": "./src", "skipLibCheck": true, "noUnusedLocals": true, "esModuleInterop": true }, "include": [ "src/index.ts", "src/**/*" ], "exclude": [ "node_modules" ] }
Створення робочого процесу розгортання
— У вашому репозиторії створіть папку з назвою .github/workflows і файл deploy.yml з наступним вмістом:
name: CI&CD Build Production on: push: branches: - main jobs: build: name: CI&CD Build runs-on: ubuntu-latest env: LAMBDA_FUNCTION_NAME: 'MyTemporaryPostsBotLambda' S3_BUCKET: 'my-temporary-posts-bot-bucket' AWS_REGION_DEFAULT: 'us-east-1' steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: 20.12.2 - run: npm ci - run: npm run build - name: Set lambda name run: echo ${{ env.LAMBDA_FUNCTION_NAME }}-`git rev-parse --short HEAD`-`date +%s` > meta.log && cat meta.log - name: Archiving files run: cd dist/ && zip -r "$(cat ../meta.log)".zip * .env - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v1 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID_LAMBDA }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY_LAMBDA }} aws-region: ${{ env.AWS_REGION_DEFAULT }} - name: Copy to S3 run: cd dist/ && aws s3 cp "$(cat ../meta.log)".zip s3://${{ env.S3_BUCKET }}/"$(cat ../meta.log)".zip - name: Update lambda run: aws lambda update-function-code --function-name "${{ env.LAMBDA_FUNCTION_NAME }}" --s3-bucket "${{ env.S3_BUCKET }}" --s3-key "$(cat meta.log)".zip
Тепер нам потрібно надати права нашому робочому процесу GitHub Actions для розгортання нашої функції Lambda в AWS.
— Для цього будемо використовувати AWS Access Key ID та AWS Secret Access Key. Перейдіть до Identity and Access Management (IAM) і створіть нового користувача.
— Встановіть ім’я користувача, я вибираю my-temporary-posts-bot-bucket-user.
— Встановіть права доступу: натисніть Attach policies directly.
— Знайдіть і виберіть AWSLambda_FullAccess та AmazonS3FullAccess.
— Після створення користувача перейдіть до списку користувачів і оберіть його.
— Натисніть на Create access key.
— Виберіть Third-party service та поставте галочку підтвердження. Натисніть Next.
— Нарешті, ми створили наші ключі. Збережіть їх.
Щоб підтримувати безпеку, ці ключі не повинні відслідковуватися Git. Ми повинні зберігати їх у спеціальному, безпечному місці в нашому репозиторії GitHub, наприклад, у зашифрованих секретах. Щоб гарантувати безпечний спосіб їх використання у робочих процесах GitHub Actions.
— Перейдіть до Налаштування -> Секрети та змінні.
— Додайте наші AWS_ACCESS_KEY_ID_LAMBDA та AWS_SECRET_ACCESS_KEY_LAMBDA.
Розгортання функції Lambda
Коли ваш робочий процес розгортання готовий (переконайтеся, що ви ввели правильне ім’я Lambda і ім’я бакету S3), зафіксуйте зміни та відправте їх на GitHub. Перейдіть на вкладку GitHub Actions у вашому репозиторії, щоб відстежити процес розгортання. Переконайтеся, що процес завершився успішно.
Протестуймо
1. Перейдіть до AWS Lambda і перевірте, чи був оновлений код.
2. Протестуйте його на вкладці тестування. Ви повинні отримати повідомлення на вашому боті.
Моніторинг цін на газ Ethereum та надсилання оновлень через Telegram
Тепер створимо практичний приклад, налаштувавши функцію Lambda, яка моніторить ціни на газ Ethereum та надсилає оновлення через ваш Telegram-бот.
Потрібно отримати токен Alchemy для перевірки газу в мережі Ethereum:
— Перейдіть на Alchemy і створіть безкоштовний акаунт.
— Виберіть мережу Ethereum.
— Скопіюйте свій токен і збережіть його.
Налаштування вашого середовища
— Встановіть пакет Web3, запустивши:
npm install web3
— Налаштуйте провайдера Web3 у вашому коді:
import { Web3 } from 'web3'; const web3 = new Web3('
eth-mainnet.g.alchemy.com/...v2/YOUR_ALCHEMY_API_KEY’
// Fetch chain ID and gas price const chainId = await web3.eth.getChainId(); const gasPrice = await web3.eth.getGasPrice(); const gasPriceGwei = web3.utils.fromWei(gasPrice, 'gwei'); // Prepare the message const message = `Chain ID: ${chainId}, Gas Price (Gwei): ${parseFloat(gasPriceGwei).toFixed(2)}`; // Send the message via Telegram // POST CODE TO SEND TELEGRAM MESSAGE HERE
Тестування функції Lambda
— Зробіть коміт та відправте зміни для розгортання Lambda.
— Запустіть вашу функцію Lambda вручну, щоб перевірити, чи отримуєте повідомлення з ціною газу в Telegram.
Автоматизація за допомогою Cron Job
Нарешті, налаштуйте тригер cron в AWS Lambda, щоб визначити, як часто ви хочете отримувати ці оновлення.
— Перейдіть до вашого AWS Lambda і натисніть «Add triggers».
— Виберіть «EventBridge».
— Виберіть «Create a new rule».
— Назвіть його «everyHour» або як вам хочеться.
— У виразі розкладу встановіть cron(0 * * * ? *) і збережіть.
Тепер cron буде запускати нашу функцію AWS Lambda кожну годину, і ви отримуватимете сповіщення через бота. Можна змінювати час або текст сповіщень за вашим бажанням.
Висновок
Не бійтеся експериментувати з тим, що ви дізналися. Що б це не було — вдосконалення функціональності вашого бота, розширення функцій Lambda чи дослідження інших API, можливості безмежні.
Мені цікаво почути ваші враження — не соромтеся поділитися думками та питаннями в коментарях або зв’язатися зі мною в LinkedIn або Telegram.
Звичайно мій YouTube
2 коментарі
Додати коментар Підписатись на коментаріВідписатись від коментарів