Serverless на TypeScript: ваш бэкенд без серверов (и головной боли)
Привет, коллега! Если ты когда-нибудь настраивал VPS, боролся с nginx, мониторил нагрузку на CPU и перезапускал упавший PostgreSQL в три часа ночи — эта статья для тебя. Мир движется к serverless (бессерверным вычислениям), и TypeScript — идеальный язык, чтобы впрыгнуть в этот поезд на полном ходу.
Давай разберемся, что такое serverless функции, как их писать на TypeScript, и какие платформы (AWS Lambda, Google Cloud Functions, Yandex Cloud Functions) выбрать для своего проекта. Спойлер: код будет, примеры будут, а серверов — не будет.
Что такое Serverless? (Спойлер: серверы всё же есть)
Название «serverless» — маркетинговый трюк. Серверы, конечно, существуют, но ты про них ничего не знаешь и не хочешь знать. Ты просто пишешь функцию (обычно на TypeScript), загружаешь её в облако, и она выполняется по запросу. Платишь только за время выполнения — ни за простаивающий сервер, ни за масштабирование.
Это называется FaaS (Function as a Service). Основные плюсы:
- Масштабирование автоматическое — от 0 до 10 000 запросов в секунду за пару секунд.
- Экономия — платите за миллисекунды выполнения, а не за аренду машины.
- Меньше DevOps — облако само обновляет среду выполнения, патчит уязвимости.
- TypeScript из коробки — все крупные провайдеры поддерживают Node.js, а значит и TypeScript.
Но есть и минусы: холодный старт (первые миллисекунды загрузки), ограничение времени выполнения (обычно 15 минут), сложности с отладкой.
Пишем первую Serverless функцию на TypeScript для AWS Lambda
AWS Lambda — король serverless. Начнём с него. Установите aws-sdk и @types/aws-lambda для TypeScript.
npm init -y
npm install typescript @types/node aws-lambda --save-dev
npx tsc --init
Создайте файл handler.ts:
import { APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';
export const handler = async (event: APIGatewayProxyEvent): Promise<APIGatewayProxyResult> => {
const name = event.queryStringParameters?.name || 'Гость';
return {
statusCode: 200,
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
message: `Привет, ${name}! Это serverless функция на TypeScript.`,
timestamp: new Date().toISOString(),
}),
};
};
Соберите проект:
npx tsc
zip -r function.zip .
Загрузите архив в AWS Lambda через консоль, укажите runtime Node.js 20.x, а точкой входа — handler.handler.
Готово! Теперь у вас есть HTTP API, который не требует сервера. Можно повесить на API Gateway и использовать.
Google Cloud Functions: TypeScript-альтернатива от Google
Если вы предпочитаете экосистему Google (Firebase, BigQuery, GCP), то Google Cloud Functions — ваш выбор. Синтаксис похож на AWS, но есть нюансы.
Установите инструмент:
npm install -g @google-cloud/functions-framework
Создайте index.ts:
import { Request, Response } from 'express';
export const helloWorld = (req: Request, res: Response) => {
const name = req.query.name || 'Мир';
res.json({
message: `Привет, ${name}! Это Google Cloud Functions на TypeScript.`,
timestamp: new Date().toISOString(),
});
};
Для локального тестирования:
npx @google-cloud/functions-framework --target=helloWorld
Развёртывание одной командой:
gcloud functions deploy hello-world \
--runtime nodejs20 \
--trigger-http \
--allow-unauthenticated \
--entry-point helloWorld
Google Functions отлично интегрируются с Firebase Authentication и Firestore. Если ваш проект уже на Firebase — это лучший выбор.
Yandex Cloud Functions: локальный игрок с хорошими условиями
Для российских разработчиков Yandex Cloud Functions — отличная альтернатива. Цены ниже, чем у AWS, и нет проблем с блокировками.
Пример функции на TypeScript:
import { Handler } from '@yandex-cloud/function-types';
export const handler: Handler.Http = async (event, context) => {
const name = event.queryStringParameters?.name || 'Пользователь';
return {
statusCode: 200,
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
message: `Привет, ${name}! Это Yandex Cloud Functions.`,
timestamp: new Date().toISOString(),
}),
};
};
Установите @yandex-cloud/function-types для типизации:
npm install --save-dev @yandex-cloud/function-types
Загрузить функцию можно через CLI или веб-консоль. Yandex Cloud даёт 1 миллион запросов в месяц бесплатно — отличный старт для pet-проектов.
Сравнение провайдеров: AWS vs Google vs Yandex
Чтобы вы могли выбрать, таблица сравнения:
- Холодный старт: AWS — ~200ms, Google — ~300ms, Yandex — ~150ms (лучший показатель).
- Бесплатный лимит: AWS — 1 млн запросов/мес, Google — 2 млн, Yandex — 1 млн.
- Макс. время выполнения: AWS — 15 мин, Google — 9 мин, Yandex — 10 мин.
- Поддержка TypeScript: Все три — «из коробки» через Node.js.
- Экосистема: AWS — огромная, Google — Firebase, Yandex — объектное хранилище и очереди.
Для стартапов и личных проектов рекомендую Yandex Cloud Functions — дешево и быстро. Для enterprise — AWS Lambda с множеством интеграций.
Продвинутые техники: слои, переменные окружения и мониторинг
Serverless функции — это не просто «Hello World». Вот что пригодится в реальных проектах:
1. Переменные окружения
Храните API-ключи и строки подключения к БД в переменных окружения. В AWS Lambda это настраивается в консоли, в коде читается через process.env:
const dbUrl = process.env.DATABASE_URL;
if (!dbUrl) throw new Error('DATABASE_URL не задан');
2. Lambda Layers (слои)
Если у вас несколько функций используют одни и те же библиотеки (например, axios или type