Serverless Costs More Than You Think
Serverless is not cheaper. The cloud vendors know it. The consultants selling migrations know it. And now I'm telling you.
The gap between what AWS promises in their calculator and what shows up on your monthly bill could fund a small data center.
I'm not the only one saying this. I learned most of these lessons from someone who has learned serverless lessons the hard way. Their scars run deeper than mine.
The Bill You Didn't Expect
Cold starts cost you money every single time. That two-second delay while Lambda spins up? You're paying for it. The vendor pricing calculator conveniently forgets to mention this.
I watched our bill jump from $800 to $3,200 in one month. Same traffic. Same application. Just more cold starts because we tried to save money by reducing memory allocation.
Memory pricing is a trap. You set it low to save costs. Then your functions timeout. So you double it for safety. Now you're paying for RAM you don't use 90% of the time.
Data transfer fees multiply with every microservice call. Your monolith made one database query. Your serverless architecture makes twelve function invocations to accomplish the same task. Each one transfers data. Each transfer costs money.
The Hidden Time Tax
Debugging distributed functions is a nightmare. I spent four hours tracking down a bug that would have taken twenty minutes in a traditional stack. The issue? Function A was timing out before Function B responded. Good luck reproducing that locally.
Local development became impossible. We used to run the entire app on a laptop. Now we need mock AWS services, local API gateways, and a prayer that it behaves the same in production.
Testing requires full cloud deployment. Unit tests mean nothing when the integration happens in Lambda's runtime environment. Every test cycle means pushing to AWS and waiting. And paying.
Time-to-resolution tripled after our serverless migration. Problems that used to take an hour now take an afternoon. Stack traces are useless when they span eight different functions across three AWS services.
Vendor Lock-In Nobody Mentions
Proprietary event formats own you. That Lambda function expects events shaped exactly how API Gateway sends them. Want to move to another provider? Rewrite everything.
SDK dependencies are everywhere. Your code is riddled with AWS-specific libraries. It's not portable anymore. It's not even really yours.
Migration costs are brutal when you finally admit the mistake. I know teams that spent six months untangling their serverless architecture just to get back to containers. The migration to serverless took two months. The migration away took half a year.
Negotiating power evaporated. You used to be able to shop around or threaten to move providers. Now you're locked in. They know it. You know it. The discount you asked for? Denied.
When Serverless Actually Makes Sense
Some workloads genuinely benefit. I won't pretend otherwise.
Event-driven batch processing works well. Infrequent jobs that spike unpredictably. Image processing that happens twice a day. Webhook handlers that sit idle most of the month.
The scale threshold matters. If your traffic is sporadic and you're handling millions of requests with long idle periods, the math might work. Emphasis on might.
But steady-state production applications? The ones running 24/7 with predictable load? You're paying a premium for infrastructure you don't need to scale.
The Real Cost of Following Trends
Infrastructure fashion changes every three years. Serverless was the hot thing. Now everyone's realizing containers were fine all along.
Engineering reality doesn't care about blog posts and conference talks. It cares about uptime, debuggability, and total cost of ownership.
Run the actual numbers before you migrate. Include developer time. Include debugging overhead. Include the cost of vendor lock-in insurance.
The calculator lies.