Skip to main content
Back to the Azure Footguns Database
CostGovernanceLowCommonAZF-0011

Disk snapshots nobody deletes bill per-GB storage forever

A disk snapshot is a point-in-time copy that never expires on its own. Kept past its useful life, it accrues per-GB storage charges every month until someone deletes it.

Footgun ID
AZF-0011 (Azure Footgun No. 11)
Azure service
Azure Managed Disks
Resource type
Microsoft.Compute/snapshots
Updated
July 1, 2026

What it is

A managed-disk snapshot left in place long after the reason for taking it has passed. A snapshot is a full point-in-time copy of a disk, billed on the storage it occupies. It has no expiry and no lifecycle policy of its own, so it keeps charging until a human removes it.

Impact (cost)
~$0.05/GB/month at list price for Standard HDD snapshot storage, indefinitely
Basis: Azure list price. Figures are estimates, not measurements.

Why it happens

Snapshots are cheap and easy to create: before a risky change, ahead of a migration, as a one-off backup, or automatically by a script. None of that comes with cleanup. Azure never expires a snapshot for you, and there is no built-in retention policy on the snapshot itself.

So they accumulate. A snapshot from a migration two years ago looks identical to one taken last night, and nobody is sure which are still needed. Individually the monthly charge is small enough to ignore, which is exactly why the pile grows.

What it costs / blast radius

Standard HDD snapshot storage is roughly $0.05/GB per month at list price, and snapshots bill on the used size of the source data. (List price; tier and region vary.) One forgotten 512 GB snapshot is around $25/month, or $300/year, for a copy of a disk that may no longer exist. The real cost is the accumulation: years of pre-change and pre-migration snapshots, each too small to notice on its own, adding up across every subscription.

See it

Find them: snapshots older than 30 days, across every subscription
// sizeGB below is the PROVISIONED disk size; snapshots actually bill on
// used/incremental size, so treat it as an upper bound, not the exact charge.
Resources
| where type =~ 'microsoft.compute/snapshots'
| extend created = todatetime(properties.timeCreated)
| where created < ago(30d)
| project name, resourceGroup, subscriptionId, location,
          sizeGB = properties.diskSizeBytes / 1024 / 1024 / 1024,
          ageDays = datetime_diff('day', now(), created)
| order by ageDays desc
Fix: confirm it's no longer needed, then delete the snapshot
# Snapshots are independent of their source disk — deleting one is safe
az snapshot delete --name disk-prod-04-snap-2024 --resource-group rg-prod

How StratoLens helps

StratoLens inventories every snapshot across every subscription, surfaces the stale ones with their age and monthly storage cost, and keeps the history so you can see when each was taken. A retention question that usually ends in a shrug gets an answer, and the check runs continuously inside your own tenant instead of depending on someone remembering to look.

Start Your 28-Day Free Trial

Every feature unlocked. Deploys to your Azure tenant. No data leaves your tenant.

Available now on the Azure Marketplace.

Built for Azure infrastructure teams who need complete visibility across their entire estate.