Skip to main content

AWS RDS and Aurora Cost Optimization Strategies

About the author: I'm Charles Sieg, a cloud architect and platform engineer who builds apps, services, and infrastructure for Fortune 1000 clients through Vantalect. If your organization is rethinking its software strategy in the age of AI-assisted engineering, let's talk.

Database costs are the second largest line item on most AWS bills I review, right behind compute. The problem is that RDS and Aurora pricing has enough moving parts to keep teams overspending for years without realizing it. Instance hours, storage, I/O operations, backup retention, snapshots, data transfer, Extended Support surcharges. Each component has its own optimization lever, and most teams only pull one or two of them. After years of running production databases on AWS and auditing bills across dozens of accounts, I have a reliable playbook for cutting RDS and Aurora spend by 40-65% without sacrificing availability or performance. This article lays out that playbook: every strategy, the math behind it, and the operational tradeoffs you need to understand before applying each one.

Anatomy of an RDS/Aurora Bill

Before optimizing anything, you need to understand where the money goes. RDS and Aurora bills decompose into six cost components, and most teams dramatically underestimate the contribution of the bottom four.

Cost Components

ComponentRDS StandardAurora StandardAurora I/O-OptimizedTypical Bill Share
Instance computePer-hour by instance classPer-hour by instance classPer-hour (30% higher)40-60%
StorageProvisioned GB/month$0.10/GB-month (auto-grows)$0.225/GB-month10-20%
I/O operationsIncluded in provisioned IOPS or gp3$0.20/million requestsIncluded5-25%
Backup storageFree up to 100% of DB sizeFree up to 100% of DB sizeFree up to 100% of DB size5-15%
Data transferStandard AWS ratesStandard AWS ratesStandard AWS rates3-10%
Snapshots (manual)$0.095/GB-month$0.021/GB-month (incremental)$0.021/GB-month2-10%

The instance compute line dominates, which is why Reserved Instances and Savings Plans get all the attention. That focus is correct for the first optimization pass. After that, I/O costs on Aurora Standard clusters and snapshot accumulation become the silent budget killers.

Reading Your Cost Explorer

Filter Cost Explorer by service (RDS) and then group by usage type. The usage type strings decode as follows: InstanceUsage is compute, StorageIOUsage is I/O, StorageUsage is provisioned storage, BackupUsage is backup and snapshot storage. If StorageIOUsage exceeds 25% of your total Aurora spend, that is your signal to evaluate I/O-Optimized. I have seen accounts where I/O was 40% of the bill and the team had no idea.

Commitment Discounts: Reserved Instances and Savings Plans

The single largest cost reduction for any steady-state database workload comes from commitment discounts. On-demand pricing is the sticker price. You should never pay it for production databases that run 24/7.

Reserved Instances

RDS Reserved Instances lock in a specific instance class, engine, and region for a one-year or three-year term. The discount scales with commitment depth.

TermPayment OptionDiscount vs. On-DemandFlexibility
1-yearNo Upfront~20%Locked to instance family, region, engine
1-yearPartial Upfront~32%Same
1-yearAll Upfront~36%Same
3-yearNo Upfront~37%Same
3-yearPartial Upfront~55%Same
3-yearAll Upfront~66%Same

The three-year All Upfront discount is aggressive. For a db.r7g.2xlarge Aurora PostgreSQL instance in us-east-1, on-demand pricing runs roughly $1.57/hour ($1,145/month). A three-year All Upfront RI drops that to approximately $0.53/hour ($387/month). That is $758/month in savings per instance. Multiply across a fleet of ten instances and you save $90,960 per year.

RIs apply within an instance family across sizes through flexible sizing. A reservation for a db.r7g.2xlarge can cover two db.r7g.xlarge instances or one db.r7g.4xlarge at half coverage. This flexibility within a family is underused.

Database Savings Plans

AWS launched Database Savings Plans as an alternative to RIs. You commit to a fixed dollar-per-hour spend for a one-year term and receive automatic discounts across Aurora, RDS, DynamoDB, ElastiCache, DocumentDB, Neptune, Keyspaces, Timestream, and DMS.

