Serverless на JavaScript: Как перестать думать о серверах и начать писать код
Представьте: вы написали крутой сервис, запустили, а через месяц он никому не нужен. Вы платите за сервер, который простаивает. Или наоборот — на вас обрушился хабраэффект, сервер падает, а вы в 3 часа ночи правите nginx. Знакомо? Есть способ избавиться от этой головной боли — serverless функции на JavaScript.
Serverless (или бессерверные вычисления) — это не магия, а модель, где вы пишете только код, а провайдер (AWS, Google, Yandex) сам решает, когда, где и сколько ресурсов выделить. Вы платите только за время выполнения и количество запросов. Никаких «вечно включенных» виртуалок. Для JavaScript-разработчика это особенно удобно: Node.js — родная среда для AWS Lambda, Google Cloud Functions и Yandex Cloud Functions.
В этой статье мы не просто расскажем теорию. Мы напишем реальные функции, сравним провайдеров и дадим чек-лист, чтобы вы не наступили на грабли. Поехали!
Что такое serverless функция и зачем она JS-разработчику?
Serverless функция — это кусочек кода (обычно одна функция), который выполняется в ответ на событие. Событием может быть HTTP-запрос, загрузка файла в S3, запись в базу данных или даже сигнал от таймера (cron).
Почему это удобно для JavaScript:
- Быстрый старт — не нужно настраивать сервер, достаточно залить код.
- Автомасштабирование — функция сама размножится под нагрузку.
- Экономия — пока никто не обращается к функции, вы не платите ни копейки.
- Экосистема — Node.js поддерживается всеми крупными провайдерами.
Типичные сценарии: обработка вебхуков, генерация превью изображений, рассылка писем, валидация форм, парсинг данных, создание микросервисов. Всё, что можно запустить по требованию.
AWS Lambda — король serverless JavaScript
Amazon Web Services Lambda — самый популярный сервис. Он появился первым и до сих пор задаёт стандарты. Давайте напишем простую функцию, которая принимает JSON и возвращает ответ.
Код для AWS Lambda на Node.js 20:
export const handler = async (event) => {
try {
const { name } = JSON.parse(event.body || '{}');
const message = `Привет, ${name || 'гость'}! Ты успешно вызвал serverless функцию.`;
return {
statusCode: 200,
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
},
body: JSON.stringify({ message, timestamp: Date.now() }),
};
} catch (error) {
return {
statusCode: 400,
body: JSON.stringify({ error: 'Некорректный JSON' }),
};
}
};
Обратите внимание: функция называется handler. Это стандартное имя для точки входа. Параметр event содержит всё, что пришло от API Gateway — заголовки, тело, параметры запроса. Вы возвращаете объект с statusCode и body.
Как это работает: вы создаёте функцию в консоли AWS, загружаете код (или используете SAM/Serverless Framework), настраиваете триггер — например, HTTP-эндпоинт через API Gateway. Всё. Мир стал проще.
Холодный старт и как с ним жить
Главный минус Lambda — холодный старт. Если функция долго не вызывалась, при первом запросе среда загружается заново. Это может занять 200-500 мс. Для высоконагруженных API это критично. Решения:
- Держите функцию «тёплой» с помощью CloudWatch Events (каждые 5 минут пинговать).
- Уменьшайте размер пакета — не тащите лишние npm-пакеты.
- Используйте Provisioned Concurrency (но это дороже).
Для большинства микросервисов холодный старт — не проблема. Но если вы пишете чат-бота, где важна скорость, учитывайте это.
Google Cloud Functions — простота и интеграция с Firebase
Google Cloud Functions (GCF) — второй по популярности вариант. Он тесно связан с Firebase, что делает его идеальным для мобильных и веб-приложений. Код практически идентичен Lambda, но есть нюансы.
Пример Google Cloud Function на JavaScript:
const functions = require('@google-cloud/functions-framework');
functions.http('helloWorld', (req, res) => {
const name = req.query.name || req.body.name || 'мир';
res.json({
message: `Привет, ${name}!`,
platform: 'Google Cloud Functions',
});
});
Здесь мы используем @google-cloud/functions-framework, чтобы запускать функции локально. Это удобно для отладки. В облаке вы просто загружаете код, и Google сам подхватывает экспортированную функцию.
Что крутого в GCF:
- Бесплатный лимит — 2 миллиона запросов в месяц (щедрее, чем у AWS).
- Firebase интеграция — можно триггерить функции от аутентификации, Realtime Database, Firestore.
- Gen 2 — новое поколение функций с более быстрым холодным стартом.
Yandex Cloud Functions — российский аналог
Если вам нужно работать в России или с данными, которые должны храниться локально, Yandex Cloud Functions — отличный выбор. Он полностью совместим с Node.js и имеет понятную консоль.
Пример функции для Yandex Cloud:
exports.handler = async (event, context) => {
const name = event.queryStringParameters?.name || 'мир';
return {
statusCode: 200,
body: JSON.stringify({
message: `Привет, ${name}! Это Yandex Cloud Functions.`,
requestId: context.requestId,
}),
};
};
Структура похожа на AWS Lambda, но есть особенности:
- Вместо
event.bodyнужно смотретьevent.httpMethodиevent.queryStringParameters. - Триггеры настраиваются через консоль — HTTP, таймер, Message Queue, Object Storage.
- Есть бесплатный лимит — 1 миллион запросов в месяц.
Yandex Cloud Functions хорошо подходит для интеграции с другими сервисами Яндекса (например, YandexGPT, SpeechKit). Если вы строите AI-решения на русском — это ваш выбор.
Сравнение провайдеров serverless для JavaScript
Чтобы вам было проще выбрать, вот краткая таблица:
| Параметр | AWS Lambda | Google Cloud Functions | Yandex Cloud Functions |
|---|---|---|---|
| Холодный старт | Средний (200-500 мс) | Быстрый в Gen 2 | Средний |
БлогиРекомендаций по книгамЧитайте также |