GreenOps

© 2026 GreenOps. All rights reserved.

npx greenops-scanBlogPrivacy PolicyTermsRefund PolicyMethodology
GreenOps
ProblemSolutionPricingBlognpx greenops-scan
Sign in / Sign upFree audit
← Back to blog
GreenOps dashboard preview

Why Is My RDS Bill So High? Five Patterns to Audit This Week

The fastest ways an RDS bill gets away from you

RDS feels like a safe, managed expense until the line item is suddenly the second or third biggest thing on your AWS bill. Databases do not scale horizontally on demand, they run 24/7, and most teams are cautious about touching them. That caution is healthy, but it also means waste hides in plain sight for months.

This post is a short, practical audit list. If your RDS bill is climbing, check these five patterns first. None of them require downtime or changes to application code. They are read-only checks that help you decide whether a resource is actually earning its keep.

1. Idle instances

The most common RDS waste is a database that is running but no longer used. Staging copies left after a release, old test environments, and proof-of-concept databases all tend to survive longer than the projects that created them.

A stopped RDS instance is not enough. After seven days AWS automatically restarts it, so "stopped" is not a permanent solution unless you also terminate or snapshot it.

What to check:

  • DatabaseConnections at zero or near-zero for more than two weeks.
  • CPUUtilization and ReadLatency/WriteLatency flat at baseline.
  • FreeableMemory and FreeLocalStorage suggesting no meaningful workload.

If the database has no connections and no query activity, snapshot it and terminate it. A db.t3.large running in us-east-1 is roughly $115/month before storage. Multiply that across a few abandoned databases and the cost becomes obvious.

2. Oversized instance families

Teams often pick an instance class once and never revisit it. The class that made sense during a launch, or the one copied from a reference architecture, may be two or three sizes above what the workload needs today.

Two signals matter:

  • Sustained low CPUUtilization and FreeableMemory over 30 days.
  • An Intel-based class like db.r5 or db.m5 where a Graviton-based db.r6g or db.t4g would cost less for the same or better performance.

A reasonable threshold is a 30-day average CPU under 25% and memory pressure below 70%. That does not mean the instance is automatically wrong — some workloads need headroom — but it is a prompt to review the class and family, not just the size.

Switching to Graviton is often the lowest-risk win. A db.r6g.large is typically priced lower than a db.r5.large and can outperform it for many relational workloads.

3. Unused read replicas

Read replicas are easy to create and easy to forget. A replica added for reporting, analytics, or a one-time migration may keep replicating long after the consumer stopped connecting.

Check the same metrics as idle instances, but on each replica:

  • DatabaseConnections at or near zero.
  • ReplicaLag still ticking along, which means replication traffic is active and the replica is costing you instance hours and I/O.
  • No security-group or application traffic actually reaching the replica endpoint.

A zero-connection replica is pure waste. If you do not need it, delete it after a final snapshot. If you do need it for a scheduled report, consider starting it on demand rather than leaving it running 24/7.

4. Old snapshots and over-retained backups

RDS snapshots do not look expensive in isolation, but they accumulate. Manual snapshots created during migrations, final snapshots from deleted instances, cross-region copies, and AWS Backup plans with indefinite retention can all quietly become a storage line item that no one reviews.

In us-east-1, snapshot storage is roughly $0.05 per GB-month. A few hundred gigabytes of stale snapshots is $10–$50 a month; at the terabyte scale it is a meaningful bill.

Audit these:

  • Manual snapshots older than 30–90 days that have no owner or recovery runbook.
  • Automated backups with a retention window longer than your compliance requirement.
  • Cross-region or cross-account snapshot copies that outlived the project.
  • AWS Backup vaults where RDS backups are retained indefinitely.

Keep what you are required to keep. Delete or expire the rest. Snapshot deletion is one of the few RDS cost wins that has zero performance impact.

5. Missing reserved capacity for steady workloads

If a database has been running at a predictable size for more than a year, on-demand pricing is almost certainly more expensive than it needs to be. RDS Reserved Instances can cut 30–50% off the instance cost for a steady commitment.

What to check:

  • Databases that have run the same instance class and size for 12 months or more.
  • No active ReservedDBInstances or Reserved Instance discounts in the AWS Billing console.
  • Workloads that are not candidates for serverless or Aurora scaling because they are always on.

Reserved Instances are not for experimental or seasonal databases. They are for the predictable core: the primary production database, a reporting replica that is always up, or a long-lived middleware database. Start with a one-year, no-upfront reservation to keep the commitment low-risk.

How the patterns add up

PatternWhat to look forRough saving
Idle instancesDatabaseConnections near zero for 2+ weeks$50–$500+/mo per instance
Oversized families30-day CPU <25%, db.r5/db.m5 classes20–40% of instance cost
Unused read replicasZero connections, active ReplicaLagSame as instance cost
Old snapshotsManual/cross-region copies older than 30 days$10–$50 per 100 GB/month
Missing reserved capacitySame class and size for 12+ months30–50% of instance cost

These are ranges, not guarantees. The actual saving depends on the region, instance class, storage, I/O, and any enterprise discount. The point is to turn "why is my RDS bill so high" into a checklist you can run in an hour.

A faster way to run the checklist

You can collect all of these signals manually from CloudWatch, the RDS console, and the AWS CLI. For a handful of databases that is a reasonable afternoon. For tens of databases across regions and accounts, it becomes a maintenance job of its own.

GreenOps Scan is a free, read-only CLI that does the same check across RDS, EC2, ECS/Fargate, S3, EBS, Lambda, and other services in one pass:

npx greenops-scan

It runs locally, uses a read-only IAM profile, and never modifies your account. Each finding includes the resource, the issue, an estimated monthly cost, and a remediation step you can review before changing anything.

If your RDS bill has become a line item that nobody owns, run the scan this week and turn the suspicion into a short, actionable list.

Try GreenOps Scan →

More posts

View all posts →

Every Finding Now Tells You Which Team, Project, and Stack Owns It

GreenOps Scan now attaches each flagged resource's AWS tags — Project, Environment, Team, even the exact CloudFormation stack and logical ID — straight into every finding, no new IAM permissions required.

Stop Pasting AWS CLI Commands Into Prod — Let Your Agent Fix the Code Instead

GreenOps Scan's new --llm-prompts flag turns every finding into a copy/paste prompt for Copilot, Claude, or Cursor to fix in your actual Terraform/CDK/CloudFormation source — no more IaC drift from hand-run remediation commands.

The Bill You Don't See Coming: AWS Extended Support Surcharges

GreenOps Scan now proactively detects deprecated Lambda runtimes, RDS/Aurora/DocumentDB engines, EKS versions, ElastiCache Redis, and OpenSearch domains before AWS starts billing you extra for staying on them.