A client came to us with a $40K/month AWS bill that had doubled in 18 months with no obvious explanation. After two weeks of analysis, we found eight issues. Here they are, in order of impact.
1. Idle EC2 Instances (Savings: $6,200/month)
47 EC2 instances with under 2% CPU utilisation over the previous 90 days. These were old staging environments, abandoned POCs, and forgotten load testing machines. Terminating them was immediate savings.
2. Oversized RDS Instances (Savings: $4,100/month)
Three RDS clusters running db.r5.4xlarge with peak memory usage of 18%. Downsizing to db.r5.xlarge with Multi-AZ and enabling automated storage scaling cost $4,100 less per month.
3. Savings Plans Not Applied (Savings: $3,800/month)
The account had been running for 3 years with no Savings Plans. Purchasing 1-year Compute Savings Plans for the stable baseline workload locked in a 38% discount on those hours.
4. S3 Storage Class Misconfiguration (Savings: $2,400/month)
Several S3 buckets storing large media assets in S3 Standard that had not been accessed in over a year. Moving to S3 Glacier Instant Retrieval saved 68% on storage costs for those objects.
5. NAT Gateway Data Processing (Savings: $1,900/month)
Services were routing traffic to S3 and DynamoDB through a NAT Gateway, incurring data processing charges. Adding VPC Gateway Endpoints for both services made that traffic free.