Azure Cost Optimization: 10 Ways to Cut Your Bill
Azure overspend is rarely one bad purchase. It is usually the accumulation of defaults: VMs sized for peak load, managed disks left behind after VM deletion, dev environments running all weekend, backup and log retention copied from production, and data moving across regions without a cost model. If spend is rising faster than usage, start with these patterns.
Start With the Bill Pattern, Not a Random Rightsizing Exercise
Do not start by sorting Cost Management by total cost and resizing the largest resource. That can help, but it often misses the pattern driving the bill.
Break the last 90 days of spend down by subscription, resource group, service, meter category, region, and tag. Use Microsoft Cost Management, Azure Advisor, Azure Resource Graph, and exported cost data where needed. Look for month-over-month growth, daily spikes, weekend baseline spend, resources without owner tags, and services whose unit cost changed after a release or migration.
Most savings work falls into four buckets: steady-state compute, storage and backup growth, platform services that scale quietly, and network or licensing charges that were not modeled during design. Each bucket needs a different lever. A production SQL Server VM running 24/7 is not optimized the same way as a test AKS cluster, an over-retained Recovery Services vault, or a cross-region analytics pipeline.
Set an initial target around low-risk waste: stopped or unattached resources, non-production schedules, oversized VMs, excessive retention, and unowned spend. Deeper savings usually require architecture changes, autoscaling changes, commitment planning, or policy enforcement.
1-3: Cut Compute Waste Before Buying Commitments
Do not buy reservations first and optimize later. Remove waste, rightsize the remaining baseline, then commit only to usage that is predictably stable.
Rightsize VMs using real utilization, not provisioned size. Review CPU, memory, disk IOPS, disk throughput, latency, and network over at least 30 days. A VM with low average CPU may still need its size if memory is consistently high or storage latency is constrained. Conversely, many D-series and E-series VMs are oversized because they were copied from an on-premises estimate. Moving from D8s_v5 to D4s_v5 can materially reduce compute cost, but validate memory and storage limits before changing size.
Schedule non-production workloads. Dev, test, training, sandbox, and UAT resources should not run 24/7 unless they have an explicit exception. A VM running 10 hours per weekday instead of 168 hours per week reduces runtime by about 70%. Use Azure Automation, DevTest Labs auto-shutdown, Start/Stop VMs v2, or pipelines that create and destroy environments. The control point is the rule: non-production must have an operating schedule or a documented exemption.
Use commitments only for stable baselines. After rightsizing, measure what runs consistently. Azure Reserved VM Instances, Azure SQL reserved capacity, Azure Cosmos DB reserved capacity, and Azure savings plan for compute can reduce eligible usage costs, but they are poor substitutes for cleanup. Commit to the portion of usage you expect to keep for the term, not the peak from a migration, load test, or temporary project.
4-6: Stop Storage, Backup, and Log Growth From Becoming the New Tax
Storage and telemetry costs grow quietly because retention, snapshots, diagnostics, and logs compound over time.
Remove unattached and orphaned resources. Unattached managed disks can remain billable after VM deletion. Premium SSDs are especially expensive when no workload uses them. Also review old snapshots, custom images, unattached Standard public IP addresses, idle load balancers, and NICs attached to decommissioned patterns. Run a monthly cleanup report that flags resources with no parent, no recent activity, or no valid owner tag. Require owner approval or a retention window before deletion.
Tier storage intentionally. Blob data should not stay in the hot tier by default. Use lifecycle management policies to move data to cool, cold, or archive tiers based on access and recovery requirements. Account for retrieval cost, rehydration time, early deletion charges, and application behavior before moving operational data. A common pattern is hot for active data, cool or cold for infrequently accessed data, and archive for compliance records that do not need immediate access. Review redundancy as well: ZRS, GRS, and RA-GRS are valuable for the right workloads, but unnecessary for disposable or reproducible data.
Put explicit retention limits on backups and logs. Recovery Services vaults, Backup vaults, Azure Monitor Logs, Application Insights, and diagnostic settings can become major cost drivers. A 730-day retention policy copied across every workload is rarely appropriate. Separate operational monitoring from audit or compliance retention. For Log Analytics workspaces, review ingestion volume, table-level retention, Basic Logs or archive options where suitable, verbose diagnostic categories, and noisy sources such as Azure Firewall, Web Application Firewall, containers, and platform logs. Keep the data teams query or must retain; stop ingesting high-volume data with no owner or use case.
7-8: Fix Architecture Choices That Create Recurring Cost
Some cost problems are built into the architecture and cannot be fixed from the billing portal alone.
Reduce unnecessary data movement. Model cross-region traffic, inter-region VNet peering, internet egress, firewall data processing, NAT Gateway usage, and analytics pipelines that copy large datasets. Common problems include applications in one region reading databases in another, backup or reporting jobs moving data across regions by default, and hub-and-spoke designs that hairpin traffic through appliances without a security or routing need. Co-locate compute and data for data-heavy workloads unless resilience, compliance, or latency requirements justify the cost.
Revisit always-on platform service tiers. Azure SQL, App Service Plans, API Management, Azure Firewall, Application Gateway, Azure Cosmos DB, and Azure Kubernetes Service can all be cost-effective when sized and scaled correctly. Review SKU, scale setting, environment, utilization, and feature requirements. Examples to check: an App Service Plan sized for production but hosting one low-traffic app, API Management Premium used in non-production where Developer or a lower tier is sufficient, Cosmos DB provisioned throughput left high after a test, AKS node pools with low utilization because requests and cluster autoscaler are misconfigured, or Azure Firewall deployed where the traffic pattern does not justify the fixed hourly cost.
9-10: Make Savings Stick With Governance and Showback
One-time cleanup does not change behavior. Durable savings require ownership, guardrails, and cost feedback close to the engineering teams making design choices.
Enforce tags, budgets, and alerts that map to accountability. Require owner, application, environment, cost center, and business criticality tags. Configure budgets at subscription, resource group, or management group scope, and route alerts to the team that can act. Use forecasted spend alerts after releases, migrations, and load tests. Treat untagged spend as a defect, not an accounting inconvenience.
Use Azure Policy and deployment standards to prevent expensive defaults. Azure Policy can audit or deny disallowed SKUs, regions, missing tags, public IP creation, and resource types; it can also help deploy required settings through deployIfNotExists policies. Infrastructure as Code should standardize tagging, SKUs, autoscale rules, backup retention, diagnostic settings, and approved regions. Start with audit mode to understand impact, then enforce low-risk controls. Denying untagged production resources is usually reasonable; denying every non-standard SKU without an exception path encourages workarounds.
Where Most Azure Savings Projects Fail
Azure cost reduction fails when it stays tactical or becomes theoretical. Tactical-only work deletes a few disks and resizes a few VMs while the architecture keeps producing waste. Theory-only work creates dashboards and policies that teams do not use.
Use a rolling cadence: discover, prioritize, act, verify, and govern. For each recommendation, record expected monthly savings, owner, risk level, rollback plan, and validation metric. A VM resize needs a performance validation window. A log retention change needs approval from the workload owner and any compliance stakeholder. A reservation or savings plan purchase needs a workload mapping and renewal owner. Do not count savings until billing data confirms the change.
Cost optimization is not the same as minimizing spend. Multi-region resilience, security telemetry, low latency, and compliance retention all cost money. The test is whether the spend is intentional, owned, and aligned to a requirement. Waste is spend with no owner, no requirement, or no measured value.
Azure Cost Optimization Checklist
| # | Savings lever | What to check | Practical action | Typical impact |
|---|---|---|---|---|
| 1 | Rightsize VMs | CPU, memory, disk IOPS, throughput, latency, and network over 30+ days | Downsize, change VM family, or adjust disks after validation | Medium to high |
| 2 | Schedule non-prod | Weekend and overnight baseline spend | Auto-shutdown or redeploy dev, test, UAT, sandbox, and training environments | High for non-prod-heavy tenants |
| 3 | Buy commitments after cleanup | Stable eligible usage that runs consistently | Use reservations or Azure savings plan for compute only for predictable baselines | Medium to high |
| 4 | Remove orphaned resources | Unattached managed disks, snapshots, images, unattached Standard public IPs, idle load balancers | Run monthly cleanup with owner approval and deletion windows | Quick win |
| 5 | Tier storage | Blob access patterns, redundancy, retrieval requirements, early deletion risk | Apply lifecycle policies; move data to cool, cold, or archive only where suitable | Medium |
| 6 | Control backup and log retention | Vault policies, Log Analytics ingestion, table retention, diagnostic categories | Set workload-specific retention; reduce or redirect noisy ingestion | Medium to high |
| 7 | Reduce data movement | Cross-region traffic, inter-region peering, egress, firewall processing, NAT Gateway use | Co-locate services or redesign routing where the cost is not justified | Medium, sometimes high |
| 8 | Review platform SKUs | Azure SQL, App Service, API Management, Azure Firewall, Application Gateway, AKS, Cosmos DB | Match tiers, autoscale rules, and capacity to each environment | Medium to high |
| 9 | Enforce ownership | Missing tags, unowned subscriptions, budget alert routing | Require owner, application, environment, cost center, and criticality tags | Prevents recurrence |
| 10 | Govern expensive defaults | Regions, SKUs, public IPs, diagnostics, retention, resource types | Use Azure Policy and IaC standards with documented exceptions | Prevents recurrence |
Use the order deliberately: remove waste, rightsize and redesign where needed, purchase commitments for the stable baseline, then enforce governance. Buying commitments before cleanup can lock in yesterday's waste.
Key takeaways
- Most Azure savings come from recurring patterns: oversized compute, always-on non-production, uncontrolled retention, platform SKU drift, data movement, and unowned resources.
- Do rightsizing and cleanup before buying reservations or Azure savings plan for compute.
- Storage, backup, logs, and data transfer need explicit retention, tiering, and architecture decisions.
- Durable savings require ownership tags, budgets, policy, deployment standards, and verification against actual billing data.
If you need a prioritized plan instead of a generic cost report, IT Partner can help with an Azure Cost Optimization and FinOps Assessment. We identify evidence-backed savings opportunities, estimate impact, and separate low-risk quick wins from architecture changes that need deeper planning.
Questions this article didn’t answer?
Thirty minutes with Mike — our CEO, not a sales rep. Bring the hard version of the question.