Most AWS bills are 30-50% larger than they need to be. Not because of one big mistake, but because of a dozen small defaults nobody revisited. Here's where we look first when a client asks us to bring their bill down.
Right-size before you re-architect
Pull two weeks of CloudWatch metrics and compare provisioned capacity against actual utilisation. Instances running below 20% CPU around the clock are the norm, not the exception. Downsizing one instance class saves ~50% on that workload with zero code changes.
- Check: EC2/RDS instance classes, EBS volumes (gp2 to gp3 is a free ~20%), over-provisioned IOPS
- Kill: unattached volumes, idle load balancers, forgotten staging environments running 24/7
Buy the discount you already earned
If a workload has run steadily for six months, it will probably run for twelve more. Savings Plans or Reserved Instances on that baseline are a 30-40% discount for a signature. Keep burst capacity on-demand; commit only the floor.
Make the architecture earn its keep
The deeper wins are architectural: move cron-style workloads to Lambda, put CloudFront in front of anything static, and push read-heavy queries to a cache instead of scaling the database. One client's bill dropped by a third when we moved image processing from an always-on worker fleet to queued Lambda jobs.
Make cost visible, or it will grow back
Tag every resource by feature or team, set budget alerts at 80%, and review the Cost Explorer monthly. Costs are a product metric - treat them like uptime.