Most AWS bills carry 20–40% of avoidable spend — but it hides across dozens of services and thousands of resources. This guide walks through the exact levers that reduce an AWS bill, in order of impact, plus the invisible costs most teams never find.
What's inside
1. Rightsize what's over-provisioned 2. Kill (or schedule) idle resources 3. Commit to steady usage — the right way 4. Fix storage: S3 lifecycle & EBS 5. The hidden costs no dashboard shows 6. Make it a habit, not a one-off1. Rightsize what's over-provisioned
The single biggest lever on most bills is rightsizing — running instances a size larger than the workload needs. Downsizing one step usually cuts that resource's cost by about half.
The catch is how you measure. Averages lie: a server that sits at 8% CPU on average but hits 90% every afternoon is not idle. Always rightsize on p95/p99 utilization, and ideally split business hours from off-hours so a weekday-busy box isn't flagged from its quiet nights. This applies to EC2, RDS, ElastiCache, Redshift, and OpenSearch alike.
2. Kill (or schedule) idle resources
Idle resources are pure waste — you pay full price for zero value:
- Unattached EBS volumes and old snapshots left behind after instances are gone
- Idle load balancers serving no traffic
- Public IPv4 addresses — AWS now bills every one hourly, attached or not
- Non-production environments running 24/7
That last one is huge. Dev, test, staging and QA rarely need to run nights and weekends. A simple start/stop schedule (Instance Scheduler or an EventBridge rule) trims roughly 65% off those resources — with zero impact on anyone.
3. Commit to steady usage — the right way
For the baseline you always run, on-demand pricing is the most expensive option. Savings Plans and Reserved Instances trade a 1- or 3-year commitment for 30–60% off.
- Compute Savings Plans are the most flexible — they apply across instance families, regions, and even Fargate and Lambda.
- Reserved Instances can be marginally cheaper for one specific type, and remain the tool for steady RDS and ElastiCache.
4. Fix storage: S3 lifecycle & EBS
Storage creeps up quietly. Two quick wins:
- S3 lifecycle rules — transition cold objects to Infrequent Access, Glacier, or Deep Archive. A backup or artifact bucket that never needs old data can drop from ~$0.023/GB to ~$0.001/GB in Deep Archive — a ~95% cut on that data.
- gp2 → gp3 EBS — gp3 is about 20% cheaper than gp2 with equal or better baseline performance, and the migration is online with no downtime.
5. The hidden costs no dashboard shows
This is where most teams leave money on the table, because the waste is invisible in the console:
- Incomplete multipart uploads. Interrupted S3 uploads leave orphaned parts that bill as storage but never appear in the object list — they can quietly accumulate to gigabytes over years. Fix: an
AbortIncompleteMultipartUploadlifecycle rule. - Never-expiring CloudWatch logs. Log groups default to infinite retention; they grow forever. Set 30–90 day retention.
- Orphaned snapshots and old AMIs no one owns.
- Data transfer & NAT gateway charges — often reducible with VPC gateway endpoints for S3/DynamoDB.
None of these show up as a line you'd notice. Finding them requires reading the account resource by resource — exactly what an automated scan is for.
6. Make it a habit, not a one-off
Costs drift as workloads change, so a one-time cleanup regresses within months. Treat cost optimization as a monthly loop: scan, fix the top items, and track the savings you've actually realized. Anomaly detection and budget alerts turn surprises into early warnings instead of end-of-month shocks.
Find your account's hidden savings
The AWS Billing Optimizer runs every check in this guide automatically — itemized, in dollars, read-only. Free to start.
Scan my AWS account →Related: AWS cost optimization FAQ · Connect your AWS account (read-only) · DevOps & cost consulting