Skip to main content

Case study: cutting $23,000/year from a production AWS bill, verified in Cost Explorer

· 6 min read
Founder, Dragon Fractal · ex-AWS engineer

Short version: we scanned a real production AWS account (~$10.7K/month, 1,084 resources in us-east-1), fixed six things, and cut $1,925.57/month. Every dollar was checked against AWS Cost Explorer billing data over three cycles. No production incidents. Here is what actually moved the bill.

The account

A normal mid-size setup: Aurora and DocumentDB databases, EC2 for data pipelines, and the usual pile of resources nobody had looked at in a year. The scan flagged plenty. What matters is what happened after we acted on it and watched the invoice.

These are realized numbers, not "potential." A tool will happily tell you one instance could save money three ways: buy a Reserved Instance, turn it off, or right-size it. You get to pick one. Everything below is the actual run-rate change in Cost Explorer, so it is what the account stopped paying.

The two fixes that were 92% of it

Aurora I/O-Optimized: $942/month

The biggest one. The Aurora clusters were on the standard config and paying per-request I/O charges every month, flat and predictable at $1,218 to $1,245 across the prior quarter. I/O-Optimized drops the per-I/O charge for a higher flat instance and storage rate:

Cost componentBeforeAfterDelta
Per-request I/O charges$1,231.97$20.65-$1,211.32
I/O-Optimized storage$0.00$39.14+$39.14
Instance (standard to I/O-Optimized)$822.86$1,035.35+$212.49
Standard storage$24.53$7.27-$17.26
Net-$942.44/mo

We watched the cluster for three days after the switch before calling it done. Nothing moved in the wrong direction:

Metric (3 days post-switch)Value
Read latency0.62ms avg, 3.58ms max
Write latency0.21ms avg, 0.61ms max
CPU12.8% avg, 52.7% max
Connections~51 avg, 118 max (stable)
RDS eventsnone

If your Aurora I/O spend is high and steady, this is about the safest large win there is. The switch is a config change, not a migration, and it is reversible.

Decommission idle DocumentDB: $825/month

Four DocumentDB instances across two clusters, sitting at roughly zero connections. The service that used them had already been moved off DocumentDB months earlier. We confirmed zero live connections with VPC Flow Log queries, took manual snapshots for rollback, and deleted the clusters. Cost went from $825.09 to $0.10. These were also end-of-life DocumentDB 3.6 clusters with a March 30 EOL deadline, so deleting them killed a forced upgrade at the same time.

The other four

Migrating a data-pipeline instance from x86 to Graviton, stopping an idle dev instance and a dead SFTP box, and removing unused public-facing infrastructure. Smaller line items, but they came with wins that were not about cost (below).

The bill, month by month

The savings landed on the targeted services and held. Cost Explorer, targeted services only:

ServiceJan (baseline)FebMarAprChange
DocumentDB$825.09$745.31$273.23$0.10-$824.99
RDS / Aurora$3,054.53$2,779.65$2,327.70$2,039.81-$1,014.72
EC2 compute$88.32$107.64$63.39$2.47-$85.85
Total$3,967.94$3,632.60$2,664.32$2,042.37-$1,925.57

One honest caveat: the whole account bill fell by less than $1,925, because unrelated services (EKS control plane, AWS Config) grew over the same months. The savings on the targeted resources are real and isolated. They do not mean the entire bill dropped by the same amount, and any cost report that pretends otherwise is selling you something.

What it cost in downtime

Nothing. Zero production incidents. The original projection was $1,900 to $2,300/month; the realized $1,925.57 landed inside it. We validated the January baseline against the prior quarter first, to make sure it was a normal month and not a spike we were measuring against.

How the savings showed up

The savings did not land all at once. They ramped as each fix went in, which is exactly what you want to see: the run rate moving with the actions, not before them. Cumulative savings against the January baseline:

PeriodRealized vs baselineWhat landed
February$335SFTP box and idle dev instance stopped mid-month
March$1,304DocumentDB deleted, Aurora I/O switch applied mid-month
April 1 to 22$1,318everything fully in effect

By April the monthly run rate had settled at the full $1,925.57. Total realized in the first three months was $2,957.18 while the fixes were still phasing in.

The wins that were not about cost

  • 29 to 62% faster ETL on Graviton. Nightly pipelines that ran 8 to 18 minutes dropped by a third to two thirds. See the Graviton migration guide for how the move works.
  • Killed an EOL deadline. The DocumentDB 3.6 clusters would have forced an upgrade by March 30. Deleting them made it moot.
  • Smaller attack surface. An unused public-facing SFTP host is gone, and the new Graviton instance enforces IMDSv2.

What we left on the table

We stopped at the safe, high-value fixes and did not chase every dollar. A few smaller items are still open on purpose:

  • A Reserved Instance or Savings Plan on the new Graviton instance, once its steady-state usage is confirmed (~$40/mo). Buy commitments after the waste is gone, not before.
  • I/O-Optimized on the remaining dev and QA Aurora clusters (~$20/mo of residual I/O).
  • Terminating two already-stopped instances to drop their lingering EBS charges.

None were worth rushing. There is almost always a long tail after the big wins, and it is fine to leave it for the next quarterly pass.

Find it in your own account

Every fix here started as a line in a scan. Cloud Cost Analyzer runs the same checks, plus 80+ more, as one read-only pass:

curl -sSL https://releases.dragonfractal.com/install.sh | sh
cca scan --provider aws

The scan runs in your environment with read-only access, so your credentials never leave it. Then you do the part that actually saves money: fix the top of the list and check the result in Cost Explorer. The AWS cost optimization checklist walks through the fixes it looks for.