The Silent Budget Killers
Every AWS account accumulates waste over time. Engineers spin up resources, forget about them, and the bill grows quietly every month. In my experience auditing multiple production accounts, I find at least $200–500/month in pure waste every single time.
Here are the 7 most common culprits.
The moment you open the AWS bill and see charges from resources you forgot about
1. Unattached EBS Volumes
When you terminate an EC2 instance, the attached EBS volume is NOT automatically deleted unless you configured it that way. Those volumes keep charging you even with nothing attached.
How to find them:
aws ec2 describe-volumes \
--filters Name=status,Values=available \
--query 'Volumes[*].[VolumeId,Size,CreateTime]' \
--output table
Fix: Snapshot if needed, then delete.
Prevention: Always set DeleteOnTermination=true in your launch templates.
2. Idle Elastic IPs
AWS charges $0.005/hour for every Elastic IP not attached to a running instance. That is $3.60/month per idle IP — small alone, but they add up.
How to find them:
aws ec2 describe-addresses \
--query 'Addresses[?AssociationId==null]'
Fix: Release any EIP not in active use.
3. Old EBS Snapshots
Snapshots are incremental and cheap individually, but old ones accumulate. I have seen accounts with 3–4 years of daily snapshots consuming thousands of dollars.
Fix: Set up AWS Data Lifecycle Manager to auto-expire snapshots older than 30–90 days.
4. Unused Load Balancers
Load balancers cost ~$16/month minimum even with zero traffic. Old dev/staging ALBs that nobody decommissioned are a classic waste source.
How to find them: Use AWS Trusted Advisor → Cost Optimization → Low Utilization Load Balancers
Fix: Delete any ALB/NLB with less than 100 requests in 7 days.
Idle load balancers silently charging $16/month with zero traffic
5. Idle NAT Gateways
NAT Gateways cost $0.045/hour (~$32/month) plus data processing charges. A forgotten NAT Gateway in a dev VPC is pure waste.
How to find them:
Check CloudWatch metrics — if BytesOutToDestination is near zero for 2+ weeks, it is idle.
6. Unused RDS Instances
Dev and staging databases that engineers forgot to stop. Each one running 24/7 on-demand costs 3x more than it needs to.
Fix: Use AWS Instance Scheduler to stop non-prod RDS every night and weekend automatically.
7. Old CloudWatch Log Groups
Log groups with no retention policy store data forever. Application logs from 2022 are still sitting there costing money.
Fix: Set a retention policy on every log group:
aws logs put-retention-policy \
--log-group-name /your/log/group \
--retention-in-days 30
Run This Audit Monthly
Build a simple checklist and run it on the first of every month. In most accounts this finds $200–1000 in waste. In larger accounts, much more.
Set a calendar reminder. It takes less than an hour and pays for itself immediately.
Running the monthly cleanup script — every deleted resource is money saved