AttributeReserved InstancesDatabase Savings Plans
Max discountUp to 66% (3-year All Upfront)Up to 20% (1-year)
Term options1-year or 3-year1-year only
Engine flexibilityLockedAny supported engine
Instance family flexibilityWithin same family (size flex)Any family (gen 7+)
Region flexibilityLockedAny region
Supported familiesAllGeneration 7+ only (db.r7g, db.m7g, etc.)

The tradeoff is clear: Database Savings Plans offer far more flexibility at a shallower discount. A 20% blanket discount that follows you across engine changes, region migrations, and instance family swaps has real value for teams whose database fleet is evolving. For stable production workloads that will run the same instance class for three years, RIs still win on raw savings.

My recommendation: use three-year RIs for your stable production cores (the databases that never change), and layer Database Savings Plans on top for the variable portion of your fleet.

Commitment Strategy Decision Tree

flowchart TD
    A[Database
Workload] --> B{Stable instance
class for 3+ years?} B -->|Yes| C{Budget for
upfront payment?} C -->|Yes| D[3-Year All Upfront RI
Up to 66% savings] C -->|No| E[3-Year No Upfront RI
~37% savings] B -->|No| F{On generation 7+
instance family?} F -->|Yes| G[Database Savings Plan
~20% savings + flexibility] F -->|No| H{Plan to upgrade
within 1 year?} H -->|Yes| I[1-Year RI on current
then Savings Plan after upgrade] H -->|No| J[1-Year RI
~36% savings]
Commitment discount decision tree for RDS and Aurora

Aurora I/O-Optimized vs. Standard

This is the most impactful single switch you can make on an existing Aurora cluster, and most teams do not know it exists.

How It Works

Aurora Standard charges separately for I/O operations at $0.20 per million requests. Aurora I/O-Optimized eliminates I/O charges entirely but raises instance compute costs by 30% and storage costs from $0.10/GB-month to $0.225/GB-month.

The Break-Even Math

The crossover point is straightforward: if your I/O costs exceed roughly 25% of your total Aurora bill, I/O-Optimized saves money.

Monthly Aurora SpendI/O as % of BillStandard TotalI/O-Optimized TotalSavings
$10,00015%$10,000$11,050-$1,050 (more expensive)
$10,00025%$10,000$9,750$250 (break-even zone)
$10,00035%$10,000$8,450$1,550 (15.5%)
$10,00050%$10,000$6,500$3,500 (35%)

How to Measure Your I/O Spend

Pull these CloudWatch metrics for your Aurora cluster over a 30-day window: VolumeReadIOPs and VolumeWriteIOPs. Sum them, multiply by $0.20 per million, and compare against your total Aurora bill from Cost Explorer. AWS published a detailed methodology for this calculation in their database blog.

Operational Considerations

You can switch between Standard and I/O-Optimized with zero downtime. The catch: after switching to I/O-Optimized, you must wait 30 days before switching back. Test in a non-production cluster first. Performance, latency, and throughput remain identical between the two configurations. The only difference is billing.

Right-Sizing with Compute Optimizer

Oversized database instances are the most common waste pattern I encounter. Teams provision for peak load, then peak load turns out to be 20% of the instance capacity. The instance runs at 15-25% CPU utilization for months. Nobody notices because the database works fine.

Using AWS Compute Optimizer

AWS Compute Optimizer analyzes 14 days of CloudWatch metrics (CPU, memory, network, IOPS) and recommends right-sized instance classes. It supports Aurora MySQL, Aurora PostgreSQL, RDS MySQL, and RDS PostgreSQL.

MetricOverprovisioned SignalAction
CPU utilizationConsistently under 30%Downsize instance class
Freeable memoryConsistently over 60% freeConsider smaller memory class
Read/Write IOPSWell below provisioned IOPSSwitch to gp3 or reduce provisioned IOPS
Network throughputUnder 20% of instance maxSmaller instance handles it

Graviton Migration

Switching from Intel-based instances (db.r6i, db.m6i) to Graviton instances (db.r7g, db.m7g) delivers 20-30% better price-performance with zero application changes. RDS runs the same database engine on both platforms. The migration is a modify-instance operation with a brief maintenance window.

InstanceArchitectureOn-Demand $/hr (us-east-1)Relative Performance
db.r6i.xlargeIntel x86$0.58Baseline
db.r6g.xlargeGraviton2 ARM$0.48~10% better
db.r7g.xlargeGraviton3 ARM$0.52~35% better

