7 AWS Changes That Cut Our Client’s Bill by 40%
When a SaaS startup came to us with a $4,200/month AWS bill and 18 months of runway left, we had a clear mandate: cut costs without breaking anything. Six weeks later, their bill was $2,450 — a 42% reduction — and response times actually improved.
Here’s exactly what we did.
The Starting Point
Before touching anything, we spent a week auditing. The AWS Cost Explorer and Trusted Advisor findings were sobering:
- 60% of EC2 instances running at less than 10% CPU utilization
- Three RDS instances with no connections after 6pm
- S3 buckets storing 800GB of access logs from 2021
- No Reserved Instances despite running the same workload for 14 months
- CloudWatch Log retention set to “Never expire”
The biggest wins were obvious. Here’s how we tackled them in order of impact.
1. Right-Size EC2 Instances
The biggest line item was compute: $1,800/month across 12 instances. CloudWatch metrics told the real story — these instances were massively overprovisioned.
We used AWS Compute Optimizer to get specific recommendations, then tested each change in staging before applying to production:
- 6x
t3.large→t3.medium(saved $180/month) - 2x
m5.xlarge→m5.large(saved $210/month) - 1x
r5.2xlarge→r5.xlarge(saved $140/month)
Total savings: ~$530/month
The r5 instance was running a memory-intensive process we moved to Lambda, which also improved latency.
2. Purchase Reserved Instances
The client had been running the same production workload on On-Demand instances for 14 months. We purchased 1-year Standard Reserved Instances for the 3 instances we knew would run 24/7.
Reserved Instances offer 30-40% discount over On-Demand with 1-year commitment, 60%+ with 3-year.
Total savings: ~$320/month
3. Implement S3 Intelligent Tiering + Lifecycle Policies
The S3 audit revealed three issues:
- 800GB of old log files with no lifecycle policy
- No tiering on infrequently accessed data
- Versioning enabled but no expiration on old versions
We added lifecycle rules to:
- Delete objects older than 90 days in the logs bucket
- Move objects to S3 Standard-IA after 30 days in the data bucket
- Expire non-current versions after 30 days
aws s3api put-bucket-lifecycle-configuration \
--bucket my-data-bucket \
--lifecycle-configuration file://lifecycle.json
Total savings: ~$95/month
4. Schedule Non-Production Instances
The staging environment ran 24/7, but engineers only used it 9am-6pm weekdays. We used AWS Instance Scheduler to automatically stop instances outside business hours.
The math: 12 hours off per weekday + full weekends = ~65% of the week idle.
Total savings: ~$180/month
5. Optimize RDS
Three RDS instances needed attention:
Multi-AZ for dev: Dev and staging didn’t need Multi-AZ. Disabling it cut the database cost in half for those environments.
Read replica right-sizing: A db.r5.large read replica handling only reporting queries — replaced with db.t3.medium.
Aurora Serverless v2: The reporting database had spiky usage (heavy on Monday mornings, quiet the rest of the week). Aurora Serverless v2 scaled to zero during off-hours.
Total savings: ~$210/month
6. Clean Up Unused Resources
A systematic audit found:
- 8 unattached EBS volumes (snapshots kept, volumes deleted)
- 3 unused Elastic IPs ($3.60/month each, but the principle matters)
- 12 old AMIs and their associated snapshots
- 4 Elastic Load Balancers with no targets
This sounds small, but unattended resources compound. Setting up monthly AWS Config rules to flag orphaned resources prevents future drift.
Total savings: ~$45/month
7. Fix CloudWatch Log Retention
CloudWatch Logs with “Never expire” retention is a slow leak. We audited all log groups and set appropriate retention:
- Application logs: 30 days
- Access logs: 7 days
- Audit/compliance logs: 365 days
- Debug logs: 3 days
Total savings: ~$70/month
The Result
| Change | Monthly Savings |
|---|---|
| EC2 right-sizing | $530 |
| Reserved Instances | $320 |
| RDS optimization | $210 |
| Non-prod scheduling | $180 |
| S3 lifecycle policies | $95 |
| CloudWatch log retention | $70 |
| Unused resource cleanup | $45 |
| Total | $1,450/month |
From $4,200 to $2,750/month — and we found additional savings in month two by applying the same patterns to their data pipeline.
What You Should Do This Week
- Open Cost Explorer → set to last 3 months → sort by service
- Run Trusted Advisor (Business/Enterprise Support required for full checks)
- Check EC2 Compute Optimizer for rightsizing recommendations
- Audit your S3 buckets for lifecycle policies
Most AWS bills have 20-30% waste. The question is just whether you find it before your runrate does.
Want a free audit of your AWS infrastructure? Get in touch — we’ll identify your top 5 cost reduction opportunities at no charge.
MakFam Solutions
Cloud infrastructure and AI consultant with 6+ years of AWS expertise. Helping small and medium businesses build scalable, secure cloud systems.