How to Find and Delete Unattached EBS Volumes Draining Your AWS Bill
Why Unattached EBS Volumes Hurt Your Bottom Line
Unattached ("available") EBS volumes keep accruing per‑GB‑month charges even though they serve no workload. A 100 GB gp3 volume costs roughly $0.08 / GB‑month, so a single forgotten volume can add $8 each month. Multiply that across teams and environments, and the waste quickly eclipses the cost of a small monitoring tool.
Identify Unattached Volumes in the AWS Console
- Open the EC2 Dashboard → Volumes.
- In the Filter dropdown, select State → available. This instantly shows every volume not attached to an instance.
- Add the Created column (gear icon) to see how old each volume is.
- Use the Tags column to spot volumes that lack a
OwnerorEnvironmenttag – those are often orphaned. - For each volume, click Actions → Create Snapshot if you need a backup before deletion, then Delete Volume.
Find Unattached Volumes with the AWS CLI
The CLI is faster for large accounts or automated scripts. Run the following command to list all available volumes with useful fields:
aws ec2 describe-volumes \
--filters Name=status,Values=available \
--query 'Volumes[*].[VolumeId,Size,CreateTime,Tags]' \
--output table
The output shows VolumeId, size in GiB, creation timestamp, and any tags. To narrow results to volumes older than 30 days, pipe to jq:
aws ec2 describe-volumes \
--filters Name=status,Values=available \
--query 'Volumes[?CreateTime<`$(date -d "30 days ago" -Iseconds)`].[VolumeId,Size,CreateTime]' \
--output table
Replace the date logic with your preferred shell syntax if not using GNU date.
Evaluate Before Deleting: Snapshot or Retain?
Not every unattached volume is trash. Follow this checklist:
- Critical data? If the volume held databases, logs, or stateful data, create a snapshot first:
bash
aws ec2 create-snapshot --volume-id vol-0abcd1234ef567890 --description "Pre‑delete backup $(date +%F)"
- Retention policy? If your organization keeps snapshots for 90 days, tag the snapshot with Retention=90 and let a lifecycle policy clean it up.
- Tag audit. Volumes with a Purpose=Backup tag may be intentionally detached for off‑peak storage. Verify with the owning team before removal.
- Cost impact. Multiply Size (GiB) by the per‑GB price of the volume type (e.g., gp3 $0.08/GB‑mo) to estimate monthly waste.
Delete Safely Using CLI or Console
Once you confirm a volume can be removed, delete it with one of the following methods:
CLI Deletion
aws ec2 delete-volume --volume-id vol-0abcd1234ef567890
The command returns no output on success. To batch‑delete volumes older than 30 days:
aws ec2 describe-volumes \
--filters Name=status,Values=available \
--query 'Volumes[?CreateTime<`$(date -d "30 days ago" -Iseconds)`].VolumeId' \
--output text | tr '\t' '\n' | while read vol; do
echo "Deleting $vol"
aws ec2 delete-volume --volume-id $vol
done
Console Deletion
- Select the volume(s) in the Volumes list.
- Choose Actions → Delete Volume.
- Confirm the prompt.
Prevent Future Orphans
- Tag at creation: Include
Owner,Environment, andExpirationtags when provisioning volumes via CloudFormation, Terraform, or the CLI. - Lifecycle policies: Use AWS Data Lifecycle Manager (DLM) to automatically snapshot and delete volumes after a defined period.
- Scheduled audit: Add a monthly CloudWatch Event that triggers a Lambda function running the CLI snippet above, sending a Slack alert with any volumes that remain after 60 days.
How CloudBudgetMaster helps: Our platform continuously scans your AWS account, flags every unattached EBS volume, shows the exact dollar impact, and offers a one‑click delete (or snapshot‑then‑delete) button, so you never lose track of idle storage again.
CloudBudgetMaster