Cloud bills rarely grow because of one big mistake. They grow through dozens of small ones: a test server nobody turned off, a database sized for a launch that never came, snapshots kept forever. Here are the places we look first when we review an AWS account, and what to do about each.
Start with visibility
You can't cut what you can't see. Before changing anything:
- Turn on Cost Explorer and look at spend by service and by month.
- Tag resources by environment, team and project, and activate those tags as cost allocation tags. Untagged spend is usually where the waste hides.
- Set AWS Budgets alerts so a spike reaches someone's inbox the same day, not at month end.
1. Idle and forgotten resources
The fastest savings come from things nobody uses:
- Instances with near-zero CPU for weeks, often old test or demo environments.
- Unattached EBS volumes left behind when instances were terminated.
- Old snapshots and AMIs with no retention policy.
- Elastic IPs and load balancers attached to nothing.
Confirm with the owner, snapshot if in doubt, then delete.
2. Oversized instances
Instances are often sized for a peak that never arrives. Use AWS Compute Optimizer to find instances that are consistently underused, then step down one size at a time and watch the metrics. Where your software supports it, AWS's Graviton (ARM) instance types usually cost less than the x86 equivalent for the same work.
3. Pay less for what you keep
Once usage is stable, stop paying on-demand prices for it:
- Savings Plans or Reserved Instances for the baseline you know you'll run for a year or more.
- Spot Instances for work that can be interrupted: batch jobs, CI runners, some background workers.
Commit only to what the last few months show you really use. Buying commitments before right-sizing locks the waste in.
4. Storage
- Move EBS volumes from gp2 to gp3: AWS prices gp3 lower per GB, and you can set its performance separately.
- Add S3 lifecycle rules that move old objects to cheaper storage classes, or turn on S3 Intelligent-Tiering when access patterns are unknown.
- Set retention on CloudWatch Logs. The default keeps logs forever.
5. Data transfer
Data transfer charges are easy to miss on the bill. Common causes are traffic between Availability Zones, NAT Gateway processing for traffic that could use a VPC endpoint (for example, to S3), and serving large files without a CDN in front.
6. Make it stick
Savings fade unless someone owns them. Give each environment an owner, review the cost report monthly, and schedule non-production environments to shut down outside working hours.
Get a second look
Our free cloud cost review goes through your billing data and gives you a prioritized list of fixes with estimated monthly savings. Prefer to have it handled? See cloud cost optimization.