I've been running databases on AWS RDS for 4 years. Started simple, ended expensive as hell. What looked like a $200/month database is now costing us $1,400/month, and our traffic barely doubled. Here's every hidden fee that'll bite you, learned the hard way through production failures and surprise bills.
Why AWS Makes Sure You Never Leave
Spinning up an RDS instance takes 3 minutes. Migrating away? That took us 6 months, cost something like 45-50K in consulting fees, and broke our auth system twice. AWS didn't accidentally make it easy to get in and hard to get out.
The more successful your app becomes, the more money AWS makes off you. It's not a bug, it's the business model. Every feature that scales with your growth has a price tag attached.
The Fees That Destroyed Our Budget
Data Export Costs: How AWS Makes Sure You Never Leave
Our BI reports were pulling maybe 500GB a month. AWS wanted 45 bucks just for us to read our own damn data. Nine cents per gig to access stuff we're already paying to store. Made zero sense. Like, what the hell?
When we tried to optimize by caching more data locally, our application servers ballooned from 8 to 24 instances. Storage is cheap, but AWS makes you pay for the privilege of using it efficiently.
IOPS: When Your Database Crawls to a Halt
Our queries went from 200ms to over 2 seconds during lunch rush. AWS wanted ten cents per IOPS per month to fix it. We needed like 8-10K IOPS just to get back to normal. That's almost a grand a month on top of everything else, just so our app wouldn't completely suck when people actually used it. I remember sitting there at 2am provisioning IOPS in 1K increments because I was scared of the bill.
The real kick in the teeth? You can't predict IOPS needs until you're getting hammered by users. By then, you're choosing between a slow app and a massive bill. Performance tuning becomes a constant battle against AWS billing policies.
Backup Costs: The \"Free\" Lie
AWS gives you "free" backup storage equal to your database size. Sounds great until you hit production. GDPR compliance requires 7-year retention. Our lawyers demanded point-in-time recovery for 90 days. Disaster recovery needs copies in multiple regions.
Result: almost ten cents per GB per month for way more backups than our actual database. Our database is maybe 1TB. Backups cost us like 300 bucks a month for shit our lawyers say we have to keep. GDPR compliance alone requires expensive backup strategies.
Multi-AZ: Paying Double for Not Being Stupid
Production databases need high availability. AWS charges you exactly double everything for Multi-AZ deployment. Our $500/month database became $1,000/month with redundancy. Because apparently not losing data when one server dies is a premium feature.
Microservice Hell: Death by a Thousand Cuts
Our auth service hits the user database like 50 times per request - terrible design, I know. Each service lives in a different AZ, and AWS charges a penny per GB just for them to talk to each other. Sounds like nothing until you realize we're pushing maybe 2TB a month between our own services.
That's like 200 bucks a month for our own shit to communicate. In our own supposedly "managed" infrastructure.
Instance Sizing: Pay for What You Don't Use
Need 12GB RAM? AWS sells 16GB. Need 20 CPUs? Buy 32. We're wasting maybe 30-40% of our resources, probably more when you factor in all the stuff we forgot we're even paying for.
The waste compounds: bigger instances need bigger storage, more IOPS, higher backup costs. AWS designed their instance sizes to maximize your bill, not your efficiency. Right-sizing becomes impossible when they control the hardware configurations.
Migration Costs: The Final Insult
Moving off AWS was expensive as hell: data export fees hit us for like 15K, consultants cost around 50K because none of us had done this before. Plus we broke auth twice during cutover and lost some sales - hard to tell exactly how much, our analytics were fucked during the transition.
Total damage: like 78K or maybe 82K - hard to pin down exactly. AWS makes leaving expensive enough that most people just keep paying.
What It Actually Costs
SimplyBlock ran the numbers on a 3TB PostgreSQL setup over 3 years:
- AWS RDS: $90,402
- Self-managed on Kubernetes: $46,759
- You're paying almost double for convenience
That's just the obvious costs. The hidden savings from escaping AWS:
- No more overprovisioned instances: ~$3,000/year saved
- Actual control over data transfer: ~$2,000/year saved
- Right-sized resources: ~$2,375/year saved
- Multiple vendor options for pricing leverage: ~$5,000/year
Real annual savings: $12,375
3-year difference: $80K+
We could hire a full-time database engineer for less than the AWS convenience tax.
When AWS Controls Your Tech Stack
Missing Extensions We Actually Need
AWS RDS doesn't support pg_ivm for incremental views or zombodb for Elasticsearch integration. We had to rewrite our analytics pipeline because AWS decided these extensions were too niche.
Result: 3 weeks of engineering time wasted and a slower system than what we originally designed.
Debugging Black Boxes
When our queries started timing out, AWS support told us to "optimize our application." No access to PostgreSQL logs, no visibility into lock contention, no control over vacuum settings.
We ended up hiring a consultant for $200/hour to tell us what AWS could see but wouldn't share. Turns out their default config was garbage for our workload. The fix? Change one parameter that AWS had locked away from us. One setting. Cost us $200/hour to learn that.
Waiting for Features Like It's 2010
PostgreSQL 15 has parallel query improvements that would cut our report generation time in half. AWS RDS? Still on PostgreSQL 14 like 8 months after the release.
When you're stuck on AWS timelines, your competitors using vanilla PostgreSQL can ship faster than you. That's some backwards-ass cloud convenience right there.
Hit the Ceiling, Open Your Wallet
Need more than 40,000 connections? AWS says upgrade to a bigger instance. Never mind that we only need connection pooling, not 64 more CPU cores.
Their solution to every limit is "pay more." We hit this during Black Friday when our connection pool maxed out at exactly 39,999 connections and started dropping user sessions. Of course this happened during our peak traffic. AWS support's brilliant solution? Upgrade to an instance that costs 3x more just to get connection pooling that any decent database setup has by default.
Our solution was to finally migrate off.
When to Stay vs When to Run
Use AWS RDS When:
- You're a startup that needs to ship fast and figure out scaling later
- Your team doesn't know the difference between VACUUM and ANALYZE
- You're in a compliance-heavy industry where AWS certifications matter
- Your app is simple CRUD with predictable traffic
Escape When:
- You're spending more on databases than engineering salaries
- You need PostgreSQL extensions that AWS blocks
- Your team can spell "Kubernetes" without help
- AWS limits are blocking actual product features
The Migration Decision
Look at Basecamp - they didn't bail on AWS because they suddenly got allergic to convenience. They left because they realized they were basically funding their competitors with what they were overpaying.
We stayed on RDS for 3 years longer than we should have because migration seemed scary. Turns out, paying AWS like 160-something thousand over what we budgeted was way fucking scarier.
If you're reading this and your AWS bill makes you wince, start planning your exit now. It only gets more expensive the longer you wait.