Most AWS cost-cutting guides start with: "right-size your EC2 instances."
Most AWS bills don't actually have an EC2 problem.
The order matters. After taking apart something like thirty bills, here's the rough priority list we use. It's not exhaustive, but if you do these five things you'll catch most of the waste in most accounts.
1. Find your top three services first
Open Cost Explorer. Group by service. Sort by cost.
Three lines will usually account for 70% of your bill. Optimise those. Ignore the rest until you've squeezed them dry. People waste enormous amounts of time fine-tuning $40/month services while a $4,000 line item sits ignored at the top.
2. Audit data transfer
Data transfer is almost always silently expensive. Things to check:
- Cross-AZ traffic. Free between subnets of the same AZ, but billed across AZs. Inter-AZ traffic from chatty microservices adds up fast.
- NAT gateway. Egress through a NAT gateway is billed twice: once for the gateway, once for the data. VPC endpoints for S3, ECR, and other AWS services often pay back inside a month.
- CloudFront vs direct origin. For any meaningful traffic, CloudFront is cheaper than direct S3/ALB egress and faster.
3. Look at S3 storage classes
Most teams use S3 Standard for everything. They shouldn't.
- Standard-Infrequent Access for backup buckets and old logs.
- Glacier for compliance archives.
- Intelligent-Tiering for anything where access patterns vary.
A lifecycle policy that moves objects to Standard-IA after 30 days and Glacier after 90 days is, in our experience, the single highest ROI change in most accounts.
4. Idle resources
Not "underutilised", idle. Things to hunt for:
- EBS volumes attached to terminated instances.
- Elastic IPs not attached to anything (these bill hourly).
- Old snapshots from a one-time data migration two years ago.
- Dev environments running 24/7 that should auto-stop after work hours.
- RDS instances at "dev/test" tier that someone created for a demo and forgot.
A two-hour audit usually finds a few hundred dollars a month of pure waste here.
5. Reserved capacity, only after the above
Reserved Instances and Savings Plans are real money, but commit them to the wrong workload and you're locked into a bad decision for a year. Do the cleanup first, then look at what's left running steady-state, then reserve that.
What we don't recommend
A few things that get more attention than they deserve:
- Spot instances for production workloads without a real fault-tolerance design. The savings are real but so are the headaches if you haven't designed for interruption.
- "Lift and shift" Lambda migrations for things that are perfectly happy on a $20 EC2 instance. Lambda is great. It's not always cheaper.
- Multi-cloud cost arbitrage. Almost never worth the operational complexity at startup scale.
We've taken AWS bills down by 40–60% for customers doing exactly the list above, with no impact on capacity or reliability. The work is mostly unglamorous accounting, but it's some of the highest-ROI engineering most teams can do.
This piece was written by the Adhish team. We build small, sharp products that solve real problems. If this resonated, come say hello or browse what we've built.