Cloud bills grow quietly until someone finally looks at the invoice and panics. The good news is that most accounts carry a lot of obvious waste, and removing it does not require touching application code. Here are ten levers we pull on AWS accounts, ordered roughly from quickest to most involved, and they share the same cost-shape thinking as our serverless versus containers guide.
1. Delete what nobody is using
Every account accumulates orphaned resources: unattached storage volumes, idle load balancers, old snapshots, stopped instances still paying for their disks. Finding and removing them is the fastest saving available and often the largest single one.
2. Right-size over-provisioned resources
Teams provision generously to be safe and never revisit it. Look at actual utilisation and shrink instances that sit mostly idle. Matching capacity to real usage frequently cuts a meaningful share of compute spend with no impact on performance.
3. Commit to baseline usage
For the steady, predictable portion of your workload, commitment-based pricing offers a substantial discount over on-demand rates. Analyse your baseline and commit to what you know you will use, while keeping on-demand for the variable top layer.
4. Use spot capacity for interruptible work
Batch jobs, build runners, and other fault-tolerant workloads can run on heavily discounted spare capacity, as long as they handle interruption gracefully. This is one of the largest discounts available for the right kind of work.
5. Set storage lifecycle rules
Data you rarely access does not need premium storage. Automatically move older data to cheaper tiers and expire what you no longer need, so storage cost reflects how the data is actually used.
6. Watch data transfer
Moving data between regions and out to the internet carries charges that surprise people. Keep traffic within a region where possible and use a CDN to cut repeated egress for the same content.
7. Choose the right compute model
Sometimes the cheapest win is architectural: a rarely used service may be far cheaper as a function than an always-on instance. Match the compute model to the traffic shape, as covered in our orchestration guide.
8. Tag everything and attribute cost
You cannot manage what you cannot attribute. Consistent tagging lets you see which team, product, or feature drives spend, which turns cost from a mystery into something owners can act on.
9. Set budgets and alerts
Configure spending alerts so a runaway cost is caught in days, not at the end of the billing month. Cost should be monitored like any other production signal, an idea straight out of our observability guide.
Make cost an engineering habit
The reason cloud bills balloon is that, for most teams, spending money is frictionless and nobody owns the total. An engineer can provision a generous instance in seconds and never see the monthly consequence. The durable fix is cultural as much as technical: give teams visibility into what their own services cost, fold a quick cost glance into the same reviews that already look at performance and security, and treat a surprising bill as a bug to investigate rather than a fact of life. None of the individual levers here are difficult, and that is precisely the problem, because easy savings that nobody is responsible for simply do not happen. When cost becomes a normal engineering signal that owners watch alongside latency and error rate, efficiency stops being a periodic cleanup and becomes a steady state.
10. Review regularly
Cost optimisation is not a one-time cleanup. Usage drifts, new resources appear, and savings erode. A short recurring review keeps the account efficient over time. If you want this run as an ongoing discipline rather than a panic, our cloud and DevOps team manages it.