Serverless функции на JavaScript: AWS Lambda от А до Я

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

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

Начать курс

Введение в мир Serverless и AWS Lambda

Современная облачная разработка всё чаще переходит на serverless (бессерверную) архитектуру. Несмотря на название, серверы никуда не исчезают — вы просто перестаёте о них думать. AWS Lambda — это сервис от Amazon, который позволяет запускать код без выделения и управления серверами. Вы платите только за фактическое время выполнения и количество запросов.

В этой статье мы разберём AWS Lambda на JavaScript (Node.js) от самых основ до реальных примеров. Вы узнаете, как создавать, настраивать и деплоить функции, а также познакомитесь с лучшими практиками.

Основы AWS Lambda для Node.js

Что такое Lambda-функция?

Lambda-функция — это изолированный блок кода, который выполняется в ответ на событие (триггер). Функция получает на вход event (данные события) и context (информация о среде выполнения) и возвращает результат.

Структура простейшей Lambda-функции

Базовая функция на Node.js выглядит так:

exports.handler = async (event, context) => {
    const name = event.queryStringParameters?.name || 'Гость';
    const response = {
        statusCode: 200,
        body: JSON.stringify({ message: `Привет, ${name}!` }),
    };
    return response;
};
  • exports.handler — обязательная точка входа.
  • event — содержит данные, переданные триггером (например, HTTP-запрос из API Gateway).
  • context — предоставляет методы для работы с выполнением (время, логгер, идентификатор).
  • Функция должна быть async или возвращать Promise.

Триггеры (источники вызова)

Lambda не существует в вакууме. Её могут вызывать:

  • API Gateway — HTTP-запросы (REST/WebSocket).
  • S3 — загрузка/удаление файлов.
  • DynamoDB Streams — изменения в базе данных.
  • SQS/SNS — очереди сообщений.
  • CloudWatch Events — расписание (cron).

Создание и деплой Lambda-функции

Шаг 1: Настройка окружения

Вам понадобится:

  • Учётная запись AWS.
  • Установленный AWS CLI и настроенные credentials.
  • Node.js (версия 18 или 20, рекомендовано AWS).

Шаг 2: Создание функции через консоль

Это самый быстрый способ для новичков:

  1. Зайдите в AWS Management Console → Lambda.
  2. Нажмите "Создать функцию" → "С нуля".
  3. Укажите имя, выберите runtime Node.js 20.x.
  4. Нажмите "Создать".

В редакторе кода вставьте наш пример выше и нажмите "Deploy". Готово!

Шаг 3: Деплой с помощью AWS CLI

Для автоматизации деплоя используйте команду:

zip -r function.zip index.js node_modules
aws lambda update-function-code \
    --function-name my-first-lambda \
    --zip-file fileb://function.zip

Продвинутые сценарии и лучшие практики

Работа с переменными окружения

Никогда не храните секреты в коде. Используйте process.env:

const dbPassword = process.env.DB_PASSWORD;
const tableName = process.env.TABLE_NAME;

Переменные задаются в настройках функции (Configuration → Environment variables).

Обработка ошибок и логирование

Используйте встроенный логгер console.log — он автоматически отправляет логи в CloudWatch:

exports.handler = async (event) => {
    console.log('Получен event:', JSON.stringify(event, null, 2));
    try {
        // ваш код
    } catch (error) {
        console.error('Ошибка:', error.message);
        throw error; // AWS вернёт ошибку инициатору
    }
};

Холодный старт (Cold Start)

Если функция долго не используется, AWS "засыпает" её контейнер. При следующем вызове происходит задержка (холодный старт). Рекомендации:

  • Используйте Provisioned Concurrency (резервирование контейнеров) для критичных функций.
  • Минимизируйте размер пакета — не включайте лишние зависимости.
  • Переносите тяжелые операции (подключение к БД) за пределы handler, в глобальную область видимости.
// Плохо: подключение внутри handler
exports.handler = async () => {
    const db = await connectToDB(); // каждый раз
};

// Хорошо: глобальный кеш
let db;
exports.handler = async () => {
    if (!db) db = await connectToDB();
};

Оптимизация размера и зависимостей

Lambda имеет лимит на размер пакета (50 MB zipped, 250 MB unzipped). Используйте Lambda Layers для общих библиотек (например, aws-sdk уже включён в среду).

Заключение

AWS Lambda на JavaScript — мощный инструмент для построения масштабируемых и экономичных серверных приложений. Вы научились:

  • Создавать и деплоить функции.
  • Работать с триггерами.
  • Применять лучшие практики (логирование, кеширование, холодный старт).

Дальнейшие шаги: изучите AWS SAM или Serverless Framework для автоматизации инфраструктуры, а также попробуйте интегрировать Lambda с DynamoDB и S3. Бессерверная архитектура открывает безграничные возможности — начните с малого и масштабируйтесь!

Не забудьте очистить ресурсы после тестов, чтобы избежать лишних расходов.

Блоги

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