Serverless на TypeScript: AWS Lambda и альтернативы для бэкенда

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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

Блоги

Рекомендаций по книгам