Cloud cost articles love to list twenty tips. In practice, when we open a client account for the first time, five things account for nearly all the recoverable spend — and one of them is not technical at all.
1. Tagging, before anything else
You cannot cut a bill you cannot read. If Cost Explorer shows one line called "EC2" and nobody can say which team or product it belongs to, every conversation about cost turns into a debate.
Pick three or four tags and enforce them: owner, environment, application, and cost centre if finance needs it. Activate them as cost allocation tags in the billing console, then use AWS Config or a tag policy to catch resources launched without them. It is unglamorous and it unlocks everything else.
2. Right-sizing, using data you already have
Nearly every estate we see was sized by copying whatever the old server had. AWS Compute Optimizer reads fourteen days of CloudWatch metrics and tells you which instances are over-provisioned and what to move them to.
Two cautions. Compute Optimizer only sees memory if the CloudWatch agent is installed, so without it the recommendations are CPU-blind. And downsizing a database is not a click — plan it into a maintenance window.
3. Commitment coverage on the baseline, not the peak
On-demand pricing is a convenience charge. If a workload has run continuously for a year, paying on-demand for it is a choice. Compute Savings Plans cover EC2, Fargate, and Lambda with flexibility across instance family and region; Reserved Instances still cover RDS, ElastiCache, Redshift, and OpenSearch, which Savings Plans do not touch.
Commit to your floor, not your average. Look at the minimum daily spend over the last quarter and cover somewhere in the region of that. The overage stays on-demand, which is exactly what you want.
4. Storage, where the slow leak lives
S3 costs creep quietly. Lifecycle rules that move objects to Infrequent Access or Glacier after a set period take fifteen minutes to write. S3 Intelligent-Tiering does the same automatically for unpredictable access patterns, for a small monitoring charge per object.
- Delete incomplete multipart uploads — they sit in buckets, invisible in the console, billed as storage. A lifecycle rule cleans them up.
- Old EBS snapshots multiply. Nobody deletes them. Set a retention policy through AWS Backup or Data Lifecycle Manager.
- gp2 volumes are usually cheaper and faster on gp3. It is an online change.
- Log retention in CloudWatch defaults to "never expire". Set it, unless you enjoy paying to store 2023 debug output.
5. Idle resources, which are always there
Unattached EBS volumes. Elastic IPs not associated with a running instance. Load balancers with no targets. NAT gateways in a VPC nobody uses. Dev and staging environments running through the night and the weekend — which is roughly two-thirds of the week they are billed for.
A scheduled Lambda that stops non-production instances at 8pm and starts them at 9am is an hour of work and takes a meaningful bite out of the non-production line item.
Then make it stick
A one-off clean-up is a rescue mission, and the bill drifts back within two quarters. What holds is a monthly review with the numbers broken down by team, and a named owner for anything unexplained. AWS Budgets with an alert at eighty percent of forecast is the cheapest early warning you will ever set up.