Case Study

Serverless in Practice: How We Cut Costs by 85% for a Scaling Startup

Rachel Thompson
Rachel Thompson
Cloud Solutions Architect
2025-10-1112 min
Serverless cloud architecture diagram

Een snelgroeiende Nederlandse scale-up in de e-learning sector had een monolithische applicatie die de groei niet meer aankon. Elke dag kwamen er honderden nieuwe gebruikers bij, serverkosten stegen exponentieel, en de applicatie crashte regelmatig tijdens piekuren. We bouwden een volledig serverless vervanger op AWS die 85% goedkoper is, automatisch schaalt naar 15.000+ gelijktijdige gebruikers, en binnen 6 weken live ging.

De Uitdaging en Requirements

De klant had strikte eisen: de nieuwe architectuur moest minimaal 10.000 gelijktijdige gebruikers aankunnen zonder performance degradatie, maximaal €500 per maand kosten aan hosting, 99.9% uptime garanderen, en binnen 6 weken productie-ready zijn. De oude server-based setup kostte €655 per maand en crashte bij meer dan 2.000 concurrent gebruikers. Handmatig schalen kostte uren downtime en vereiste constant DevOps werk. We kozen voor een volledig serverless architectuur omdat je alleen betaalt voor wat je gebruikt, automatisch schaalt zonder configuratie, en nul serveronderhoud hebt.

De technische stack bestond uit Next.js 14 met Static Site Generation voor de frontend, gehost op AWS S3 met CloudFront CDN voor worldwide distributie. De backend draait op AWS Lambda functies in Node.js achter API Gateway voor REST endpoints. DynamoDB fungeert als database met single-table design voor optimale performance en kosten. Cognito verzorgt authenticatie met social login support, MFA via TOTP, en JWT tokens voor API beveiliging. GitHub Actions en Terraform regelen CI/CD met automatische deployment, infrastructure as code, en rollback capabilities bij failures.

Cloud serverless architectuur
Serverless architectuur op AWS met volledige automatische schaling

Lambda Optimalisatie voor Production

Een veelgemaakte fout bij serverless is het niet optimaliseren van Lambda functies, wat resulteert in hoge kosten en slechte performance. We implementeerden cold start optimalisatie door dependencies in Lambda Layers te plaatsen, code bundling met esbuild (80% kleiner dan webpack), en provisioned concurrency voor kritieke endpoints zoals login en checkout. Het resultaat: cold starts onder 300ms zelfs na uren inactiviteit. Voor memory en timeout tuning deden we A/B testing met verschillende configuraties en ontdekten dat 1024MB RAM de sweet spot was voor onze use case—genoeg performance zonder onnodige kosten.

DynamoDB schema design voor serverless vereist een andere mindset dan relationele databases. We gebruikten single-table design waarbij alle entiteiten in één table leven met composite partition en sort keys. Voordelen: minimale kosten omdat je één table betaalt in plaats van tientallen, snelle queries door direct partition key access, en makkelijker schalen omdat DynamoDB alle partities automatisch distribueert. Access patterns definieerden we vooraf: user data ophalen via partition key USER#123, cursussen van een user via Global Secondary Index op courseId, en activity feeds via sort key met timestamp voor chronologische ordering.

AWS Lambda functies architectuur
Lambda functies schalen automatisch op basis van verkeer zonder configuratie

Caching Strategie voor Kostenbesparing

We implementeerden agressieve caching op drie niveaus om kosten te minimaliseren en performance te maximaliseren. CloudFront cache voor statische assets zoals images, CSS, en JavaScript met een TTL van 1 jaar en cache invalidation bij deployments. API Gateway cache voor GET endpoints met een TTL van 5 minuten voor semi-dynamische data zoals product listings en user profiles. DynamoDB DAX (DynamoDB Accelerator) voor hot data die constant wordt opgevraagd, wat microsecond latency oplevert in plaats van milliseconden. Het resultaat: 95% van alle requests wordt uit cache geserveerd zonder Lambda execution, wat een enorme kostenbesparing en latency verbetering betekent.

Authenticatie met AWS Cognito user pools verzorgde alle user management zonder custom code te schrijven. Features out-of-the-box: user registratie en login met email verificatie, social login via Google en Facebook, MFA met TOTP apps zoals Google Authenticator, password reset flows met email tokens, en JWT tokens voor API authenticatie die we valideren in Lambda authorizers. Cognito schaalt automatisch mee met user growth en kost praktisch niks bij lage volumes—perfect voor startups die willen groeien zonder auth complexity.

De Spectaculaire Resultaten

Na 6 weken development en 2 weken grondig testen gingen we live met de nieuwe serverless architectuur. Performance metrics overtroffen alle verwachtingen: page load time verbeterde van 4.2 seconden naar 0.8 seconden dankzij CloudFront CDN en static site generation, API response time daalde van 800ms gemiddeld naar 120ms door Lambda optimalisatie en caching, uptime over de eerste 3 maanden was 99.97% zonder manual interventions, en de app handelde zonder problemen 15.000+ gelijktijdige gebruikers af tijdens marketing campagnes—meer dan 7x de oude capaciteit.

