Old disk snapshots: the basics
Why does a snapshot you took months ago still show up on the bill?
A managed-disk snapshot is a point-in-time copy of a disk, and it keeps costing you money every month it exists, whether or not anyone ever restores from it. Snapshots are taken for good reasons: a safety copy before a risky upgrade, a base image for cloning, a one-off capture before deleting a virtual machine. The problem is the lifecycle. The reason expires, the upgrade succeeds, the migration finishes, but the snapshot stays. It is not attached to anything, nothing alerts on it, and it sits in storage accruing charges until somebody goes looking.
Azure surfaces exactly this in the Cost Optimization workbook on the Storage tab, in a query named 'Disk Snapshots with + 30 Days'. It flags managed-disk snapshots older than thirty days, on the reasonable assumption that a snapshot that has outlived a month of usefulness is a candidate for review. Thirty days is not a hard rule, it is a sensible trigger: long enough that a genuine short-term safety copy has done its job, short enough that the cost has not compounded across a whole estate.
Almost all of this spend is drift, not deliberate retention. A snapshot taken before a VM was decommissioned, never deleted because the VM was. A nightly snapshot script that creates but never prunes. A base-image snapshot kept after the image was published to a gallery. The work is to find every snapshot that has aged past its purpose, confirm it is not the source of a live disk and not part of a retention policy you actually need, and delete the rest. Deleting a snapshot never touches the disk or the VM it came from, so the change is among the safest cost actions in Azure.
In this lesson you will learn why managed-disk snapshots keep costing money long after their reason has passed, how to find every snapshot in a subscription that has aged past thirty days, how to confirm which are safe to delete, and how to put a retention policy in place so the backlog never rebuilds. You will see the exact Azure CLI to inventory and delete aged snapshots, and to create future ones cheaply as incremental snapshots on Standard HDD so retention stays on the cost-effective tier.
The backup that outlived the server it backed up
Snapshots routinely outlive the very thing they were protecting. A common pattern in a clean-up audit is a snapshot taken as a safety copy just before a virtual machine was decommissioned, then left behind when the VM and its disks were deleted, so the original is long gone but the safety copy keeps billing every month. Because a snapshot is an independent object, not a child of the disk, deleting the disk never removes it. Azure helps by billing snapshots only for the used or changed data rather than the full provisioned disk size, and by defaulting incremental snapshots to low-cost Standard HDD, but a copy you will never restore is still pure waste no matter how cheaply it is stored.
Finding aged snapshots across a subscription
Priya runs the platform team at a growing SaaS company. The monthly Azure bill has a steadily rising storage line that nobody can fully explain, and the Cost Optimization workbook points at the Storage tab: 'Disk Snapshots with + 30 Days' lists dozens of snapshots, some more than a year old.
Rather than delete on sight, Priya starts by listing every snapshot with its age and the disk it came from, so a genuine retained base image is not swept up with a forgotten safety copy.
List every snapshot older than 30 days, oldest first, with its size and source. The Azure CLI flattens 'properties', so timeCreated is queryable at the top level.
Age alone does not mean delete. Separate the forgotten safety copies and unpruned script output from the small number of base images you keep on purpose.
How snapshots accrue cost and why deleting one is safedeep dive
A managed-disk snapshot is an independent resource of type 'Microsoft.Compute/snapshots', not a child of the disk it was taken from. It is billed monthly for the storage it occupies, and Azure bills it on the used or changed data rather than the full provisioned size of the source disk: a snapshot of a 512 GiB disk holding 50 GiB of data is billed for roughly the 50 GiB. Incremental snapshots go further, billing only the delta since the previous snapshot in the chain, and they are always stored on low-cost Standard HDD regardless of the parent disk's storage type. Cheap per gigabyte, but a backlog of them across an estate adds up, and none of it buys anything once the snapshot's purpose has passed.
Because the snapshot is independent, deleting it never affects the source disk, the VM, or any running workload. The one dependency to check is the reverse: an incremental snapshot can be the source of a managed disk, or an earlier link in a chain that a later snapshot still needs. The Azure CLI exposes 'creationData.sourceResourceId' and the 'incremental' flag so you can see a snapshot's lineage before deleting. The safe routine is to confirm a snapshot is not the source of a live disk and not a required link in a retained chain, then delete it.
The Cost Optimization workbook's 'Disk Snapshots with + 30 Days' query reads the same data from Azure Resource Graph, filtering 'Microsoft.Compute/snapshots' on 'properties.timeCreated < ago(30d)'. It surfaces the backlog but does not act, so the actual saving comes from a delete pass plus a retention policy that stops the backlog rebuilding. Thirty days is the workbook's trigger, not a Microsoft mandate: set your own threshold per snapshot purpose, but anything that has aged well past its reason and is not a deliberate retained image is recoverable spend.
What is the impact of leaving old snapshots in place?
The direct impact is recurring, compounding storage spend for nothing in return. Each aged snapshot is billed every month it exists, so a backlog that builds from un-pruned scripts and forgotten safety copies becomes a standing line on the bill that grows as fast as snapshots are created and never falls until someone deletes them. Unlike a running service, there is no usage to point to and no value being delivered: a snapshot nobody restores is pure waste, however cheaply Azure stores it.
The second-order impact is clutter and confusion. A subscription thick with months-old snapshots is harder to reason about: it muddies the storage cost picture, hides the snapshots you actually rely on among the ones you forgot, and makes any future audit slower. Clearing the aged ones shrinks the estate to the snapshots that have a current purpose, which are the ones you can name and justify.
The opportunity cost is the saving you are not taking. Because deleting an aged snapshot carries no service trade-off, this is the cheapest run-rate reduction available: no compute to right-size, no resilience to give up, no downtime to schedule. Every month the backlog sits untouched is a month of recoverable spend left on the table, and without a retention policy the backlog simply keeps rebuilding behind any one-off cleanup.
How do you clear old snapshots safely and stop them rebuilding?
Work this as one loop, not a one-off delete. The order matters: inventory and verify before you delete anything, then put a retention policy behind the cleanup so the backlog cannot rebuild.
1. Inventory every snapshot by age and source
List every snapshot past your threshold with its creation date, size and the disk it came from. Treat this inventory as the source of truth rather than the raw workbook count, because what matters is which snapshots are safe to delete, not how many exist. Sort oldest first so the highest-confidence deletions surface at the top.
2. Separate forgotten copies from snapshots you keep on purpose
For each aged snapshot, decide why it exists. Safety copies whose VM is gone and the output of un-pruned snapshot scripts are drift and can be deleted. Base images you clone from, and any snapshot that is still the source of a live disk or a required link in an incremental chain, are kept. Check 'creationData.sourceResourceId' and the 'incremental' flag so you do not break a chain a later snapshot needs.
3. Delete the verified backlog
Delete the snapshots you have confirmed are safe. Deleting a snapshot never touches the source disk, the VM or any running workload, so the change is immediate and reversible only in the sense that you can always take a fresh snapshot later. Prioritise the largest and oldest first, since they carry the most recoverable spend.
4. Put a retention policy behind it
A one-off sweep recovers today's backlog but does nothing about tomorrow's. Bake a known lifespan into how snapshots are created, prune on a schedule, and keep snapshots on default Standard HDD rather than premium storage. This turns a recurring cleanup into a solved problem and a permanently lower storage line.
# 1. Delete snapshots older than 30 days that are NOT the source of any disk.
# timeCreated is queryable at the top level (the CLI flattens 'properties').
CUTOFF=$(date -u -d '30 days ago' '+%Y-%m-%dT%H:%M:%SZ')
az snapshot list \
--query "[?timeCreated<='$CUTOFF'].id" -o tsv \
| while read -r snap_id; do
# Skip any snapshot still used as the source of a managed disk.
in_use=$(az disk list \
--query "[?creationData.sourceResourceId=='$snap_id'] | length(@)" -o tsv)
if [ "$in_use" -eq 0 ]; then
az snapshot delete --ids "$snap_id"
echo "deleted: $snap_id"
else
echo "kept (source of a live disk): $snap_id"
fi
done
# 2. Create future snapshots cheaply (incremental, Standard HDD) so retention
# is enforced and the saved snapshots stay on the cost-effective tier.
az snapshot create \
--resource-group rg-platform \
--name snap-$(date -u '+%Y%m%d') \
--source <source-disk-resource-id> \
--incremental true \
--sku Standard_LRS Quick quiz
Question 1 of 5The Cost Optimization workbook flags dozens of snapshots over 30 days old. What is the most efficient way to act on them?
You scored
0 / 5
Keep learning
Go deeper on how Azure snapshots are billed, how incremental snapshots save money, and how the Cost Optimization workbook surfaces the backlog.
- Understand Azure Disk Storage billing How snapshots are billed on used and changed data, and how incremental snapshots only charge the delta.
- Cost Optimization workbook - Azure Advisor The workbook whose Storage tab includes the 'Disk Snapshots with + 30 Days' query.
- az snapshot command reference The Azure CLI commands to list, inspect, create and delete managed-disk snapshots.
You can now treat old disk snapshots as one capability rather than a creeping line on the bill: inventory every snapshot past your threshold with its age and source, separate the forgotten safety copies and unpruned script output from the few base images you keep on purpose, delete the verified backlog with no service trade-off, and put a retention policy behind the sweep so it cannot rebuild. Deleting a snapshot never touches the disk or VM it came from, which makes this among the safest savings actions in Azure.
Back to the library