The db.r7g costs 10% less than db.r6i while delivering 35% better throughput. Combined with right-sizing (dropping from 2xlarge to xlarge after confirming the Graviton instance handles the load), teams routinely see 33-50% compute savings.

Right-Sizing Workflow

flowchart TD
    A[Enable Compute
Optimizer] --> B[Wait 14 days
for data collection] B --> C[Review
recommendations] C --> D{Graviton
instance available?} D -->|Yes| E[Migrate to Graviton
in maintenance window] D -->|No| F[Downsize within
current family] E --> G[Monitor 7 days
post-migration] F --> G G --> H{Performance
acceptable?} H -->|Yes| I[Apply commitment
discount to new size] H -->|No| J[Roll back one
size larger]
Database right-sizing workflow

Aurora Serverless v2: When It Saves Money

Aurora Serverless v2 bills by the Aurora Capacity Unit (ACU) per second, at approximately $0.12 per ACU-hour in us-east-1. The capacity scales between a minimum and maximum you configure, and it now supports scaling to 0 ACUs with automatic pause and resume.

Where Serverless v2 Wins

Serverless v2 saves money on workloads with high variability or extended idle periods. Dev/test environments, staging databases, internal tools with business-hours-only traffic, and event-driven applications all benefit.

Workload PatternProvisioned Cost (db.r7g.large)Serverless v2 Cost (0.5-4 ACU)Savings
24/7 steady load at 60% capacity~$370/month~$350/month5%
Business hours only (10h/day)~$370/month~$175/month53%
Spikey (2h peak, 22h idle)~$370/month~$85/month77%
Dev/test (scale to zero overnight)~$370/month~$45/month88%

Scale-to-Zero Mechanics

When no connections exist for a configurable timeout period (minimum 300 seconds, maximum 86,400 seconds), the instance pauses automatically. You pay nothing for compute while paused. Storage charges continue. Resume takes a few seconds for a warm instance and up to 30 seconds or longer if the instance has been paused for over 24 hours (Aurora puts it into a deeper sleep state).

When Serverless v2 Costs More

Steady, high-throughput production workloads that run at consistent capacity 24/7 will cost more on Serverless v2 than on a right-sized provisioned instance with an RI. At sustained 8 ACUs (roughly equivalent to a db.r7g.large), Serverless v2 costs about $0.96/hour vs. $0.48/hour for a provisioned instance. The per-ACU pricing carries a premium for the elasticity. Use provisioned instances with commitment discounts for steady-state production. Use Serverless v2 for everything else.

Snapshot and Backup Hygiene

Snapshot costs creep up silently. I have audited accounts where manual snapshot storage exceeded the total size of all active databases. The culprits: snapshots from deleted instances that nobody cleaned up, daily manual snapshots with no retention policy, and duplicate backups from both RDS native backup and AWS Backup running on the same cluster.

Automated Cleanup Strategy

  1. Tag every manual snapshot with the creating team, purpose, and expected retention date.
  2. Run a monthly Lambda function that deletes manual snapshots older than your retention policy (30-90 days for most teams).
  3. Audit for orphaned snapshots tied to instances that no longer exist. AWS does not delete these automatically.
  4. Consolidate backup tools. If you run both RDS automated backups and AWS Backup on the same cluster, you pay for both. Pick one.
  5. Set automated backup retention to the minimum your compliance requires. The default 7 days is fine for most workloads. Going to 35 days quadruples your backup storage.

Backup Cost Math

Aurora backup storage is free up to 100% of your total database storage. A 500 GB Aurora cluster gets 500 GB of free backup storage. Beyond that, you pay $0.021/GB-month. For standard RDS, additional backup storage costs $0.095/GB-month. A 1 TB RDS instance with 3 TB of accumulated snapshots pays $190/month just for the excess 2 TB.

Extended Support: The Hidden Surcharge

AWS introduced RDS Extended Support for database engine versions that have passed their community end-of-life date. If your Aurora or RDS cluster runs a version enrolled in Extended Support, you pay a per-vCPU-hour surcharge on top of your normal instance costs.

Extended Support Pricing

PeriodSurcharge (per vCPU-hour)Annual Cost (16 vCPU instance)
Year 1$0.100~$14,016
Year 2$0.200~$28,032
Year 3$0.200~$28,032

