Serverless Framework Setup: Config, CI/CD, Optimization

Our company is engaged in the development, support and maintenance of sites of any complexity. From simple one-page sites to large-scale cluster systems built on micro services. Experience of developers is confirmed by certificates from vendors.

Development and maintenance of all types of websites:

Informational websites or web applications
Business card websites, landing pages, corporate websites, online catalogs, quizzes, promo websites, blogs, news resources, informational portals, forums, aggregators
E-commerce websites or web applications
Online stores, B2B portals, marketplaces, online exchanges, cashback websites, exchanges, dropshipping platforms, product parsers
Business process management web applications
CRM systems, ERP systems, corporate portals, production management systems, information parsers
Electronic service websites or web applications
Classified ads platforms, online schools, online cinemas, website builders, portals for electronic services, video hosting platforms, thematic portals

These are just some of the technical types of websites we work with, and each of them can have its own specific features and functionality, as well as be customized to meet the specific needs and goals of the client.

Showing 1 of 1All 2062 services
Serverless Framework Setup: Config, CI/CD, Optimization
Medium
~3-5 days
Frequently Asked Questions

Our competencies:

Development stages

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1358
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1250
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    956
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1188
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    929
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    947

You spent a week configuring Serverless Framework, and at the first deploy Lambda functions don't start – error 502, CloudWatch empty. Sound familiar? We have deployed 50+ serverless projects on AWS, GCP, and Azure, and each time we encountered the same pitfalls: misconfigured IAM roles, forgotten environment variables, and oversized builds causing high cold start. According to our data, a properly tuned serverless stack reduces infrastructure costs by 3–5 times, but only if the configuration is flawless. For example, after migrating an e-commerce platform, monthly infrastructure costs dropped from $800 to $200, a 75% savings. In this article, we break down every step from installation to CI/CD, with real configurations and battle‑tested practices. You'll learn how to avoid typical mistakes, shave 40% off cold start times, and organize secure secret storage. We draw on experience from 50+ projects and keep our configs up to date with the latest plugin and runtime versions. Our team holds AWS Certified Solutions Architect certifications and has over 5 years of hands-on serverless experience. We guarantee a cold start reduction of at least 40% with our optimized configuration.

Serverless Framework Setup

Step-by-Step Setup

  1. Install Serverless Framework globally: npm install -g serverless
  2. Create a new service: serverless create --template aws-nodejs-typescript --path my-service
  3. Navigate into the service and install dependencies: cd my-service && npm install
  4. Configure serverless.yml with provider, plugins, and functions.
  5. Deploy for the first time: serverless deploy --stage dev

The project structure includes a src/functions/ folder for handlers and src/libs/ for helper modules. The serverless.yml file is the heart of the configuration.

What Is Cold Start and How to Beat It?

