RDS instance cost: Multi-AZ, io1 IOPS, Graviton and idle instances
Short answer: an RDS instance bills for every hour it exists, doubled if it is Multi-AZ, plus storage and any provisioned IOPS. Most avoidable spend is a standby nobody needs, per-IOPS charges a cheaper volume type includes, an older instance family, and databases that serve nobody.
What it costs (illustrative)
Instance hours: class price times about 730 hours a month. Multi-AZ doubles it and doubles the storage.
Storage: gp2 and gp3 about $0.115 per GB-month; io1 about $0.125 per GB-month plus about $0.10 per provisioned IOPS per month.
These are US East list prices for MySQL, MariaDB and PostgreSQL; the tool lets you edit every price.
Where the money is
Multi-AZ outside production: a synchronous standby for a dev or staging database.
io1 provisioned IOPS: 10,000 IOPS is about $1,000 a month per zone before storage, and gp3 includes 3,000 (under 400 GB) or 12,000 (400 GB and over) at no per-IOPS charge.
x86 classes: m5, r5 and t3 have Graviton twins (m6g, r6g, t4g) that list lower for the same size.
Idle instances: a retired service or sandbox with near-zero CPU that still bills every hour.
Upper bounds only: one size down on a low-CPU instance, and a one-year Reserved Instance. The advisor shows them but never counts them in the saving, because they depend on peaks, memory and a commitment.
Measure and fix
Instances: aws rds describe-db-instances --query 'DBInstances[].[DBInstanceIdentifier,DBInstanceClass,Engine,MultiAZ,StorageType,AllocatedStorage,Iops]' --output text
CPU: CloudWatch CPUUtilization averaged over 30 days per instance; peak ReadIOPS + WriteIOPS before touching io1.
Paste rows into the advisor or run node cli.mjs analyze instances.csv. It prints an aws rds modify-db-instance command per fix.
Change one instance at a time on a copy or in a maintenance window; class and storage changes restart or reconfigure a live database.
Questions
Should dev and staging RDS databases be Multi-AZ?
Usually not. Multi-AZ bills the instance and its storage twice for a synchronous standby that only matters if production traffic must survive a zone failure. A dev or staging database can be single-AZ and restored from a snapshot if the zone fails.
Can gp3 replace io1 on RDS?
Often, yes. gp3 includes a baseline of 3,000 IOPS below 400 GB and 12,000 at 400 GB and above with no per-IOPS charge, while io1 bills every provisioned IOPS every month. If your provisioned IOPS is inside that baseline and CloudWatch shows peaks under it, the per-IOPS charge is avoidable. Verify latency after the change.
Is a Graviton RDS instance really cheaper?
For the same size, the Graviton families (t4g, m6g, r6g) list below their x86 twins (t3, m5, r5) for MySQL, MariaDB and PostgreSQL. Changing the class restarts the instance and needs an engine version that supports it, so test on a restored copy first.