The AWS cost problem: You're probably overpaying
AWS pricing is complex. There are 200+ services, each with different pricing models. Most teams use the default (on-demand pricing) without considering discounts or optimizations. Result: bloated monthly bills.
Common overspend patterns:
- EC2 instances running 24/7 when they're used 2 hours/day (dev/test servers)
- RDS databases with multi-AZ (high availability) when single-AZ would work
- No data lifecycle policies (keeping old logs and backups forever)
- Unoptimized database queries (running expensive operations hourly)
- Data transfer costs not budgeted (NAT gateway, cross-region, egress)
Step 1: Understand your cost breakdown
Login to AWS Cost Explorer. Look at cost by service for the last 3 months. Typical breakdown for a SaaS company:
| Service | % of Bill | Note |
|---|---|---|
| EC2 (compute) | 30-40% | Usually the biggest cost. Often has waste. |
| RDS (database) | 20-30% | High if multi-AZ or oversized |
| Data transfer / NAT | 10-15% | Often unbudgeted surprise |
| S3 (storage) | 5-10% | Can be huge if unmanaged |
| Other (Lambda, monitoring, etc.) | 10-20% | Usually small but varied |
Step 2: Reserve instances instead of on-demand
This is the single biggest cost saver. Reserved Instances give 30-55% discounts on EC2 if you commit to 1 or 3 years. Savings Plans give similar discounts on compute (EC2 + Fargate).
| Pricing Model | Best For | Savings vs On-Demand |
|---|---|---|
| On-Demand | Dev/test, variable workloads | 0% (baseline) |
| Reserved Instance (1-year) | Predictable workloads (production) | 30-35% discount |
| Reserved Instance (3-year) | Long-term predictable workloads | 50-55% discount |
| Spot Instances | Batch jobs, fault-tolerant workloads | 60-90% discount (but can be interrupted) |
| Savings Plans | Compute across instance types/regions | 25-30% discount, more flexible than RI |
How to use this: The 3-step approach
- Analyze current usage: Look at your EC2 instances. Which ones run 24/7? Those are candidates for Reserved Instances.
- Buy a 1-year RI: Don't commit 3 years yet. Buy 1-year for your proven production workloads. Get 30% discount immediately.
- Use Spot for variable workloads: Batch jobs, testing, non-critical processing. Spot instances can be stopped anytime but cost 70% less.
Example: Your production API runs on m5.large instances (on-demand: £0.10/hour). 3 instances × 24/7 × £0.10 = £2,160/month.
With 1-year Reserved Instance discount (30% off): £2,160 × 0.70 = £1,512/month. Saves £648/month.
Step 3: Optimize database costs
Multi-AZ: Do you really need it?
Multi-AZ (multiple availability zones for automatic failover) doubles RDS costs. Question: do you need automatic failover, or can you tolerate 30 minutes of downtime to manually fail over? If the latter, use single-AZ and save 50%.
Reality: Most startups can use single-AZ. Upgrade to multi-AZ once you have paying customers and SLA commitments.
Database right-sizing
RDS instances come in sizes (db.t3.micro, db.m5.large, etc.). Many teams over-provision. Check actual CPU/memory usage in CloudWatch. If you're using <30% of your instance, downsize.
Backup retention
By default, RDS keeps backups for 7 days. If you don't need 30-day retention, reduce it. Each backup costs storage money. Reducing from 30 → 7 days saves ~£200-400/month for larger databases.
Step 4: Data transfer costs (the hidden killer)
Data transfer within AWS (EC2 ↔ RDS, EC2 ↔ S3) is free. Data transfer OUT of AWS costs money (typically £0.09/GB). Common expensive patterns:
- NAT Gateway: Allows private subnets to reach the internet. Costs £0.45/hour + £0.45/GB. If you have 100GB/month going through NAT, that's £90/month on top of hourly charges.
- Cross-region replication: Copying data between regions costs £0.02/GB. If you're syncing frequently, use S3 replication rules carefully.
- Egress from EC2: When a user downloads from your API, you pay for that data leaving AWS.
Optimization: Use CloudFront (AWS CDN) for content delivery. Data transfer through CloudFront is cheaper (first 1TB free/month, then £0.085/GB) and faster. Most companies save money switching from direct EC2 downloads to CloudFront.
Step 5: S3 storage lifecycle policies
S3 stores data forever until you delete it. Implement lifecycle rules to transition old data to cheaper storage classes:
- Recent data (0-30 days): S3 Standard (£0.023/GB). Keep active data fast.
- Older data (30-90 days): S3-IA (Infrequent Access, £0.0125/GB). 50% cheaper, small retrieval fee.
- Archive data (90+ days): Glacier (£0.004/GB). 80% cheaper, retrieval takes hours.
Example: 1TB of logs stored for 1 year. If all in S3 Standard: £23/month. With lifecycle (30d Standard, 60d IA, rest Glacier): £8/month. Saves £15/month. Scale to 100TB: saves £1,500/month.
Step 6: Monitor continuously with budgets and alarms
Set up AWS Budgets to alert you if costs exceed thresholds. Example alert: "Alert me if EC2 costs exceed £1,500/month."
Enable AWS Cost Anomaly Detection (free) to automatically flag unusual spending patterns.
Third-party tools (CloudZero, Vantage, Infracost) give deeper insights and recommendations.
Key principle: Optimizing is ongoing. Spend 1 hour/month reviewing costs. Find one improvement each month. Compound these savings over a year and you'll reduce costs 30-40%.
Real example: From £8,500 to £5,200/month
A London SaaS company was spending £8,500/month on AWS. After optimization:
- Switched EC2 to Reserved Instances: -£1,200/month (30% discount)
- Reduced RDS multi-AZ to single-AZ: -£800/month
- Implemented S3 lifecycle policies: -£400/month
- Removed unused Lambda functions and monitoring: -£200/month
- Optimized database queries (fewer scans): -£700/month
Total savings: £3,300/month (39% reduction). Annual savings: £39,600.