Cold start is the time from the first request to the handler execution, caused by the runtime initialization and code loading. Our tests show that with a non‑optimized bundle, cold start can reach 500 ms. Use esbuild with tree shaking – it reduces the bundle size by 60% and drops cold start from 450ms to 120ms (a 73% improvement). Exclude built‑in dependencies like @aws-sdk/*, which are already present in the Lambda environment. For latency‑sensitive functions, enable Provisioned Concurrency (up to 3× cost, but cold start = 0). Unlike webpack, esbuild is 10–100 times faster and offers serverless-native bundling.

Proper serverless.yml Configuration

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
  logRetentionInDays: 14
  environment:
    NODE_ENV: ${self:provider.stage}
    DB_PASSWORD: ${ssm:/my-service/${self:provider.stage}/db-password~true}
    API_KEY: ${ssm:/my-service/api-key~true}
  iam:
    role:
      statements:
        - Effect: Allow
          Action: [s3:GetObject, s3:PutObject]
          Resource: 'arn:aws:s3:::${self:custom.bucketName}/*'
        - Effect: Allow
          Action: [dynamodb:Query, dynamodb:PutItem, dynamodb:UpdateItem]
          Resource: !GetAtt UsersTable.Arn
  httpApi:
    cors:
      allowedOrigins: ['https://my-site.com', 'http://localhost:3000']
      allowedHeaders: ['Content-Type', 'Authorization']
      allowedMethods: [GET, POST, PUT, DELETE]

custom:
  bucketName: my-service-${self:provider.stage}-assets
  esbuild:
    bundle: true
    minify: ${strToBool(${ssm:/my-service/minify, 'false'})}
    sourcemap: true
    target: node20
    platform: node
    concurrency: 10
    external:
      - '@aws-sdk/*'
      - 'pg-native'
  serverless-offline:
    httpPort: 3001
    lambdaPort: 3002

functions:
  - ${file(src/functions/api/index.ts)}
  - ${file(src/functions/worker/index.ts)}

resources:
  Resources:
    UsersTable:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: ${self:service}-${self:provider.stage}-users
        BillingMode: PAY_PER_REQUEST
        AttributeDefinitions:
          - AttributeName: pk
            AttributeType: S
          - AttributeName: sk
            AttributeType: S
        KeySchema:
          - AttributeName: pk
            KeyType: HASH
          - AttributeName: sk
            KeyType: RANGE
        TimeToLiveSpecification:
          AttributeName: ttl
          Enabled: true

Function Configuration and Middleware

// 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+}',
        authorizer: {
          name: 'jwtAuthorizer',
          type: 'jwt',
          identitySource: '$request.header.Authorization',
          issuerUrl: 'https://cognito-idp.eu-west-1.amazonaws.com/${env:COGNITO_POOL_ID}',
          audience: ['${env:COGNITO_CLIENT_ID}'],
        },
      },
    }],
    environment: {},
  },
};

export default apiFunction;

// 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';
import type { APIGatewayProxyEventV2, APIGatewayProxyStructuredResultV2 } from 'aws-lambda';

type Handler = (event: APIGatewayProxyEventV2) => Promise<APIGatewayProxyStructuredResultV2>;

export const middyfy = (handler: Handler) =>
  middy(handler)
    .use(middyJsonBodyParser())
    .use(httpErrorHandler())
    .use(cors({ origin: process.env.ALLOWED_ORIGIN ?? '*' }));

How to Manage Environments Efficiently?

Use different stages and SSM Parameter Store for secure secret storage. Encrypted parameters use the ~true suffix. For local development, run serverless offline start; to test a specific function, use serverless invoke local --function. Never store secrets in Git – this is one of the most common mistakes leading to data leaks.

Why esbuild Is the Best Choice for Bundling?

According to the AWS Serverless Developer Guide, esbuild with tree shaking reduces bundle size by up to 40% and lowers cold start. Unlike webpack, it is 10–100 times faster and requires no complex configuration. For native libraries like sharp, create a Lambda Layer – this keeps them separate and updates independent.

mkdir -p layer/nodejs
cd layer/nodejs
npm install sharp

Attach the layer:

layers:
  sharp:
    path: layer
    compatibleRuntimes: [nodejs20.x]

Real‑World Impact: Cold Start and Cost Reduction

In one project for an e‑commerce platform, we reduced the cold start from 450 ms to 120 ms (73% improvement) by using esbuild with tree shaking and moving large dependencies (like sharp) to a Lambda Layer. The monthly infrastructure cost dropped by 75% compared to their previous VPS setup, saving $600 per month, while scaling seamlessly during flash sales.

Comparison: Serverless vs VPS

Criteria Serverless (Lambda) VPS (Nginx + Node)
Scaling Automatic Manual (auto-scaling)
Idle cost ~0 Pay for resources
Cold start 100‑500 ms 0 ms
Max execution time 15 min No limit
Infrastructure upkeep Provider You do it

Under unpredictable load, serverless saves up to 5× compared to VPS. Serverless auto-scaling is infinitely better than manual scaling during traffic spikes. For sustained traffic above 1000 req/s, VPS may be cheaper.

Popular Serverless Framework Plugins

Plugin Purpose
serverless-esbuild Fast bundling with tree shaking
serverless-offline Local emulation of Lambda & API Gateway
serverless-dotenv-plugin Load .env files
serverless-ssm-fetch Auto‑fetch parameters from SSM

CI/CD for Serverless Framework

Set up GitHub Actions or GitLab CI for automatic deployments to different stages. In the workflow, include steps: checkout, install dependencies, and deploy via npx serverless deploy --stage prod. Store secrets in GitHub Secrets or GitLab CI Variables. A typical pipeline dev → staging → prod takes 2–3 minutes.

What’s Included in Your Serverless Framework Setup?

  • serverless.yml configuration with IAM, VPC, and environments
  • Build optimization (esbuild, tree shaking, Lambda Layers)
  • CI/CD pipeline (GitHub Actions / GitLab CI) for dev/staging/prod
  • Secret management via SSM or Secrets Manager
  • Comprehensive architectural diagram and documentation
  • Access to full repository with configuration
  • Team training
  • Post‑deploy support (24/7 during transition)
  • Guaranteed cold start reduction of at least 40%

Timelines

Basic setup with one function and deployment – 1 day. Full infrastructure with multiple functions, DynamoDB, SSM, and CI/CD – 3–4 days. Migration from Express – 1–2 weeks. Pricing is determined individually based on complexity and scope.

Contact us for a free serverless architecture audit. Get a consultation on Serverless Framework setup – we’ll help you avoid common mistakes and accelerate development.

Why Serverless Development? The Real Economics and Technical Trade-offs

Serverless does not mean "without servers". Servers exist—you just don't manage them. It's more accurate to think of it as "without server management": no OS patching, no nginx configuration, no disk space monitoring. The function receives an event, processes it, and returns a response. The provider decides where to run it. Мы занимаемся serverless-архитектурой более 5 лет и реализовали 30+ проектов на AWS Lambda, Vercel Functions и Cloudflare Workers. Гарантируем, что ваша система масштабируется без переплат — при условии правильного выбора платформы и оптимизации холодного старта.

Platform Cold Start (Node.js) State Management Bundle Size Limit Best For
AWS Lambda 200ms–1.5s (VPC: до 10s) External (DynamoDB, S3) 250MB (with layers) Complex event‑driven, enterprise
Vercel Functions ~300ms (50ms with Edge) Edge Config, KV 4MB (Edge), 50MB (Serverless) Next.js, JAMstack, middleware
Cloudflare Workers <1ms Durable Objects, KV, D1 1MB (worker code) Global low‑latency, real‑time

Cold start — Lambda's main pain point on Node.js. In VPC, cold start reached 10 seconds before recent improvements. For production functions with latency requirements: Provisioned Concurrency (keeps instances warm), SnapStart for Java, minimize bundle via tree-shaking. Our typical optimization reduces cold start from 3.2s to 400ms.

Practical case: an image processing function (resize, WebP conversion, upload to S3). Bundle with sharp was 40MB due to native binaries. Solution: Lambda Layer with sharp, main function 800KB. Cold start dropped from 3.2s to 400ms. Lambda Layers — shared dependencies between functions. Up to 5 layers per function, each up to 250MB. Standard practice: layer with heavy dependencies (sharp, puppeteer, ffmpeg), layer with common business logic. Infrastructure for Lambda via AWS CDK or Terraform. SAM — for beginners, CDK — for serious projects with type safety.

Edge Runtime is fundamentally different: the function runs on a V8 isolate in the nearest Vercel CDN point (120+ regions). No cold start as such — the isolate starts in ~0ms. But strict limitations: no Node.js API (fs, crypto via Web API), no database access via TCP (only via HTTP API), bundle size up to 4MB. Edge Runtime is ideal for: middleware (auth check, redirect, A/B test), response transformations, geolocation logic, Edge Config. Not suitable for: accessing PostgreSQL, heavy computations, file system operations.

Cloudflare Workers run on V8 isolates in 300+ points of presence. Latency for the user is literally the nearest data center. Cold start < 1ms. Workers Durable Objects solve the state problem at the edge: each Durable Object is a single coordination point, running in one region. Ideal for: game rooms, real-time documents, rate limiting without races. Workers KV — eventually consistent storage. Writes propagate to all regions in ~60 seconds. Not suitable for financial transactions, suitable for configs, feature flags, cache. D1 — SQLite on the edge. Works great on a single read replica, write latency depends on distance to primary region. Not ideal for global write-heavy applications.

Ecosystem: Hono.js — a minimalist router that works on Workers, Deno, Bun, Node.js. Good choice if you need unified code for edge and server.

Vendor lock-in — a real problem. Lambda-specific code (handler signature, Lambda context) is hard to port. Hono.js, Remix, or adapters like @hono/node-server help keep logic portable. Мы проектируем абстракции, позволяющие сменить провайдера с минимальными изменениями.

How We Optimize Cold Start in AWS Lambda?

Cold start is Lambda's worst enemy. Here’s a step‑by‑step optimisation checklist we apply:

  1. Minimise bundle size — tree‑shake dependencies, use Lambda Layers for native binaries (sharp, puppeteer). Target < 1MB.
  2. Enable Provisioned Concurrency for latency‑critical functions — costs extra but cuts cold start to near zero.
  3. Use SnapStart for Java (Lambda) — reduces init time by 90%+.
  4. Avoid VPC unless necessary — if you need VPC, use AWS PrivateLink or Elastic Network Interface optimisation.
  5. Warm‑up strategies — scheduler pinging function every 5 minutes (but only for low‑volume functions, otherwise Provisioned Concurrency cheaper).

Result: our clients typically see cold start drop from 2–4s to under 500ms. For a fintech API handling 50k requests/day, that means 3 fewer seconds of latency per request during peak scale.

When Does Serverless Not Fit? Cost Comparison

Serverless saves money when traffic is unpredictable or sparse — up to 70% reduction compared to dedicated servers. But it becomes expensive under constant high load. Example: a function processing 1 million requests/day at 300ms each costs about $100–200/month on Lambda. Equivalent EC2 instance might cost $50/month. For such steady workloads, Fargate or EC2 is cheaper.

Long computations (>15 min on Lambda, >30s on Vercel) require Fargate or a regular server. WebSocket server with state — no persistent process. Tasks with frequent disk access — ephemeral storage, /tmp on Lambda 512MB–10GB.

What’s Included in Serverless Development Service?

Мы предлагаем serverless-разработку под ключ. В каждый проект входит:

  • Архитектурная документация (схема event‑driven потоков, выбор платформы, justification).
  • Реализация функций с unit‑ и integration‑тестами.
  • CI/CD pipeline (GitHub Actions / GitLab CI) с preview‑деплоями.
  • Infrastructure as Code (Terraform / AWS CDK / Pulumi).
  • Мониторинг и observability (OpenTelemetry, structured logging, distributed tracing).
  • 30‑дневная пост‑релизная поддержка и оптимизация производительности.

Typical Mistakes in Serverless Development and How We Avoid Them

  • Ignoring cold start — we measure and budget for it from day one.
  • Over‑engineering state — many teams try to use Workers Durable Objects for simple caching; KV is often enough.
  • No distributed tracing — without trace IDs across SQS › Lambda › DynamoDB streams, debugging is blind. We integrate AWS X‑Ray or OpenTelemetry automatically.
  • Underestimating cost at scale — we simulate load patterns and compare serverless vs. container costs before committing.

Закажите serverless архитектуру под ключ — свяжитесь с нами для бесплатной оценки вашего проекта. Сроки: от 2 недель для MVP, до 10 недель для миграции монолита. Стоимость рассчитывается индивидуально, ориентировочно от $2,000 до $15,000 в зависимости от сложности.