For a single db.r7g.4xlarge (16 vCPUs) running in Extended Support year two, the surcharge alone is $28,032 per year. That is often more than the base instance cost. Multiply across a fleet of databases and the numbers get alarming fast.

Avoiding Extended Support Charges

Upgrade your engine versions before they enter Extended Support. Aurora MySQL 2 entered Extended Support in November 2024, with charges starting December 2024. Aurora MySQL 3 and Aurora PostgreSQL 15+ remain in standard support. Track the release calendars and plan major version upgrades as part of your quarterly maintenance cycle. The upgrade effort is a fraction of the Extended Support cost.

When provisioning new instances, explicitly disable Extended Support enrollment: set --engine-lifecycle-support open-source-rds-extended-support-disabled in your CLI or CloudFormation templates. This prevents accidentally running into surcharges if you forget to upgrade.

Multi-AZ and Read Replica Optimization

High availability is non-negotiable for production databases, but the cost of redundancy varies significantly based on your architecture choices.

Aurora vs. RDS Multi-AZ

Aurora handles Multi-AZ differently than standard RDS. In Aurora, every read replica serves as a failover target. You do not pay for a separate standby instance that sits idle. In standard RDS Multi-AZ, the standby is a full instance that consumes compute resources but accepts no read traffic.

ConfigurationRDS StandardAurora
Multi-AZ standbyFull instance cost, no read trafficRead replica doubles as failover target
Read replicasSeparate from Multi-AZ standbySame instances, any can become primary
Failover time60-120 secondsTypically under 30 seconds
Cost for HA + 1 read replica3x instance cost (primary + standby + replica)2x instance cost (primary + replica/failover)

For workloads that need both high availability and read scaling, Aurora saves you an entire instance worth of compute cost compared to standard RDS. On a db.r7g.2xlarge, that is $1,145/month.

Read Replica Right-Sizing

Read replicas do not need to match the primary instance size. If your read traffic is lighter than write traffic (common for OLTP workloads), size your read replicas one or two classes smaller. A db.r7g.2xlarge primary with db.r7g.large read replicas cuts your replica cost by 75%.

Monitor replica lag. If lag stays under 20ms with the smaller instance, you sized it correctly. If lag climbs during peak periods, step up one size.

Key Takeaways

  1. Start with commitment discounts. Three-year All Upfront RIs deliver up to 66% off on-demand pricing. Every production database running 24/7 without a commitment discount is burning money.
  2. Check your I/O-to-compute ratio. If Aurora I/O charges exceed 25% of your total spend, switch to I/O-Optimized. The switch takes minutes and requires zero downtime.
  3. Migrate to Graviton. The db.r7g family delivers 35% better throughput than Intel equivalents at 10% lower cost. No application changes required. This is free money.
  4. Use Serverless v2 for variable workloads. Dev/test, staging, and low-traffic internal tools should scale to zero when idle. Paying for a provisioned instance that sits idle 16 hours a day is a 67% waste.
  5. Upgrade engine versions before Extended Support. The per-vCPU surcharges in Extended Support year two can exceed the base instance cost. Upgrading is cheaper than paying the tax.
  6. Clean up snapshots monthly. Orphaned snapshots from deleted instances and expired backups accumulate storage costs indefinitely. Automate the cleanup.
  7. Choose Aurora over standard RDS when read replicas are needed. Aurora's unified read replica and failover architecture eliminates the cost of a dedicated standby instance.

For related cost optimization strategies, see AWS S3 Cost Optimization: The Complete Savings Playbook, AWS EC2 Cost Optimization: Five Strategies That Cut Compute Bills in Half, and Cutting AWS Egress Costs with a Centralized VPC and Transit Gateway. For a deep dive on Aurora's architecture itself, including multi-region patterns, see AWS Aurora: Getting Close to Multi-Region Active/Active and MySQL vs. PostgreSQL on Aurora: An Architecture Deep Dive.

Additional Resources

Let's Build Something!

I help teams ship cloud infrastructure that actually works at scale. Whether you're modernizing a legacy platform, designing a multi-region architecture from scratch, or figuring out how AI fits into your engineering workflow, I've seen your problem before. Let me help.

Currently taking on select consulting engagements through Vantalect.