How to Cut Your AWS Bill by 30% Without Touching Your Architecture
A practical, prioritised walkthrough of the most common AWS cost leaks — and exactly how to fix them without breaking anything.
If you've ever opened your AWS bill and felt a knot in your stomach, you're not alone. Most engineering teams at Series A and B companies are overpaying for cloud by 25–40% — not because they're wasteful, but because AWS pricing is deliberately complex and the defaults are almost never optimized for your actual usage.
In this article I'll walk through the seven highest-impact places to look, in the order I always check them when I run a Cloud Cost Audit. You don't need to be a FinOps expert. You need about four hours and read access to your AWS account.
1. EC2 Right-Sizing: The Biggest Single Win
The most common thing I see: EC2 instances that were provisioned at launch and never touched. A development team spins up an m5.2xlarge because "we might need it," and two years later it's running at 8% CPU utilization, billing you $277/month.
Start here:
- Open the AWS Compute Optimizer — it's free and gives you ML-powered rightsizing recommendations for EC2, ECS, Lambda, and EBS.
- Filter for instances where the CPU utilization P99 is below 20% over the last 14 days.
- Cross-reference with the Compute Optimizer recommendation — it'll often suggest a smaller instance family that costs 40–60% less.
One caveat: don't right-size blindly. Some instances are intentionally oversized for memory-bound workloads or burst capacity. Check with the team that owns the service before downsizing anything in production.
2. RDS: Stopped Databases Still Cost Money
RDS has a nasty billing quirk: a stopped DB instance still charges for storage. And stopped instances automatically restart after 7 days — meaning that dev database you "paused" three months ago has been running continuously since then.
What to do:
- In the RDS console, filter by "Stopped" — if you see instances that have been stopped and restarted multiple times, that's a database nobody is actively using.
- Snapshot and delete anything that isn't mapped to an active service.
- For dev/staging databases, consider Aurora Serverless v2 — it scales to zero when idle and can reduce your non-production RDS spend by 70–80%.
3. NAT Gateway: The Silent Expense Nobody Notices
NAT Gateway pricing has two components: an hourly charge ($0.045/hr = $32/month per gateway) plus a data processing charge ($0.045 per GB). The data processing charge is what kills teams — it's invisible until your bill arrives.
Common culprits:
- Lambda functions in a VPC that call S3 or DynamoDB via the public internet instead of VPC endpoints (each GB costs $0.045 through NAT, but S3 and DynamoDB VPC endpoints are free or near-free).
- Multiple NAT Gateways across Availability Zones when traffic patterns don't justify it.
- Cross-AZ traffic routing through NAT unnecessarily.
Quick win: Set up VPC endpoints for S3 and DynamoDB in every VPC that has Lambda functions or EC2 instances that access these services. This alone often cuts NAT data charges by 50%.
4. Unattached EBS Volumes
Every time an EC2 instance is terminated without deleting its EBS volumes, those volumes keep billing you. On a busy team that iterates fast, this adds up quickly.
How to find them:
- EC2 console → Volumes → filter by "State: available" (available means not attached to any instance).
- Sort by size. Anything over 50GB that's been unattached for more than 30 days is almost certainly orphaned.
- Take a snapshot first, then delete. Snapshots cost roughly 10x less than live volumes.
Prevention: Set the "DeleteOnTermination" flag to true for all non-data EBS volumes. You can enforce this via a Service Control Policy if you're using AWS Organizations.
5. Data Transfer: The Hidden Tax
AWS charges for data leaving their network (egress), for data moving between regions, and in some cases for data moving between Availability Zones. These charges are easy to miss because they show up as line items you don't immediately recognize.
Where to look:
- In Cost Explorer, group by "Usage Type" and filter for anything containing "DataTransfer." Sort by cost.
- Cross-AZ data transfer (within the same region) costs $0.01/GB each way. If your services are in different AZs and talking to each other constantly, this adds up. Collocate services that talk frequently, or use a service mesh that's AZ-aware.
- If your application serves users globally from a single region, consider CloudFront — the egress rate from CloudFront is significantly cheaper than EC2 egress, and you get caching on top.
6. Reserved Instances and Savings Plans
This is the highest-leverage optimization but also the one that requires the most thought. AWS gives you discounts of 30–72% in exchange for committing to usage for 1–3 years.
The right way to approach this:
- First, right-size everything (steps 1–5). Don't commit to Reserved Instances on oversized infrastructure.
- Use Compute Savings Plans rather than EC2 Instance Reserved Instances. Compute Savings Plans apply across EC2, Lambda, and Fargate, and they're flexible across instance families and regions.
- Start with a 1-year, no-upfront commitment. You get 30–40% savings with zero capital outlay.
- Commit only to your consistent baseline usage — use On-Demand for anything variable.
7. S3: Lifecycle Policies and Intelligent-Tiering
S3 costs creep up slowly because storage is cheap per GB — until you have a lot of it. The typical pattern is data accumulating in S3 Standard for years because nobody set up a lifecycle policy.
- Enable S3 Intelligent-Tiering on any bucket with objects older than 30 days that don't have a clear access pattern. It automatically moves objects between access tiers based on usage, with no retrieval fees.
- For logs, audit trails, and backup data: set a lifecycle policy to transition to S3 Glacier after 90 days ($0.004/GB vs $0.023/GB in Standard).
- Delete incomplete multipart uploads — these are a known hidden cost. Add a lifecycle rule to expire incomplete multipart uploads after 7 days.
Putting It Together
Run through these seven areas methodically over a week and I'd expect you to find 25–40% in recoverable spend for a typical Series A or B cloud environment. The low-hanging fruit — right-sizing, unattached volumes, S3 lifecycle policies — you can often implement in a day without touching your application code.
The harder wins (NAT Gateway restructuring, Savings Plans) require more care and planning, but they're where the largest absolute savings live.
If you want a second set of eyes on your specific environment, the Cloud Cost Audit is a fixed-price engagement where we do exactly this — with a prioritized savings roadmap delivered in two weeks.
Work With Us
Want help applying this to your environment?
Every environment is different. A 60-minute Power Hour gets you specific recommendations for your AWS or GCP setup — with a written action plan in your inbox next morning.