How to Audit EBS Waste Across Regions
Use a repeatable regional review to find unattached EBS volumes, old gp2 capacity, and storage cleanup opportunities.
How to audit EBS waste across regions
EBS waste usually shows up as several issues at once. You often have unattached volumes, older gp2 capacity, and forgotten storage sitting in secondary regions. This guide gives you a repeatable process to see it all before cleanup begins.
On this page
- What to look for
- Step 1: Enumerate all enabled regions
- Step 2: Find unattached volumes in every region
- Step 3: List remaining gp2 volumes
- Step 4: Classify what needs action
- Step 5: Put rough savings next to every item
- Where OpsCurb helps
What to look for
- unattached volumes in the
availablestate - old gp2 volumes that may be better migrated to gp3
- disks with weak or missing ownership tags
- stale storage left behind after instance cleanup or migration work
Step 1: Enumerate all enabled regions
Do not start from memory. Build your region list first.
aws ec2 describe-regions --query 'Regions[].RegionName' --output text
Use that list as your audit checklist. One forgotten region can hold a meaningful portion of your storage waste.
Step 2: Find unattached volumes in every region
for region in $(aws ec2 describe-regions --query 'Regions[].RegionName' --output text); do
echo "=== $region unattached volumes ==="
aws ec2 describe-volumes \
--region "$region" \
--filters Name=status,Values=available \
--query 'Volumes[].{VolumeId:VolumeId,Size:Size,VolumeType:VolumeType,CreateTime:CreateTime,Tags:Tags}' \
--output table
done
Capture:
- volume ID
- size
- volume type
- age
- Name or environment tags
If the disk might be useful for recovery, flag snapshot-first as a possible next step.
Step 3: List remaining gp2 volumes
for region in $(aws ec2 describe-regions --query 'Regions[].RegionName' --output text); do
echo "=== $region gp2 volumes ==="
aws ec2 describe-volumes \
--region "$region" \
--filters Name=volume-type,Values=gp2 \
--query 'Volumes[].{VolumeId:VolumeId,Size:Size,State:State,CreateTime:CreateTime,Tags:Tags}' \
--output table
done
This is not a deletion pass. It is an optimization review. Keep migration candidates separate from clearly orphaned disks so the cleanup list stays manageable.
Step 4: Classify what needs action
Use three buckets:
- Delete or snapshot-then-delete: unattached disks with no clear recovery value
- Right-size or migrate: gp2 or oversized storage still in active use
- Investigate ownership: items with unclear tags, recent activity, or uncertain production risk
That saves the team from risky all-at-once cleanup decisions.
Step 5: Put rough savings next to every item
You only need enough precision to rank what to fix first.
- Unattached storage = ongoing storage cost until removal
- gp2 migration candidates = recurring savings after migration
- annualize monthly estimates so leadership sees real long-term value
The queue is easier to act on when every item has an owner and a clear savings frame.
Where OpsCurb helps
OpsCurb surfaces unattached EBS volumes and gp2 migration candidates in the same Core Scan Role-first review. That shortens the path from inventory to a first-scan brief with owner-ready next steps.
Next steps:
- Compare with Unattached EBS volumes
- Compare with gp2 vs gp3 cost savings
- See Pricing if you want recurring storage hygiene checks