Before (Old server)
EC2 instances
€450 / month
RDS database
€180 / month
Load balancer
€25 / month
Monthly total
€655 / month
After (Serverless)
Lambda
€45 / month
DynamoDB
€30 / month
S3 + CloudFront
€15 / month
API Gateway
€10 / month
Monthly total
€100 / month
Estimated savings
85%
6.660 / year

De app schaalt nu volledig automatisch op basis van verkeer zonder manual intervention. Bij 100 gebruikers kost het €100 per maand, bij 10.000 gebruikers stijgt dit naar €280 per maand, en bij 100.000 gebruikers betaal je ongeveer €1.200 per maand. AWS regelt alle scaling automatisch via Lambda concurrency, DynamoDB on-demand capacity, en CloudFront edge locations. De kosten schalen lineair met gebruik in plaats van exponentieel zoals bij dedicated servers, en je betaalt nooit voor idle capacity zoals bij always-on EC2 instances.

Performance monitoring dashboard
Real-time monitoring via CloudWatch toont perfect schaalgedrag en uptime

Lessons Learned en Praktische Tips

Wat uitstekend werkte: Infrastructure as Code via Terraform maakte deployments volledig reproduceerbaar en documenteerde de architectuur als code, CloudWatch dashboards gaven direct inzicht in performance en errors zonder extra tooling, integration tests vingen bugs vroeg in het development proces op, en grondige documentatie hielp nieuwe developers om snel productief te worden. De uitdagingen: debugging distributed systems is complexer zonder servers omdat je geen direct shell access hebt, vendor lock-in aan AWS betekent dat migratie naar andere clouds niet triviaal is, de learning curve voor het team om serverless mindset te adopteren kostte 2-3 weken, en initiële cold start performance issues met Lambda vereisten gedegen optimalisatie.

Praktische tips voor anderen die serverless overwegen: start klein met 1-2 Lambda functies in plaats van alles tegelijk te migreren, monitor alles vanaf dag één met CloudWatch, X-Ray voor tracing, en custom metrics voor business KPIs, stel cost alerts en budgets in via AWS Budgets om verassingen op je factuur te voorkomen, implementeer IAM roles volgens least-privilege principle zodat elke Lambda alleen toegang heeft tot resources die het echt nodig heeft, en test lokaal met LocalStack of AWS SAM voor snelle feedback loops zonder constant naar de cloud te deployen.

Veelgemaakte Fouten Vermijden

Fout 1: te grote monolithische Lambda functies van 10MB+ code die traag laden en duur zijn in execution time. Oplossing: split in kleinere single-purpose functies van onder de 1MB die snel starten en gemakkelijker te debuggen zijn. Fout 2: geen error handling en retry logic waardoor crashes permanent data verlies veroorzaken. Oplossing: implementeer Dead Letter Queues voor failed messages en exponential backoff retry strategies. Fout 3: geen monitoring waardoor je pas van problemen hoort als klanten klagen. Oplossing: CloudWatch alarms op error rate, latency percentiles, en throttle events met SNS notificaties naar je team.

Fout 4: verkeerde database keuze zoals RDS voor serverless apps wat duur is en niet schaalt. Oplossing: gebruik DynamoDB voor key-value workloads of Aurora Serverless voor relationele data met automatische scaling. Fout 5: geen caching waardoor elke request een dure Lambda execution triggert. Oplossing: aggressive caching via CloudFront voor static assets en API Gateway cache voor dynamic data met appropriate TTLs.

Is Serverless Geschikt Voor Jouw Project?

Serverless is ideaal als je onvoorspelbaar verkeer hebt met grote pieken en dalen, snel wilt schalen zonder DevOps overhead en infrastructuur management, kosten wilt koppelen aan daadwerkelijk gebruik in plaats van reserved capacity, en focus wilt op features bouwen in plaats van servers beheren. Het is echter niet geschikt als je lange-lopende processen hebt die langer dan 15 minuten draaien (Lambda limit), vendor lock-in absoluut wilt vermijden voor multi-cloud deployments, zeer consistente latency nodig hebt zonder cold starts, of on-premise deployment vereist is vanwege compliance redenen.

Na deze implementatie zijn we overtuigd dat serverless de toekomst is voor de meeste moderne web applicaties. De combinatie van lage kosten, automatische schaling, zero maintenance, en snelle time-to-market maakt het een no-brainer voor startups en scale-ups. De technologie is matuur genoeg voor production gebruik, de ecosystem is rijk met tools en libraries, en de kostenbesparingen zijn significant genoeg om de initiële learning curve te rechtvaardigen. Voor dit project was serverless niet alleen de juiste keuze—het was de enige keuze die alle requirements binnen budget en tijdslimiet kon realiseren.

Klaar om te Starten met je Project?

Bij Webzley bouwen we high-performance websites en web applicaties met de nieuwste technologieën. Van MVP tot enterprise platform - wij helpen je van idee tot lancering.

Chat met ons! 💬