AWS Cost Optimization: How We Reduced a Startup’s Cloud Bill by 60%
Cloud costs can spiral out of control fast. A startup we worked with was spending $15,000/month on AWS — far more than necessary for their workload. Here’s how we brought that down to $6,000/month without any performance degradation.
Step 1: The Audit
Before making any changes, we performed a thorough audit:
- AWS Cost Explorer analysis (3-month history)
- Resource utilization metrics from CloudWatch
- Architecture review of all services
- Traffic pattern analysis
What We Found
- 40% of EC2 instances were oversized (running m5.2xlarge for workloads that needed t3.medium)
- No auto-scaling — instances ran 24/7 at peak capacity
- Unused resources — 3 idle RDS instances, 500GB of orphaned EBS volumes
- No Reserved Instances — everything on-demand pricing
Step 2: Right-Sizing
The biggest quick win is matching instance sizes to actual workload:
| Service | Before | After | Savings |
|---|---|---|---|
| Web servers | m5.2xlarge (x4) | t3.large (x2) + auto-scaling | 70% |
| Database | db.r5.xlarge | db.r6g.large | 45% |
| Cache | r5.large | t4g.medium | 60% |
Step 3: Auto-Scaling
We implemented target-tracking auto-scaling:
- Min instances: 2 (handles baseline traffic)
- Max instances: 8 (handles peak traffic)
- Target CPU utilization: 60%
This alone saved 40% on compute costs. Instead of 4 instances running 24/7, we typically run 2 instances that scale up during business hours.
Step 4: Reserved Instances & Savings Plans
For baseline workloads (services that always run), we purchased:
- 1-year Compute Savings Plan — 30% discount
- Reserved RDS instances — 40% discount
- S3 Intelligent Tiering — automatic cost optimization for storage
Step 5: Serverless Migration
Some services were better suited for serverless:
- Cron jobs → AWS Lambda (pay-per-execution instead of running an EC2 24/7)
- Image processing → Lambda + S3 triggers
- API endpoints with low traffic → Lambda + API Gateway
Step 6: Cleanup
We automated cleanup of unused resources:
- Automated EBS snapshots with lifecycle policies
- S3 lifecycle rules to move old data to Glacier
- Automated tagging for cost allocation
- Monthly waste detection reports
The Results
After 2 months of optimization:
| Metric | Before | After |
|---|---|---|
| Monthly cost | $15,000 | $6,000 |
| Avg response time | 320ms | 180ms |
| Uptime | 99.9% | 99.99% |
| Deploy frequency | Weekly | Daily (CI/CD) |
Key Takeaways
- Audit first — Don’t guess where money is going
- Right-size aggressively — Most instances are oversized
- Auto-scale everything — Never pay for idle capacity
- Commit to savings plans — If you know your baseline, lock in discounts
- Go serverless where possible — Pay only for what you use
- Automate cleanup — Orphaned resources add up fast
Want to optimize your AWS spending? Book a free cloud audit and we’ll identify your savings opportunities.