Guides · EBS
An EBS volume bills for its full provisioned size whether or not anything is attached to it. Volumes left behind when an instance is terminated, or detached and forgotten, keep billing every month, and so do the disks of instances that were stopped and never cleaned up. Snapshots pile up in the same way. All three are easy to list and usually quick to clean up.
| Storage | Price | Example | Per month |
|---|---|---|---|
| gp2 volume | $0.10 / GB-month | 500 GB, unattached | $50.00 |
| gp3 volume | $0.08 / GB-month | 1,000 GB, unattached | $80.00 |
| Snapshot, standard tier | $0.05 / GB-month | 2,000 GB of snapshot data | $100.00 |
| Snapshot, archive tier | $0.0125 / GB-month | The same 2,000 GB, if archived as full snapshots | $25.00 |
A forgotten 500 GB gp2 volume is $600 a year. Stopped instances are the same problem in another form. AWS doesn't charge for a stopped instance's compute, but its EBS volumes keep billing, and so does any Elastic IP attached to it.
Console: EC2 console → Elastic Block Store → Volumes. Filter by Volume state = Available. "Available" means not attached to any instance. Repeat in each region.
AWS CLI (read-only):
aws ec2 describe-volumes --region us-east-1 --filters Name=status,Values=available \
--query 'Volumes[].[VolumeId,Size,VolumeType,CreateTime,Tags[?Key==`Name`].Value|[0]]' \
--output table
Stopped instances and when they were stopped:
aws ec2 describe-instances --region us-east-1 \
--filters Name=instance-state-name,Values=stopped \
--query 'Reservations[].Instances[].[InstanceId,InstanceType,StateTransitionReason]' --output table
Console: EC2 console → Elastic Block Store → Snapshots, with the Owned by me filter. Sort by Started.
AWS CLI, oldest first:
aws ec2 describe-snapshots --region us-east-1 --owner-ids self \
--query 'sort_by(Snapshots,&StartTime)[].[SnapshotId,VolumeSize,StartTime,Description]' --output table
Snapshots used by your own AMIs (you can't delete these without deregistering the AMI first):
aws ec2 describe-images --region us-east-1 --owners self \
--query 'Images[].BlockDeviceMappings[].Ebs.SnapshotId' --output text
What snapshots cost you: Cost Explorer, grouped by Usage type, shows EBS:SnapshotUsage. That's the real billed total. VolumeSize in the list above is the size of the source volume, not what each snapshot stores.
EBS snapshots are incremental: each one stores only the blocks that changed since the previous snapshot of that volume. When you delete a snapshot, AWS removes only the data that no other snapshot references. Data still used by a later snapshot is kept and billed to that snapshot. AWS's own example: Snap A holds 10 GiB and Snap B adds 4 GiB of changes. Deleting Snap A reduces the bill from 14 GiB to 10 GiB, not to 4.
Deleting a whole chain, such as every snapshot of a volume that no longer exists, frees everything.
aws ec2 delete-volume --volume-id vol-0123456789abcdef0The free checkup finds this and 20 other kinds of issues automatically. It prices every unattached volume and every stopped instance's disks in each region you use. It also lists snapshots older than 90 days that no AMI uses. Because snapshots are incremental, it estimates their share of last month's snapshot bill by size, and marks that estimate low-confidence.
EBS:VolumeUsage.gp2 $0.10, EBS:VolumeUsage.gp3 $0.08, EBS:SnapshotUsage $0.05, EBS:SnapshotArchiveStorage $0.0125 per GB-month; EBS:SnapshotArchiveRetrieval $0.03 per GB; EBS:SnapshotArchiveEarlyDelete for archive data deleted before 90 days.Prices are AWS on-demand list prices for US East (N. Virginia), checked October 3, 2026. Other regions differ.