Problem Summary
RDS costs are notoriously easy to accidentally double or triple because several features that sound minor Multi-AZ, Enhanced Monitoring, Performance Insights storage, storage autoscaling each have significant cost implications. Unlike EC2 where you can see the instances, RDS cost changes are often invisible in the console unless you know exactly where to look. A single checkbox change in the AWS console can permanently double your database bill.
Symptoms
- Cost Explorer shows RDS spend doubled or tripled with no change in database query volume
- Storage line item in the RDS bill increased substantially beyond your database size growth
- A new 'RDS Multi-AZ' usage type appears in Cost Explorer that was not present before
- Aurora Serverless costs are much higher than expected based on your workload
- Backup storage charges are higher than the size of your database
- Enhanced Monitoring line item appeared recently in the bill
- RDS snapshot count in the console is much higher than expected
- Instance class shows a larger type than you intended to provision
Business Impact
RDS is the most cost-sensitive AWS service for most application teams because databases cannot be trivially scaled down without migration effort. An accidental Multi-AZ enable on a db.r5.4xlarge doubles the instance cost from roughly $1,000/month to $2,000/month permanently until you disable it. Unlike EC2, you cannot simply terminate an RDS instance to save money modifications require maintenance windows and can cause brief interruptions.
Root Cause
RDS cost spikes most commonly originate from configuration changes rather than traffic growth: Multi-AZ being enabled (doubles instance cost), storage autoscaling triggering during a data import (storage only scales up, never down), backup retention increased from 7 to 35 days (5x more backup storage), Aurora Serverless v2 ACU minimum being set too high, CloudWatch Enhanced Monitoring or Performance Insights long-term storage enabled, or manual snapshots accumulating without any deletion lifecycle.
RDS storage autoscaling only scales UP, never down. If storage autoscaled from 100 GB to 500 GB during a large data import, you will pay for 500 GB of allocated storage permanently even after deleting the imported data. The only way to reduce allocated storage is to snapshot and restore to a new instance.
Diagnosis
Step 1 Inventory All RDS Instances and Their Configuration
Get a complete picture of every RDS instance, its class, Multi-AZ status, storage size, and backup retention. Any of these fields changing unexpectedly is a cost driver.
aws rds describe-db-instances --query 'DBInstances[*].{ID:DBInstanceIdentifier,Class:DBInstanceClass,MultiAZ:MultiAZ,Storage:AllocatedStorage,StorageType:StorageType,BackupRetention:BackupRetentionPeriod,Status:DBInstanceStatus,Engine:Engine}' --output tableStep 2 Check for Accidental Multi-AZ Enable
Multi-AZ doubles the instance cost because AWS runs a synchronous standby replica in another AZ. If MultiAZ is true on instances you expected to be single-AZ, this is likely the cause of the cost increase.
aws rds describe-db-instances --query 'DBInstances[?MultiAZ==`true`].[DBInstanceIdentifier,DBInstanceClass,MultiAZ]' --output tableTo disable Multi-AZ (triggers a brief failover): go to RDS Console → your instance → Modify → Availability & durability → Do not create a standby instance. Apply immediately (or during next maintenance window).
Disabling Multi-AZ on production databases removes your HA protection. Only do this for non-critical databases. For production, keep Multi-AZ and find cost savings elsewhere (instance right-sizing, Reserved Instances).
Step 3 Audit Storage Autoscaling and Allocated Storage
Check the current allocated storage versus how much storage your database is actually using. A large gap indicates storage autoscaling was triggered and the allocated size grew beyond actual needs.
aws rds describe-db-instances --query 'DBInstances[*].[DBInstanceIdentifier,AllocatedStorage,MaxAllocatedStorage]' --output tableaws cloudwatch get-metric-statistics --namespace AWS/RDS --metric-name FreeStorageSpace --dimensions Name=DBInstanceIdentifier,Value=<DB_INSTANCE_ID> --start-time 2026-07-01T00:00:00Z --end-time 2026-07-24T00:00:00Z --period 86400 --statistics Minimum --output tableStep 4 Investigate Aurora Serverless ACU Scaling
Aurora Serverless v2 charges per ACU-hour. If your minimum ACU is set to 8 and you have 3 instances in a cluster (writer + 2 readers), you are paying for at least 24 ACUs continuously at $0.12/ACU-hr = $2,073/month minimum floor, even with no queries.
aws rds describe-db-clusters --query 'DBClusters[?EngineMode==`provisioned`].[DBClusterIdentifier,ServerlessV2ScalingConfiguration]' --output table#!/bin/bash
# Check ACU utilization over the last 7 days
aws cloudwatch get-metric-statistics --namespace AWS/RDS --metric-name ServerlessDatabaseCapacity --dimensions Name=DBClusterIdentifier,Value=${CLUSTER_ID} --start-time "$(date -u -d '7 days ago' +%Y-%m-%dT%H:%M:%SZ)" --end-time "$(date -u +%Y-%m-%dT%H:%M:%SZ)" --period 3600 --statistics Average,Maximum --output tableStep 5 Count and Audit Manual Snapshots
Automated backups are free within the backup retention window but manual snapshots are charged indefinitely at $0.095/GB/month. Teams that create manual snapshots before migrations and never clean them up accumulate hundreds of GB of snapshot storage.
aws rds describe-db-snapshots --snapshot-type manual --query 'DBSnapshots[*].[DBSnapshotIdentifier,DBInstanceIdentifier,SnapshotCreateTime,AllocatedStorage]' --output table | sort -k3Production Failure Scenarios
Scenario 1 Enhanced Monitoring Enabled on Every Instance
CloudWatch Enhanced Monitoring at 1-second granularity costs $0.014 per instance-hour in additional CloudWatch agent costs, plus the log ingestion charges. For 10 RDS instances that is an additional ~$100/month. Check: aws rds describe-db-instances --query 'DBInstances[*].[DBInstanceIdentifier,MonitoringInterval]' a MonitoringInterval of 1 or 5 seconds enables Enhanced Monitoring.
Scenario 2 Backup Retention Increased by Compliance Policy
A compliance team updated the RDS backup retention from 7 days to 35 days across all instances. RDS automated backup storage beyond the instance size is charged at $0.095/GB/month. A 500 GB database with 35 days of retention vs 7 days generates 5x more backup storage cost.
Scenario 3 Instance Class Upgraded and Not Reverted After Load Test
Before a traffic event, the team upgraded from db.r5.2xlarge to db.r5.4xlarge. The event passed, but the downgrade was forgotten. The difference is $0.96/hr vs $1.92/hr $691/month in extra spend for the production instance, doubled again if Multi-AZ is enabled.
Prevention Checklist
- Set MaxAllocatedStorage on storage autoscaling to a reasonable ceiling do not leave it at unlimited
- Audit Multi-AZ status quarterly only enable it on instances where downtime cost exceeds the HA premium
- Set automated snapshot lifecycle: delete manual snapshots older than 30 days with a Lambda cron job
- Configure backup retention at the minimum required by your SLA not the maximum AWS allows
- Review Aurora Serverless v2 minimum ACU settings each ACU-hour costs $0.12 and minimums are always-on costs
- Set Enhanced Monitoring interval to 60 seconds on non-production instances (or disable entirely on dev)
- Purchase RDS Reserved Instances for stable production databases typically 40-60% savings over on-demand
- Use Performance Insights with the free 7-day retention unless you have a specific need for longer retention
- After any performance-related instance class upgrade, add a calendar reminder to evaluate downgrade after 2 weeks
Resolution Summary
Check Multi-AZ status first it is the most common accidental cost doubler. Then review allocated storage vs actual usage for autoscaling events. Check backup retention period and manual snapshot count. For Aurora Serverless, examine ACU minimum settings and recent scaling history. Each of these is a configuration setting that can be changed without data migration.
Lessons Learned
- Multi-AZ is a checkbox in the console but a 100% cost increase document the deliberate decision to enable or disable it
- Storage autoscaling is one-way: design your database storage allocation with growth in mind from the start
- Manual snapshots are permanent by default every team needs a snapshot lifecycle policy
- Aurora Serverless minimum ACU is effectively a reserved compute floor, not a free baseline
- RDS cost changes are configuration changes first, traffic second always check config before traffic when investigating
Conclusion
RDS cost management requires understanding that most of the cost levers are configuration checkboxes rather than usage metrics. Unlike EC2 where you can count instances, RDS hides its cost multipliers in feature settings that are easy to enable and hard to notice. Build a monthly RDS configuration audit into your FinOps routine: check Multi-AZ, storage autoscaling triggers, backup retention, snapshot counts, and Enhanced Monitoring on every instance. That 20-minute check pays for itself within the first month.