"Pay only for what you use" is serverless marketing. The reality? You'll pay for what you didn't know you were using, plus overhead you can't avoid. After years of production workloads, the pattern is clear: serverless optimizes for getting started, not staying efficient.
The Observability Tax
Debugging distributed functions requires expensive tooling. CloudWatch, X-Ray, third-party APM solutions: costs that double your infrastructure spend aren't unusual. Cold starts fail silently, timeouts cascade mysteriously, and you'll pay premium prices for visibility into your own code.
Vendor Lock-In Accumulates Slowly
Starting with managed services feels frictionless until you need custom behavior. Proprietary APIs, platform-specific triggers, and service limits box you in. Migration costs become ransom payments when your architecture depends on features that only one cloud provider offers.
Idle Complexity Never Scales to Zero
Functions sleep, but the operational complexity stays awake. API gateways, IAM policies, deployment pipelines, and monitoring configurations multiply faster than your code. Management overhead scales with service count, not usage.
The Performance-Cost Squeeze
Memory configuration determines both performance and cost, but the sweet spot moves as workloads evolve. Under-provisioned functions timeout and retry, over-provisioned ones waste money on idle capacity. Optimization becomes a constant tax on engineering time.
Support and Expertise Premium
When things break at 3 AM, serverless expertise is scarce and expensive. Platform-specific debugging skills don't transfer, and commercial support packages cost more than traditional hosting. Your team becomes dependent on specialized knowledge that few people have.
Serverless isn't inherently expensive, but the true costs emerge over time: vendor dependency, operational complexity, and specialized tooling requirements that traditional architectures avoid. Factor these hidden expenses into your decision from day one.