How to Reduce Your AWS Bill in 30 Minutes
By Jose Marin, founder of Cirrondly. March 2026
You can reduce your AWS bill by 10-30% in a single 30-minute session by auditing five areas: unused Elastic IPs and idle load balancers, unattached EBS volumes, CloudWatch Logs without retention policies, overprovisioned DynamoDB tables, and old RDS snapshots. Here's exactly how to do each one, with the AWS console steps or you can connect Cirrondly and get all of this done automatically in 60 seconds.
This isn't a strategy guide. It's a checklist. Set a 30-minute timer, open your AWS console, and work through each step. By the end, you'll have a list of resources to delete or modify and a clear dollar amount you'll save this month.
If you want the background on why these cleanup targets matter, start with 8 AWS Resources That Silently Drain Your Budget. If you want the product workflow behind the automated version, see How It Works and the full AWS Services coverage page.
Before you start: set up billing visibility (2 minutes)
If you haven't already, do this first:
- Go to AWS Billing → Budgets → Create budget
- Set a monthly cost budget at your current monthly spend
- Add alert thresholds at 80% and 100%
- Add your email for notifications
This takes 2 minutes and ensures you'll never be surprised by a bill again. It won't reduce your bill, but it will tell you if something goes wrong after you've optimized.
Step 1: Release unused Elastic IPs (3 minutes)
Where to look: EC2 → Elastic IPs
What to find: Any Elastic IP that shows no "Associated instance ID." These are allocated but unattached. AWS charges $3.60/month for each one.
What to do: For each unattached IP, ask yourself: "Do I have a specific plan to use this in the next week?" If no, release it. You can always allocate a new one when you need it.
Expected savings: $3.60/month per released IP. Most accounts have 2-5 of these.
Step 2: Delete idle load balancers (3 minutes)
Where to look: EC2 → Load Balancers
What to find: For each ALB, check the "Request Count" metric in CloudWatch. Sort by the last 7 days. If it's zero, or near-zero, the ALB is idle.
What to do: If an ALB has had zero traffic for 2+ weeks:
- Verify no active target groups point to running instances
- If it's truly unused, delete it
Expected savings: ~$18/month per idle ALB. Staging and dev environments commonly have 2-3 forgotten ALBs.
Step 3: Clean up unattached EBS volumes (5 minutes)
Where to look: EC2 → Volumes → filter by State: Available
"Available" means unattached. The volume exists, but it isn't connected to any instance. You're paying for storage on a disk nothing is using.
What to do: For each unattached volume:
- Check the "Created" date. If it's been unattached for 30+ days, it's almost certainly safe to remove.
- Create a snapshot first, just in case.
- Delete the volume.
Expected savings: $0.10/GB/month per deleted volume. A single forgotten 500 GB volume costs $50/month.
Step 4: Set CloudWatch Logs retention (5 minutes)
Where to look: CloudWatch → Log Groups → sort by Stored Bytes (descending)
What to find: Log groups with "Never expire" retention and large stored bytes. Every Lambda function, ECS task, and API Gateway creates log groups that store logs indefinitely by default.
What to do: For each log group:
- Set retention to 14 days for development or staging
- Set retention to 30 days for production, or 90 days if you have compliance needs
- For log groups from decommissioned services, set retention to 1 day so they auto-clean
Expected savings: $0.03/GB/month. An account with 200 GB of accumulated logs saves $6/month. The real savings come from stopping future accumulation.
Step 5: Right-size DynamoDB tables (5 minutes)
Where to look: DynamoDB → Tables → click each table → Metrics tab
What to find: Compare "Provisioned Read/Write Capacity" vs "Consumed Read/Write Capacity." If consumed is consistently below 30% of provisioned, you're overpaying.
What to do:
- Option A: Switch to on-demand mode. Best for bursty or unpredictable traffic. You pay per request instead of per hour.
- Option B: Reduce provisioned capacity to 1.5x your peak consumed capacity and enable auto-scaling.
Expected savings: 50-80% reduction on overprovisioned tables. A table provisioned for 1,000 WCU using 100 WCU is wasting roughly $350/month.
Step 6: Delete old RDS snapshots (5 minutes)
Where to look: RDS → Snapshots → filter by Type: Manual
What to find: Manual snapshots created before migrations, upgrades, or testing. AWS automated snapshots get cleaned up by your retention window. Manual ones don't.
What to do:
- Sort by creation date
- Anything older than 30 days: evaluate whether you still need the data
- If the source database was already deleted, the snapshot is almost certainly unnecessary
- Delete old snapshots
Expected savings: $0.095/GB/month. Four old 100 GB snapshots cost $38/month.
Step 7: Check for idle ElastiCache clusters (2 minutes)
Where to look: ElastiCache → Redis or Memcached clusters → CloudWatch metrics
What to find: Check CurrConnections and GetHits metrics. If both are near zero consistently, nobody is using the cache.
What to do: This is a judgment call. If the cache is genuinely unused, consider decommissioning it. Because ElastiCache handles data, be extra careful. Verify with your team before deleting.
Expected savings: $20-300/month per idle cluster depending on instance type.
Your 30-minute savings summary
| Resource type | Typical count | Savings per unit | Total |
|---|---|---|---|
| Unused Elastic IPs | 2-5 | $3.60/month | $7-18/month |
| Idle ALBs | 1-3 | $18/month | $18-54/month |
| Unattached EBS volumes | 2-5 | $5-50/month | $10-250/month |
| CloudWatch Logs | 50-500 GB | $0.03/GB/month | $1.50-15/month |
| Overprovisioned DynamoDB | 1-3 tables | varies | $50-350/month |
| Old RDS snapshots | 3-10 | varies | $10-95/month |
| Idle ElastiCache | 0-1 | $20-300/month | $0-300/month |
| Typical total | $100-500/month |
Most startup accounts have $100-500/month in waste sitting right there. You just found it in 30 minutes.
Or do it in 60 seconds
Everything above takes 30 minutes if you do it manually. You'll need to do it again next month, because new waste accumulates as your team deploys.
Cirrondly does this entire audit automatically in under 60 seconds. It connects to your AWS account via CloudFormation, stores no credentials, scans all 8 service types, and presents specific findings with resource IDs, savings amounts, and one-click fixes. The full execution model is on How It Works, and the supported coverage is listed on AWS Services.
You can do the manual audit above and see what you find. Or you can compare it against the CSV diagnosis or the full agent.
Check your AWS account for waste right now - two ways:
Free CSV diagnosis (10 seconds, no signup): Export your Cost Explorer CSV and upload it. You'll see exactly which services are costing you more than they should. Try the free diagnosis →
Full agent (connects to your AWS account): Cirrondly scans your actual resources, detects idle instances, unattached volumes, and overprovisioned databases - then fixes them with your approval. Start saving with Cirrondly →
Jose Marin is the founder of Cirrondly and a full-stack engineer with 9 years of experience. Previously CTO. Based in Lyon, France.