EBS Volume Optimization: Right Type, Less Waste
Migrate gp2 to gp3 and clean up orphaned snapshots.
EBS: The Silent Cost Accumulator
EBS volumes are provisioned and paid for whether you use them or not. Orphaned volumes, oversized snapshots, and legacy gp2 volumes are three common sources of waste that add up to thousands per month in larger environments.
gp3 vs gp2: A Simple Win
| Feature | gp2 | gp3 |
|---|---|---|
| Base cost | $0.10/GB/mo | $0.08/GB/mo (20% cheaper) |
| Baseline IOPS | 3 IOPS/GB (min 100) | 3,000 IOPS included |
| Baseline throughput | 128-250 MB/s (size dependent) | 125 MB/s included |
| Max IOPS | 16,000 (at 5.3 TB+) | 16,000 (provisioned independently) |
For volumes under 1 TB, gp3 provides better performance at lower cost. The migration is online and non-disruptive:
aws ec2 modify-volume --volume-id vol-abc123 --volume-type gp3
Finding and Cleaning Orphaned Resources
# Find unattached EBS volumes
aws ec2 describe-volumes \
--filters Name=status,Values=available \
--query 'Volumes[].{ID:VolumeId,Size:Size,Created:CreateTime}' \
--output table
# Find old snapshots (older than 90 days)
aws ec2 describe-snapshots --owner-ids self \
--query 'Snapshots[?StartTime<`2025-11-01`].{ID:SnapshotId,Size:VolumeSize,Date:StartTime}' \
--output table
Automation with Data Lifecycle Manager
AWS DLM automates snapshot creation and cleanup. Create a lifecycle policy that:
- Takes daily snapshots of tagged volumes
- Retains snapshots for 14 days (production) or 3 days (dev)
- Cross-region copies for disaster recovery
Right-Sizing Volume IOPS
Check actual IOPS usage in CloudWatch before provisioning expensive io2 volumes. Most workloads need far less than the provisioned capacity. Use the VolumeReadOps and VolumeWriteOps metrics to baseline your actual requirements.
Real-world result: Migrating 200 gp2 volumes to gp3 and deleting 45 orphaned volumes saved a client $2,800/month — a 15-minute scripted operation.