At scale, commitment discounts and architecture choices change the bill by tens of percent.
Once usage is understood, optimize in this order: eliminate waste (idle resources, orphaned disks, oversized logs), rightsize (Advisor and utilization metrics), re-architect (autoscale, serverless, Spot for interruptible work, storage tiering), and finally commit.
Commitment discounts:
- Reservations: 1- or 3-year commitment to a specific resource type and region (VM family with instance size flexibility, SQL vCores, Cosmos DB RU/s, App Service, storage capacity). Deepest discounts, least flexible; can be exchanged within limits.
- Savings plan for compute: an hourly spend commitment for 1 or 3 years that applies automatically across VM sizes, regions and several compute services (VMs, App Service, Functions Premium, Container Apps and others). More flexible, slightly smaller discount. A separate savings plan for databases does the same for SQL, PostgreSQL, MySQL and Cosmos DB. Reservations are applied first; savings plans cover what remains.
- Azure Hybrid Benefit: reuse Windows Server and SQL Server licenses with Software Assurance.
- Dev/Test subscriptions: discounted rates for non-production.
Commit only to the stable baseline (look at the minimum hourly usage over months), never to peaks. Use the amortized cost view to see commitment costs spread over the resources that consume them, and exports (FOCUS format) for showback per team. FinOps is continuous: owners per cost center, budgets per subscription, monthly reviews, and anomaly alerts.
Example
# Rightsizing and shutdown candidates from Advisor
az advisor recommendation list --category Cost \
--query "[].{impact:impact, resource:impactedValue, problem:shortDescription.problem}" -o table
# Orphaned managed disks (attached to nothing, still billed)
az disk list --query "[?diskState=='Unattached'].{name:name, sizeGb:diskSizeGb, sku:sku.name}" -o table
# Public IPs not associated with anything
az network public-ip list --query "[?ipConfiguration==null].{name:name, rg:resourceGroup}" -o table
# Rightsizing evidence: peak hourly CPU of a VM over the last 14 days
az monitor metrics list --resource "$VM_ID" --metric "Percentage CPU" \
--aggregation Maximum --interval PT1H --offset 14d \
--query "max(value[0].timeseries[0].data[].maximum)"
# 23.5 -> a smaller size (or a B-series) would doRemember
- Eliminate, rightsize, re-architect, then commit
- Reservations: specific and deepest; savings plan: flexible hourly commitment
- Commit to the steady baseline, not the peak
- Amortized views and exports enable per-team showback
Watch out for
- Buying 3-year reservations for workloads about to be migrated to PaaS or containers.