The $125,000 Cost Leak That Started as a Good Decision
A client was running a couple of Aurora databases on Serverless. It was a reasonable, conservative decision. Serverless scales with demand. You don't have to think about instance sizing. It's the safe choice.
It was also the right choice - when they made it.
I pulled 15 months of historical capacity data for those databases. What I found was straightforward: capacity was pretty much constant. Minor fluctuations within the day, sure, but nothing resembling the spiky, burstable pattern where Serverless shines.
These databases had settled into a steady workload a long time ago. The workload stopped being variable. The pricing didn't. Nobody noticed because nobody was looking.
Aurora Serverless charges for the capacity you use, which sounds great until your usage is flat. At that point you're paying the serverless premium for scaling you never actually need. A provisioned instance running at the same capacity costs dramatically less.
I determined the right provisioned instance type for each database based on the historical data. I assisted with the rollout to production. The conversion itself wasn't dramatic.
The numbers were.
Before: $450 a day. After: $100 a day. Annualized, this one change saves about $125,000.
But here's the part that surprised even me. Query latency and jitter actually improved after the migration.
The provisioned instances - R7g running on Graviton 3 - are a newer instance type generation than what Aurora Serverless runs under the hood. The workload was running in the London region, where R8g with Graviton 4 wasn't yet available. But Graviton 3 was still newer than whatever Aurora Serverless was using internally. Same queries, better hardware, lower latency.
They saved money and got better performance. That's rare enough to celebrate.
Nobody made a mistake. The original choice was sound. The workload changed - settled, stabilized, became predictable - and the pricing model that once fit it no longer did.
The cloud doesn't tell you when your decisions go stale. It just keeps billing at the old rate. And because the decision was originally correct, nobody questions it.