I went all-in on serverless for a side project. The first month was magical โ zero ops, auto-scaling, pay-per-use. Then the cold starts hit, the debugging got painful, and the bill stopped making sense. Hereโs what nobody tells you.
Serverless is genuinely great for certain workloads. But the hype machine has convinced developers itโs the answer to everything. Itโs not.
The promises vs reality
Promise: โYou never think about servers again!โ Reality: You think about servers less, but you think about timeouts, cold starts, memory limits, and execution duration constantly.
Promise: โIt scales automatically!โ Reality: It scales automaticallyโฆ including your bill. One recursive Lambda function and youโre looking at a surprise invoice.
Promise: โYou only pay for what you use!โ Reality: True for low traffic. At moderate-to-high traffic, a $20/month VPS often beats hundreds in Lambda costs.
Cold starts are real
Your API endpoint takes 200ms normally. But after 15 minutes of no traffic, the next request takes 2-5 seconds. For a user clicking a button, thatโs an eternity.
Workarounds exist (provisioned concurrency, keeping functions warm), but they add cost and complexity โ defeating the โsimple and cheapโ selling point.
Debugging is a nightmare
Something fails in production. Your debugging experience:
With a server: SSH in, check logs, reproduce the issue, fix it.
With serverless: Open CloudWatch, search through 47 log groups, find the invocation ID, realize the error happened in a different function that was triggered by an event from another function, spend 30 minutes correlating timestamps across services, wish you had a server.
Distributed tracing tools help, but theyโre another service to set up, pay for, and maintain.
Vendor lock-in is real
Your Lambda functions use:
- API Gateway for routing
- DynamoDB for data
- SQS for queues
- S3 for storage
- EventBridge for events
- Step Functions for orchestration
Want to move to GCP? Rewrite everything. Want to run locally? Good luck simulating all of that.
โBut we use the Serverless Framework!โ โ Youโre still calling AWS-specific APIs in your code.
The bill surprise
Serverless pricing is per-invocation and per-duration. This is cheap at low scale. But:
- A function that runs 1M times/month at 500ms with 512MB memory โ $10/month
- Scale that to 100M invocations โ $1,000/month
- A $40/month VPS handles the same load easily
The crossover point is lower than most people think.
When serverless is the right call
- Sporadic workloads โ a function that runs twice a day (cron jobs, webhooks)
- Event processing โ image resizing, file processing, triggered by uploads
- MVPs โ when you have zero traffic and zero budget
- Glue code โ small functions connecting services together
When itโs the wrong call
- APIs with consistent traffic โ a server is cheaper and faster
- Anything latency-sensitive โ cold starts kill user experience
- Complex applications โ the debugging overhead isnโt worth it
- Teams without cloud expertise โ the learning curve is steep
The honest recommendation
Start with a simple server (a $5 VPS, a Railway app, a Fly.io machine). If you hit a specific scaling problem that serverless solves, extract that piece. Donโt start serverless and work backwards.
Related: Best Hosting for AI Side Projects ยท Best Cloud GPU Providers