Serverless функции на TypeScript: AWS Lambda с нуля

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

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

Начать курс

Введение в Serverless функции на TypeScript

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

В этой статье мы подробно разберем, как создать, настроить и развернуть serverless функцию на TypeScript с использованием AWS Lambda. Вы узнаете, как писать эффективный код, обрабатывать события и интегрировать Lambda с другими сервисами AWS.

Что такое AWS Lambda и почему TypeScript?

Основы AWS Lambda

AWS Lambda — это вычислительный сервис, который запускает ваш код в ответ на события и автоматически управляет вычислительными ресурсами. Вы платите только за фактически использованное время выполнения (с округлением до 1 мс).

Ключевые особенности:

  • Событийно-ориентированная архитектура — функция запускается при наступлении события (HTTP-запрос, загрузка файла в S3, изменение в DynamoDB)
  • Автоматическое масштабирование — от одного запроса до тысяч одновременно
  • Поддержка множества языков — Node.js (TypeScript), Python, Java, Go, .NET
  • Бесплатный лимит — 1 миллион запросов в месяц (в рамках Free Tier)

Преимущества TypeScript для Lambda

TypeScript — это надстройка над JavaScript, добавляющая статическую типизацию. Для serverless функций это дает:

  • Меньше ошибок в рантайме — компилятор отлавливает несоответствия типов до деплоя
  • Лучшая документация кода — типы служат самодокументированием
  • Поддержка современных возможностей — async/await, декораторы, дженерики
  • Интеграция с AWS SDK — полные типы для всех сервисов AWS

Создание и настройка Lambda функции на TypeScript

Шаг 1: Инициализация проекта

Создадим новый проект и установим необходимые зависимости:

mkdir my-lambda-function
cd my-lambda-function
npm init -y
npm install --save-dev typescript @types/node aws-sdk
npm install --save-dev @types/aws-lambda

Шаг 2: Настройка TypeScript

Создайте файл tsconfig.json:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "lib": ["ES2020"],
    "outDir": "./dist",
    "rootDir": "./src",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "resolveJsonModule": true,
    "declaration": true
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

Шаг 3: Написание Lambda функции

Создайте директорию src и файл src/handler.ts:

import { Context, APIGatewayProxyEvent, APIGatewayProxyResult } from 'aws-lambda';

interface UserData {
  userId: string;
  name: string;
  email: string;
}

export const handler = async (
  event: APIGatewayProxyEvent,
  context: Context
): Promise<APIGatewayProxyResult> => {
  console.log('Event:', JSON.stringify(event, null, 2));
  console.log('Context:', context);

  try {
    // Парсинг тела запроса
    const body: UserData = JSON.parse(event.body || '{}');

    // Валидация данных
    if (!body.userId || !body.name || !body.email) {
      return {
        statusCode: 400,
        headers: {
          'Content-Type': 'application/json',
          'Access-Control-Allow-Origin': '*'
        },
        body: JSON.stringify({
          message: 'Missing required fields: userId, name, email'
        })
      };
    }

    // Имитация обработки (например, сохранение в DynamoDB)
    const result = {
      processed: true,
      user: body,
      timestamp: new Date().toISOString()
    };

    return {
      statusCode: 200,
      headers: {
        'Content-Type': 'application/json',
        'Access-Control-Allow-Origin': '*'
      },
      body: JSON.stringify(result)
    };

  } catch (error) {
    console.error('Error processing request:', error);

    return {
      statusCode: 500,
      headers: {
        'Content-Type': 'application/json',
        'Access-Control-Allow-Origin': '*'
      },
      body: JSON.stringify({
        message: 'Internal server error',
        error: error instanceof Error ? error.message : 'Unknown error'
      })
    };
  }
};

Шаг 4: Компиляция TypeScript

Добавьте скрипты в package.json:

{
  "scripts": {
    "build": "tsc",
    "watch": "tsc --watch",
    "deploy": "npm run build && echo 'Ready for deployment'"
  }
}

Запустите компиляцию:

npm run build

Скомпилированный JavaScript появится в папке dist/.

Деплой Lambda функции на AWS

Способ 1: Ручной деплой через AWS Console

  1. Зайдите в AWS Lambda Console
  2. Нажмите "Create function" → "Author from scratch"
  3. Укажите имя функции, выберите runtime "Node.js 20.x"
  4. В разделе "Code source" загрузите ZIP-архив с содержимым папки dist/ и node_modules
  5. Укажите handler: handler.handler (файл.функция)
  6. Настройте триггер (например, API Gateway или S3)

Способ 2: Деплой с помощью AWS CLI

Установите и настройте AWS CLI, затем выполните:

# Создайте ZIP-архив
cd dist
zip -r ../function.zip .
cd ..

# Создайте Lambda функцию
aws lambda create-function \
  --function-name my-typescript-function \
  --runtime nodejs20.x \
  --role arn:aws:iam::123456789012:role/lambda-execution-role \
  --handler handler.handler \
  --zip-file fileb://function.zip

# Обновите существ                

Блоги

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