Налаштування Serverless Framework для веб-додатків
Serverless Framework — це інструмент розгортання та управління serverless-функціями поверх провайдерів (AWS, GCP, Azure, Cloudflare). Він не абстрагує хмару повністю — ви все ще працюєте з провайдер-специфічними ресурсами, але конфігурація, розгортання та управління окруженнями об'єднані в один serverless.yml.
На відміну від Terraform або CDK, Serverless Framework спеціально розроблений для функцій. На відміну від AWS SAM, він підтримує кілька хмарних провайдерів.
Установка та базова структура
npm install -g serverless
serverless --version
serverless create --template aws-nodejs-typescript --path my-service
cd my-service
npm install
Структура проекту:
my-service/
├── serverless.yml
├── serverless.env.yml
├── src/
│ ├── functions/
│ │ ├── api/handler.ts
│ │ └── worker/handler.ts
│ └── libs/
├── tsconfig.json
└── package.json
Конфігурація serverless.yml
service: my-web-service
frameworkVersion: '3'
plugins:
- serverless-esbuild
- serverless-offline
- serverless-dotenv-plugin
provider:
name: aws
runtime: nodejs20.x
region: eu-west-1
stage: ${opt:stage, 'dev'}
memorySize: 512
timeout: 10
environment:
NODE_ENV: ${self:provider.stage}
DATABASE_URL: ${env:DATABASE_URL}
JWT_SECRET: ${env:JWT_SECRET}
iam:
role:
statements:
- Effect: Allow
Action:
- s3:GetObject
- s3:PutObject
Resource: 'arn:aws:s3:::my-bucket/*'
httpApi:
cors:
allowedOrigins:
- https://my-site.com
- http://localhost:3000
allowedHeaders: [Content-Type, Authorization]
allowedMethods: [GET, POST, PUT, DELETE]
custom:
esbuild:
bundle: true
minify: true
target: node20
serverless-offline:
httpPort: 3001
functions:
- ${file(src/functions/api/index.ts)}
- ${file(src/functions/worker/index.ts)}
Конфігурація функції
// src/functions/api/index.ts
import type { AWS } from '@serverless/typescript';
const apiFunction: AWS['functions'] = {
api: {
handler: 'src/functions/api/handler.main',
events: [
{
httpApi: {
method: 'ANY',
path: '/api/{proxy+}',
},
},
],
},
};
export default apiFunction;
Handler з middleware
// src/libs/lambda.ts
import middy from '@middy/core';
import middyJsonBodyParser from '@middy/http-json-body-parser';
import httpErrorHandler from '@middy/http-error-handler';
import cors from '@middy/http-cors';
type Handler = (event) => Promise<any>;
export const middyfy = (handler: Handler) =>
middy(handler)
.use(middyJsonBodyParser())
.use(httpErrorHandler())
.use(cors());
Управління окруженнями
serverless deploy --stage dev
serverless deploy --stage prod
serverless logs --function api --tail --stage prod
Оптимізація
esbuild значно зменшує холодний старт. Комплектуйте обережно:
custom:
esbuild:
bundle: true
exclude:
- '@aws-sdk/*'
external:
- 'sharp'
Терміни
Базове налаштування з однією функцією та розгортанням dev/prod — 1 день. Повна структура з кількома функціями та CI/CD — 3–4 дні.







