Chapter 57 · Amazon Aurora MySQL
Subchapter 57.10
references/io-optimized-pricing-tables.mdMarkdown6 KBView on GitHub
Companion to instructions.md. Use these when you can’t run the script and must compute inline. Worked examples are in .
| Item | Standard | I/O-Optimized | Delta |
|---|---|---|---|
| Compute (per instance-hour) | See ../serverless-advisory/formulas-and-examples.md §Provisioned compute pricing | +30% on compute | Interaction with commitments: RIs cover I/O-Optimized compute in full (including the 30% premium) — an I/O-Optimized instance consumes ~1.3x the normalized RI units of the equivalent Standard instance, so buy ~30% more RIs to fully cover; no portion is forced to on-demand. DSP also discounts the full I/O-Optimized price (base + 30% premium) at the DSP rate — a DSP commit on an I/O-Optimized cluster gets the DSP discount applied to the premium-inclusive price. See ../commitment-pricing/mechanics.md §Aurora serverless + DSP mechanics for the full treatment. |
| Storage | $0.10 per GiB-month | $0.225 per GiB-month | +125% storage rate |
| I/O | $0.20 per million requests | $0 (free) | All I/O is included |
These us-east-1 constants are only a fallback baseline. AWS does not publish a fixed regional multiplier, and Standard vs I/O-Optimized rates do not scale by an identical regional factor — storage, instance, and I/O rates each vary independently by region. For any non-us-east-1 region, the agent MUST use the analyzer’s live per-region, per-component rates fetched from the AWS Pricing API rather than applying an estimated multiplier. Any offline cross-region approximation is a rough estimate with no AWS-published basis.
Standard total = (compute_$hr × 730 × num_instances) + (storage_GiB × $0.10) + (monthly_io_millions × $0.20)
I/O-Optimized total = (compute_$hr × 1.30 × 730 × num_instances) + (storage_GiB × $0.225) + 0 (no I/O charge)
I/O as % of Standard total = (monthly_io_millions × $0.20) / Standard_total × 100
The storage-type switch has a 30-day cooldown that applies to the Standard → I/O-Optimized direction only — switching to I/O-Optimized is limited to once every 30 days, while reverting to Standard is allowed at any time. Do NOT recommend a Standard → I/O-Optimized switch on thin data because that direction commits you to the outcome for a full month.
| Lookback window | Tag | Can recommend a switch? |
|---|---|---|
| < 3 days | insufficient | NO. Do not recommend either direction. Tell the user to wait. |
| 3–7 days | short | NO. Weekly patterns (weekday vs weekend I/O ratios often differ 2–3×) can flip the result. Also surface the 30-day cooldown on the Standard → I/O-Optimized direction as an additional reason to wait. Call the recommendation tentative; minimum wait: reach at least 14 days before acting. |
| 7–14 days | adequate | Yes, with caveat: if result is within ±3% of 25%, wait for 14+ days. |
| 14+ days | good | Yes. High-confidence. |
Why weekly patterns matter: most OLTP clusters see 40–60% lower I/O on weekends. A cluster that looks like 20% I/O on Mon–Thu can average 14% over a full week. The script’s extrapolation over short windows does not capture this. Always wait at least one full week of observation, and recommend 14 days minimum before committing.
The analyzer returns skipped: true when a cluster has no DB instances attached. This is NOT a “cluster not found” — the cluster exists, but there is no compute to price.
Common causes:
DBClusterMembers with status available and IS analyzable — it is not an empty cluster and is not skipped.)modify-db-instance reboot does NOT empty DBClusterMembers; the instance is still listed as a member (just briefly in a rebooting/replacing state), so the cluster is NOT skipped for empty membership.When the analyzer skips a cluster, you MUST:
skipped: true result verbatim with the reason string.“Cluster not found”. Wrong cluster ID or region. Verify with aws rds describe-db-clusters --region <region>.
CloudWatch returns zero I/O data. Cluster is new, paused, or wrong region. Confirm with aws cloudwatch list-metrics --namespace AWS/RDS --dimensions Name=DBClusterIdentifier,Value=<cluster>. If genuinely idle, Standard is correct.
Live pricing fetch fails (ExpiredToken / AccessDenied). Refresh credentials. Script falls back to static us-east-1 pricing; flag that caveat.
“Skipped — no DB instances”. A paused cluster or one whose last reader/writer was deleted (an empty cluster still incurs storage charges). Restore or add an instance before assessing the Standard vs I/O-Optimized decision. (Note: Aurora Limitless Database — which is locked to I/O-Optimized — is an Aurora PostgreSQL-only capability and does not apply to Aurora MySQL.)
Result close to the 25% threshold (22–28%). May flip month-to-month. Monitor 1–2 months before committing, especially if seasonal.