Writing
Cutting my cloud bill with three boring changes
Every "reduce your cloud bill" post starts with a rewrite. This one doesn't. Over a weekend I cut a small production footprint by roughly 40% with changes my future self will thank me for: nothing clever, nothing that required a migration window.
1. Lifecycle rules on object storage
Backups and logs were accumulating forever because "disk is cheap." It isn't, once you're paying for egress, snapshots, and replicated copies of a bucket nobody reads.
A single lifecycle policy moved anything older than 30 days to cold storage, and expired anything older than a year. That change alone removed a surprising chunk of the bill and cost me about ten minutes.
{
"Rules": [{
"ID": "expire-cold",
"Filter": { "Prefix": "logs/" },
"Status": "Enabled",
"Transitions": [{ "Days": 30, "StorageClass": "GLACIER" }],
"Expiration": { "Days": 365 }
}]
}
2. Right-sizing, not re-architecting
I had one instance running at 8% average CPU because it was provisioned for a peak that happened once. Instead of moving to autoscaling groups, I resized it, kept a snapshot, and watched the metrics for a week.
Measure before you optimize. The scariest-looking number is usually the one nobody has looked at.
The rule I now use: pick the smallest instance that keeps p95 latency flat, then leave headroom for one bad day — not one bad year.
3. Delete what nobody uses
Orphaned volumes, old load balancers, and three "temporary" NAT gateways from a hack week. None of these show up in a service dashboard, so they quietly bill forever.
- Tag everything at creation; untagged resources get reviewed monthly.
- Snapshot before deleting, then delete the snapshot a month later.
- Put the review on the calendar before the invoice arrives.
The lesson isn't "do these three things." It's that cost work is mostly attention work. Boring, scheduled, and unglamorous — the same qualities that make systems stay up.