Введение в 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
- Зайдите в AWS Lambda Console
- Нажмите "Create function" → "Author from scratch"
- Укажите имя функции, выберите runtime "Node.js 20.x"
- В разделе "Code source" загрузите ZIP-архив с содержимым папки
dist/иnode_modules - Укажите handler:
handler.handler(файл.функция) - Настройте триггер (например, 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
# Обновите существ