Storage best practices Discover essential FinOps best practices to optimize cost efficiency and governance for your Azure storage resources.
On this page
Backup
Query: Idle backups
This Azure Resource Graph (ARG) query analyzes backup items within Azure Recovery Services Vaults and identifies those that have not had a backup for over 90 days.
Category
Optimization
Query
recoveryservicesresources
| where type =~ 'microsoft.recoveryservices/vaults/backupfabrics/protectioncontainers/protecteditems'
| extend vaultId = tostring(properties.vaultId)
| extend resourceId = tostring(properties.sourceResourceId)
| extend idleBackup= datetime_diff('day', now(), todatetime(properties.lastBackupTime)) > 90
| extend resourceType=tostring(properties.workloadType)
| extend protectionState=tostring(properties.protectionState)
| extend lastBackupTime=tostring(properties.lastBackupTime)
| extend resourceGroup=strcat('/subscriptions/',subscriptionId,'/resourceGroups/',resourceGroup)
| extend lastBackupDate=todatetime(properties.lastBackupTime)
| where idleBackup != 0
| project resourceId,vaultId,idleBackup,lastBackupDate,resourceType,protectionState,lastBackupTime,location,resourceGroup,subscriptionId
Query: List Recovery Services Vaults
This Azure Resource Graph (ARG) query retrieves details of Azure Recovery Services Vaults. The query also includes information on the SKU tier, redundancy settings, and other relevant metadata.
Category
Optimization
Query
resources
| where type == 'microsoft.recoveryservices/vaults'
| where resourceGroup in ({ResourceGroup})
| extend skuTier = tostring(sku['tier'])
| extend skuName = tostring(sku['name'])
| extend resourceGroup = strcat('/subscriptions/', subscriptionId, '/resourceGroups/', resourceGroup)
| extend redundancySettings = tostring(properties.redundancySettings['standardTierStorageRedundancy'])
| order by id asc
| project id, redundancySettings, resourceGroup, location, subscriptionId, skuTier, skuName
Disks
Query: Idle disks
This Azure Resource Graph (ARG) query identifies idle or unattached managed disks within your Azure environment.
Category
Optimization
Query
resources
| where type =~ 'microsoft.compute/disks' and managedBy == ""
| extend diskState = tostring(properties.diskState)
| where managedBy == ""
and diskState != 'ActiveSAS'
and tags !contains 'ASR-ReplicaDisk'
and tags !contains 'asrseeddisk'
| extend DiskId=id, DiskIDfull=id, DiskName=name, SKUName=sku.name, SKUTier=sku.tier, DiskSizeGB=tostring(properties.diskSizeGB), Location=location, TimeCreated=tostring(properties.timeCreated), SubId=subscriptionId
| order by DiskId asc
| project DiskId, DiskIDfull, DiskName, DiskSizeGB, SKUName, SKUTier, resourceGroup, Location, TimeCreated, subscriptionId
Query: Disk snapshot older than 30 days
This Azure Resource Graph (ARG) query identifies disk snapshots that are older than 30 days.
Category
Optimization
Query
resources
| where type == 'microsoft.compute/snapshots'
| extend TimeCreated = properties.timeCreated
| extend resourceGroup = strcat("/subscriptions/",subscriptionId,"/resourceGroups/",resourceGroup)
| where TimeCreated < ago(30d)
| order by id asc
| project id, resourceGroup, location, TimeCreated, subscriptionId
Query: Snapshot using premium storage
This Azure Resource Graph (ARG) query identifies disk snapshots that are utilizing premium storage.
Category
Optimization
Query
resources
| where type == 'microsoft.compute/snapshots'
| extend
StorageSku = tostring(sku.tier),
resourceGroup = strcat('/subscriptions/',subscriptionId,'/resourceGroups/',resourceGroup),
diskSize = tostring(properties.diskSizeGB)
| where StorageSku == "Premium"
| project id, name, StorageSku, diskSize, location, resourceGroup, subscriptionId
Storage accounts
Query: Storage account v1
This Azure Resource Graph (ARG) query identifies storage accounts that are still using the legacy v1 kind, which may not provide the same features and efficiencies as newer storage account types.
Category
Optimization
Query
resources
| where type =~ 'Microsoft.Storage/StorageAccounts'
and kind !='StorageV2'
and kind !='FileStorage'
| where resourceGroup in ({ResourceGroup})
| extend
StorageAccountName = name,
SAKind = kind,
AccessTier = tostring(properties.accessTier),
SKUName = sku.name,
SKUTier = sku.tier,
Location = location
| order by id asc
| project
id,
StorageAccountName,
SKUName,
SKUTier,
SAKind,
AccessTier,
resourceGroup,
Location,
subscriptionId
🙋♀️ Looking for more?
We’d love to hear about any datasets you’re looking for. Create a new issue with the details that you’d like to see either included in existing or new best practices.
🧰 Related tools
- 📒 FinOps workbooks – Customizable home for engineers to maximize cloud ROI through FinOps.
- 📒 Optimization workbook – Central hub for cost optimization.