Amazon Aurora offers two storage billing modes: Standard and I/O-Optimized. Standard charges per I/O request on top of storage; I/O-Optimized charges a higher storage rate but zero per-request fees. Choosing wrong costs thousands of dollars a month.
db.r6g.8xlarge with 10 TB storage, that crossover hits at roughly 20 billion I/O requests per month — above that, I/O-Optimized saves $2,750–$8,750/month.
How Aurora Storage Billing Works
Aurora separates compute (instance hours) from storage. Storage billing has two components that differ between modes:
| Component | Standard | I/O-Optimized |
|---|---|---|
| Storage (per GB-month) | $0.10 | $0.225 |
| I/O requests (per million) | $0.20 | $0.00 |
| Backup storage | $0.021/GB-month | $0.021/GB-month |
The break-even formula tells you at what I/O volume the two modes cost the same:
Break-even I/O (millions/month) = Storage_GB × 0.625
For 10 TB = 10,240 GB:
Break-even = 10,240 × 0.625 = 6,400 million req/month = ~6.4 billion req/monthAbove the break-even point, I/O-Optimized is cheaper. Below it, Standard is cheaper.
Worked Example: db.r6g.8xlarge with 10 TB Storage
Let's price three real-world I/O scenarios for a db.r6g.8xlarge Aurora MySQL cluster with 10 TB of allocated storage (us-east-1 pricing).
Instance and Storage Baseline
| Resource | Detail | Monthly Cost |
|---|---|---|
| db.r6g.8xlarge (On-Demand) | 32 vCPU, 256 GB RAM | $3,744 |
| Storage — Standard | 10,240 GB × $0.10 | $1,024 |
| Storage — I/O-Optimized | 10,240 GB × $0.225 | $2,304 |
| Storage cost difference | I/O-Optimized premium | +$1,280/mo |
Scenario 1: Moderate I/O — 5 Billion Requests/Month
This represents a busy OLTP workload with moderate read/write mix. Think: 2,000 IOPS sustained average.
| Cost Item | Standard | I/O-Optimized |
|---|---|---|
| Compute (db.r6g.8xlarge) | $3,744 | $3,744 |
| Storage | $1,024 | $2,304 |
| I/O charges (5,000M × $0.20) | $1,000 | $0 |
| Total | $5,768 | $6,048 |
Verdict: Standard wins by $280/month ($3,360/year). At 5B req/month you have not yet crossed the 6.4B break-even for 10 TB.
Scenario 2: High I/O — 20 Billion Requests/Month
Heavy OLTP with frequent small reads — analytics mixed with transactional, ~8,000 IOPS average. Common on SaaS platforms with row-level access patterns.
| Cost Item | Standard | I/O-Optimized |
|---|---|---|
| Compute (db.r6g.8xlarge) | $3,744 | $3,744 |
| Storage | $1,024 | $2,304 |
| I/O charges (20,000M × $0.20) | $4,000 | $0 |
| Total | $8,768 | $6,048 |
Verdict: I/O-Optimized saves $2,720/month ($32,640/year).
Scenario 3: Very High I/O — 50 Billion Requests/Month
Extreme read-heavy workload — reporting database, high-frequency trading, or a multi-tenant SaaS with ~20,000 IOPS sustained. This is where I/O-Optimized pays for itself massively.
| Cost Item | Standard | I/O-Optimized |
|---|---|---|
| Compute (db.r6g.8xlarge) | $3,744 | $3,744 |
| Storage | $1,024 | $2,304 |
| I/O charges (50,000M × $0.20) | $10,000 | $0 |
| Total | $14,768 | $6,048 |
Verdict: I/O-Optimized saves $8,720/month ($104,640/year).
How to Measure Your Current I/O Rate
Before switching, baseline your actual I/O from CloudWatch. Aurora reports read and write I/O as separate metrics.
# Get Aurora I/O metrics for last 30 days (sum)
aws cloudwatch get-metric-statistics --namespace AWS/RDS --metric-name VolumeReadIOPs --dimensions Name=DBClusterIdentifier,Value=your-cluster-id --start-time $(date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%SZ) --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) --period 2592000 --statistics Sum --region us-east-1
# Repeat for VolumeWriteIOPs
aws cloudwatch get-metric-statistics --namespace AWS/RDS --metric-name VolumeWriteIOPs --dimensions Name=DBClusterIdentifier,Value=your-cluster-id --start-time $(date -u -d '30 days ago' +%Y-%m-%dT%H:%M:%SZ) --end-time $(date -u +%Y-%m-%dT%H:%M:%SZ) --period 2592000 --statistics Sum --region us-east-1Add VolumeReadIOPs + VolumeWriteIOPs to get total monthly I/O. Compare against your break-even:
storage_gb = 10240 # 10 TB
break_even_millions = storage_gb * 0.625
break_even_billions = break_even_millions / 1000
print(f"Break-even: {break_even_billions:.1f}B requests/month")
# → Break-even: 6.4B requests/monthDecision Framework
| Condition | Recommendation |
|---|---|
| I/O cost < 25% of total Aurora bill | Stay on Standard |
| I/O cost = 25–40% of total Aurora bill | Monitor; approaching break-even |
| I/O cost > 40% of total Aurora bill | Switch to I/O-Optimized immediately |
| Dev/staging/low-traffic cluster | Always Standard (I/O is negligible) |
| Write-heavy ETL or bulk load cluster | Switch to I/O-Optimized during load window |
How to Switch Storage Modes
Switching between Standard and I/O-Optimized is non-disruptive and takes effect within a few minutes. No reboot required.
# Switch an Aurora cluster to I/O-Optimized
aws rds modify-db-cluster --db-cluster-identifier your-cluster-id --storage-type aurora-iopt1 --apply-immediately --region us-east-1
# Switch back to Standard
aws rds modify-db-cluster --db-cluster-identifier your-cluster-id --storage-type aurora --apply-immediately --region us-east-1# Verify current storage type
aws rds describe-db-clusters --db-cluster-identifier your-cluster-id --query 'DBClusters[0].StorageType' --output text
# → aurora-iopt1 (I/O-Optimized) or aurora (Standard)storage_type = "aurora-iopt1" in your aws_rds_cluster resource. This triggers an in-place modification with no downtime.
When Standard Is Always Right
- Development and staging: I/O is low and unpredictable — Standard costs less
- Small databases (<500 GB): Break-even I/O is low, but if your workload is read-light, Standard is still cheaper
- Batch/scheduled jobs: Bursty but infrequent I/O — average IOPS over the month stays low
- Newly launched products: Traffic is unpredictable; monitor for 60–90 days before committing
When I/O-Optimized Is Always Right
- High-traffic SaaS with row-level reads: Every page load = dozens of DB reads
- Multi-tenant platforms: Aggregate I/O across thousands of tenants is enormous
- Real-time analytics on Aurora: Parallel query reads huge amounts of data
- Aurora Global Database with cross-region reads: Secondary regions charge I/O on replication writes
- Write-heavy CDC sources: Debezium or SeaTunnel polling binlog = sustained write I/O
Key Takeaways
- Break-even formula: I/O (millions/month) = Storage_GB × 0.625 — above this, switch to I/O-Optimized
- For 10 TB + db.r6g.8xlarge: break-even is ~6.4B req/month; I/O-Optimized saves up to $8,720/month at 50B req/month
- Use
VolumeReadIOPs + VolumeWriteIOPsfrom CloudWatch to baseline actual I/O over 30 days before deciding - Switching modes is non-disruptive — no reboot, no downtime, takes effect in minutes
- I/O-Optimized has a 30-day minimum — plan your switch timing to avoid paying the premium during known low-traffic months