Cloud cost optimization is not about cutting corners. It is about spending deliberately and eliminating waste. After helping multiple organizations reduce their Azure bills by 30-50%, I have developed a repeatable framework that balances cost efficiency with performance and reliability.
Start With Visibility
You cannot optimize what you cannot see. The first step is always establishing cost visibility across your organization.
Tagging Strategy
Every resource must be tagged. No exceptions. At minimum, enforce these tags via Azure Policy:
{
"mode": "Indexed",
"policyRule": {
"if": {
"anyOf": [
{ "field": "tags['CostCenter']", "exists": "false" },
{ "field": "tags['Environment']", "exists": "false" },
{ "field": "tags['Owner']", "exists": "false" }
]
},
"then": {
"effect": "deny"
}
}
}
Budget Alerts
Configure Azure Cost Management budgets for every team and environment. I set alerts at 50%, 75%, 90%, and 100% thresholds with escalating notification channels:
az consumption budget create \
--budget-name "engineering-monthly" \
--amount 15000 \
--time-grain Monthly \
--category Cost \
--resource-group "rg-engineering" \
--notifications '{
"50percent": {
"enabled": true,
"operator": "GreaterThanOrEqualTo",
"threshold": 50,
"contactEmails": ["team-lead@company.com"]
},
"90percent": {
"enabled": true,
"operator": "GreaterThanOrEqualTo",
"threshold": 90,
"contactEmails": ["team-lead@company.com", "engineering-director@company.com"]
}
}'
The Low-Hanging Fruit
These optimizations require minimal effort and typically save 15-25% immediately.
Rightsize Compute Resources
Most VMs and App Service plans are over-provisioned. Use Azure Advisor recommendations and actual CPU/memory metrics to identify downsizing opportunities. A VM running at 10% CPU average is wasting 90% of your spend on that resource.
Delete Orphaned Resources
Unattached disks, unused public IPs, empty resource groups, and forgotten test environments accumulate quickly. Schedule a monthly cleanup review:
# Find unattached managed disks
az disk list --query "[?managedBy==null].{Name:name, Size:diskSizeGb, RG:resourceGroup}" -o table
# Find unused public IPs
az network public-ip list --query "[?ipConfiguration==null].{Name:name, RG:resourceGroup}" -o table
# Find unused Network Security Groups
az network nsg list --query "[?length(networkInterfaces)==\`0\` && length(subnets)==\`0\`].{Name:name, RG:resourceGroup}" -o table
Use Reserved Instances
For workloads that run 24/7 with predictable capacity, reserved instances save 40-72% compared to pay-as-you-go pricing. Start with 1-year reservations for database servers and core application infrastructure.
Architectural Cost Optimization
Beyond rightsizing, your architecture itself determines your cost profile.
Auto-Scaling Done Right
Auto-scaling saves money only if you also scale down. Configure both scale-out and scale-in rules, and set appropriate cooldown periods to avoid thrashing:
// In .NET Aspire AppHost
var api = builder.AddProject<Projects.MyApi>("api")
.WithReplicas(1, 5) // Min 1, Max 5
.PublishAsAzureContainerApp((module, app) =>
{
app.Template.Value!.Scale.Value!.MinReplicas = 1;
app.Template.Value!.Scale.Value!.MaxReplicas = 5;
app.Template.Value!.Scale.Value!.Rules = new()
{
new ContainerAppScaleRule
{
Name = "http-scaling",
Http = new ContainerAppHttpScaleRule
{
Metadata = { { "concurrentRequests", "50" } }
}
}
};
});
Tiered Storage
Not all data needs premium storage. Implement lifecycle policies that move data to cooler tiers as it ages:
- Hot tier: Active data accessed frequently (last 30 days)
- Cool tier: Infrequently accessed data (30-90 days), 50% cheaper
- Archive tier: Rarely accessed data (90+ days), 90% cheaper
Spot Instances for Non-Critical Workloads
Batch processing, CI/CD agents, and dev/test environments are perfect candidates for Spot VMs, which offer up to 90% savings. Design these workloads to handle preemption gracefully.
Building a FinOps Culture
Tools and techniques alone do not sustain cost optimization. You need a culture that values efficient spending.
- Make costs visible to engineers: Share cost dashboards in team channels. When developers see the impact of their architectural decisions, they make better choices.
- Include cost in architecture reviews: Every design document should estimate monthly costs and compare alternatives.
- Celebrate savings: Recognize team members who identify and implement cost optimizations. It reinforces the behavior.
- Monthly FinOps reviews: Bring engineering and finance together to review trends, anomalies, and upcoming changes.
Measuring Success
Track these metrics monthly:
- Total spend vs budget: Are you staying within targets?
- Cost per transaction/user/request: Is your unit economics improving?
- Waste ratio: What percentage of provisioned capacity is actually used?
- Reservation coverage: Are you maximizing committed-use discounts?
Cloud cost optimization is an ongoing practice, not a one-time project. Build it into your team's rhythm and the savings compound over time.

Comments (3)
I have a question: does this also apply to older versions?
I agree, great article!
Exactly! I had the same thought.
Thanks for sharing — very helpful.
Could you elaborate on this topic in a follow-up post?
Leave a comment