Company: TechCorp Financial Services
TechCorp's Azure bill grew from $5K/month to $47K/month in 6 months. The CFO is asking:
"Who's spending what? Why is it so high? Can we control it?"
The Problem:
Your Challenge: Implement cost allocation, budgets, and controls
The Solution You'll Build:
COST ALLOCATION BY DEPARTMENT:├─ Finance Department: $15K/month
│ ├─ Production databases: $10K
│ ├─ Development environment: $3K
│ └─ Disaster recovery: $2K
│
├─ Engineering Department: $28K/month
│ ├─ Microservices (Prod): $18K
│ ├─ Kubernetes cluster: $7K
│ └─ Development/Testing: $3K
│
└─ Operations: $4K/month
├─ Infrastructure: $3K
└─ Monitoring & Backup: $1K
TOTAL: $47K/month with full visibility ✓
Budget Controls:
Department Budgets:├─ Finance: Budget $16K/month → Alert at $14.4K (90%)
├─ Engineering: Budget $30K/month → Alert at $27K (90%)
├─ Operations: Budget $5K/month → Alert at $4.5K (90%)
└─ Each department owns their costs
Cost Optimization:
Policies Prevent Expensive Mistakes:├─ Only allow Standard<em>B and Standard</em>D VMs (block Premium)
├─ Only allow LRS/ZRS storage (block expensive GRS)
├─ Limit resources to cost-optimized regions
└─ Require resource owners to tag everything
Required Knowledge:
Required Permissions:
Cost Note: This lab uses existing resources (creates no new costs). Uses free Cost Management features.
Total: 90 minutes
Difficulty: Intermediate
Before you can track costs, you need a consistent tagging strategy. Every resource must be tagged the same way.
Step 1: Define Tagging Standards
Create a company-wide tagging standard that covers:
REQUIRED TAGS FOR ALL RESOURCES:════════════════════════════════════════════════════════════
Tag 1: CostCenter
├─ Purpose: Chargeback to department
├─ Values: Finance, Engineering, Operations, Training
├─ Example: CostCenter = Engineering
└─ Why: Bills can be grouped by cost center
Tag 2: Environment
├─ Purpose: Separate prod/dev costs
├─ Values: Production, Staging, Development
├─ Example: Environment = Production
└─ Why: Production usually costs 5x more than Dev
Tag 3: Owner
├─ Purpose: Know who to ask about resource
├─ Values: Email addresses of resource owners
├─ Example: Owner = john.smith@techcorp.com
└─ Why: Accountability for resource decisions
Tag 4: Project
├─ Purpose: Track costs per application/project
├─ Values: ProjectName (e.g., CustomerPortal, DataPipeline)
├─ Example: Project = CustomerPortal
└─ Why: Know which projects are expensive
Tag 5: LifeCycle
├─ Purpose: Know if resource is temporary or permanent
├─ Values: Permanent, Temporary, Trial
├─ Example: LifeCycle = Temporary
└─ Why: Clean up temporary test resources
Step 2: Create Tagging Documentation
Document your tagging standard so everyone uses it consistently:
TAGGING STANDARD - TECHCORP════════════════════════════════════════════════════════════
All resources MUST have these tags (5 required tags):
Resource Template:
├─ Name: [resource-type]-[environment]-[project]
├─ CostCenter: [Finance|Engineering|Operations|Training]
├─ Environment: [Production|Staging|Development]
├─ Owner: your.email@techcorp.com
├─ Project: ProjectName
└─ LifeCycle: [Permanent|Temporary|Trial]
Example - Production Database:
├─ Name: sql-prod-customerdb
├─ CostCenter: Finance
├─ Environment: Production
├─ Owner: data-team@techcorp.com
├─ Project: CustomerPortal
└─ LifeCycle: Permanent
Example - Development VM:
├─ Name: vm-dev-testing
├─ CostCenter: Engineering
├─ Environment: Development
├─ Owner: dev-team@techcorp.com
├─ Project: DataPipeline
└─ LifeCycle: Temporary (delete after 30 days)
FAILURE TO TAG = Resource cannot be created (policy will deny)
Step 3: Review Current Resources (Audit)
Check what resources exist and how they're currently tagged:
CURRENT TAGGING AUDIT═════════════════════════════════════════════════════════════
Resource Type: Virtual Machines
├─ Total: 12 VMs
├─ Properly tagged: 3 (25%)
├─ Missing tags: 9 (75%)
└─ Action: Need to retroactively tag
Resource Type: Storage Accounts
├─ Total: 8 accounts
├─ Properly tagged: 2 (25%)
├─ Missing tags: 6 (75%)
└─ Action: Need to retroactively tag
Resource Type: SQL Databases
├─ Total: 4 databases
├─ Properly tagged: 0 (0%)
├─ Missing tags: 4 (100%)
└─ Action: Tag immediately
SUMMARY:
├─ Total resources: 24
├─ Properly tagged: 5 (21%)
├─ Need tagging: 19 (79%)
└─ Priority: HIGH - most resources untagged
Step 4: Tag Existing Resources
Update existing resources with proper tags:
For each resource without tags:
- CostCenter
- Environment
- Owner
- Project
- LifeCycle
Example PowerShell script to tag resources in bulk:
<h1>Tag all resources in a resource group</h1>$rg = Get-AzResourceGroup -Name "rg-production"
$tags = @{
"CostCenter" = "Engineering"
"Environment" = "Production"
"Owner" = "engineering-team@techcorp.com"
"Project" = "CustomerPortal"
"LifeCycle" = "Permanent"
}
$resources = "function">Get-AzResource -ResourceGroupName $rg.ResourceGroupName
foreach ($resource in $resources) {
Update-AzTag -ResourceId $resource.ResourceId -Tag $tags -Operation Merge
}
Step 5: Document Tagging Completion
TAGGING COMPLETION SUMMARY═════════════════════════════════════════════════════════════
Resource Type: VMs
├─ Total: 12
├─ Tagged: 12 (100%)
└─ Status: ✓ Complete
Resource Type: Storage
├─ Total: 8
├─ Tagged: 8 (100%)
└─ Status: ✓ Complete
Resource Type: SQL Databases
├─ Total: 4
├─ Tagged: 4 (100%)
└─ Status: ✓ Complete
OVERALL: 24/24 resources properly tagged (100%) ✓
✅ Complete: All resources tagged consistently
✅ Tagging standard documented
✅ 100% resource coverage
✅ Ready for cost allocation
You can document tagging standards, but humans forget. Use policies to enforce tagging automatically.
Step 1: Create Policy - Require CostCenter Tag
This policy denies creation of resources without a CostCenter tag:
Name: Require-CostCenter-TagDescription: All resources must have CostCenter tag (Finance, Engineering, Operations, Training)
Policy Type: Built-in
Effect: Deny (prevent creation without tag)
Condition:
├─ Field: tags['CostCenter']
├─ Operator: exists
└─ Value: false → DENY (no tag) → ALLOW (tag exists)
Result: Cannot create resources without CostCenter tag
Step 2: Create Policy - Require Environment Tag
Similar to Step 1:
Name: Require-Environment-TagDescription: All resources must have Environment tag (Production, Staging, Development)
Effect: Deny
Result: Cannot create without Environment tag
Step 3: Create Policy - Require Owner Tag
Name: Require-Owner-TagDescription: All resources must have Owner tag (email of resource owner)
Effect: Deny
Result: Cannot create without Owner tag
Step 4: Create Policy - Prevent Expensive VM Types
This prevents developers from accidentally creating expensive VMs:
Name: Deny-Premium-VM-TypesDescription: Only allow Standard<em>B and Standard</em>D VM types (cost optimization)
Effect: Deny
Condition:
├─ Resource type: Microsoft.Compute/virtualMachines
├─ Field: sku.name
├─ Values: Block Premium<em>, Deluxe</em>, etc.
├─ Allowed: Standard<em>B1s, Standard</em>B2s, Standard<em>D2s</em>v3, etc.
Result:
├─ Engineer tries to create Premium<em>D64s</em>v3
├─ Policy blocks it
├─ Must request exception through proper channels
└─ Forces cost-conscious decisions
Step 5: Create Policy - Prevent Expensive Storage
Name: Deny-Expensive-Storage-ReplicationDescription: Only allow LRS/ZRS, deny GRS/RA-GRS (cost control)
Effect: Deny
Condition:
├─ Resource type: Microsoft.Storage/storageAccounts
├─ Field: sku.name
├─ Blocked: Premium<em>GRS, Standard</em>GZRS, Standard<em>RA-GZRS
├─ Allowed: Standard</em>LRS, Standard<em>ZRS
Result:
├─ LRS: 1 datacenter (cheapest, acceptable for dev)
├─ ZRS: 3 zones (good for staging)
├─ GRS: 2 regions (expensive, requires exception)
└─ Prevents unintended expensive replication
Step 6: Assign Policies to Subscription
For each policy created:
Step 7: Test Policies Are Working
Attempt to create a resource without tags:
- Expected: Policy blocks creation with message
- Message: "Required tag 'CostCenter' not found"
Document result:
POLICY ENFORCEMENT TEST═════════════════════════════════════════════════════════════
Test 1: Create VM without CostCenter tag
├─ Attempted: Create VM without tag
├─ Expected: Denied
├─ Actual: </em><strong> Denied ✓ </strong><em> Allowed ✗
└─ Result: PASS ✓ / FAIL ✗
Test 2: Create Premium VM
├─ Attempted: Create Premium</em>D64s<em>v3 VM
├─ Expected: Denied
├─ Actual: </em><strong> Denied ✓ </strong><em> Allowed ✗
└─ Result: PASS ✓ / FAIL ✗
Test 3: Create resource WITH proper tags
├─ Attempted: Create Standard</em>D2s<em>v3 VM with all tags
├─ Expected: Success
├─ Actual: </em><strong> Success ✓ </strong><em> Denied ✗
└─ Result: PASS ✓ / FAIL ✗
✅ Complete: All policies enforced
✅ Untagged resources cannot be created
✅ Expensive VMs/storage blocked
✅ Cost-conscious defaults enforced
Budgets tell you how much you can spend. Alerts tell you when you're going over budget.
Step 1: Create Budget for Engineering Department
Engineering usually spends the most. Set a reasonable budget:
Budget Name: Engineering-Team-Monthly-BudgetScope: Select subscription used by Engineering
Budget Amount: $30,000 (monthly)
Time Period: Monthly (resets each month)
Reset Date: 1st of each month
Alert 1: 90% of budget├─ Threshold: $27,000
├─ Recipients: engineering-manager@techcorp.com
└─ Triggers when spending hits $27K
Alert 2: 100% of budget
├─ Threshold: $30,000
├─ Recipients: engineering-manager@techcorp.com, cfo@techcorp.com
└─ Triggers at limit (alerts executives)
Alert 3: 110% of budget (overrun)
├─ Threshold: $33,000
├─ Recipients: cfo@techcorp.com, finance@techcorp.com
└─ Triggers if over budget (escalation)
Step 2: Create Budget for Finance Department
Finance department manages customer data (lower cost than Engineering):
Budget Name: Finance-Team-Monthly-BudgetBudget Amount: $16,000
Alerts:
├─ 90%: $14,400 → engineering-manager
├─ 100%: $16,000 → manager + CFO
└─ 110%: $17,600 → CFO + Finance
Step 3: Create Budget for Operations
Operations manages infrastructure (lowest cost):
Budget Name: Operations-Monthly-BudgetBudget Amount: $5,000
Alerts:
├─ 90%: $4,500 → ops-manager
├─ 100%: $5,000 → ops-manager + CFO
└─ 110%: $5,500 → CFO
Step 4: Create Organization-Wide Budget
Total budget for entire company:
Budget Name: TechCorp-Total-Azure-BudgetBudget Amount: $51,000 (Total: Finance $16K + Engineering $30K + Ops $5K)
Alerts:
├─ 80%: $40,800 → CFO (early warning)
├─ 90%: $45,900 → CFO
├─ 100%: $51,000 → CFO + CEO
└─ 110%: $56,100 → CFO + CEO (escalation)
Purpose: Company-level cost control
Step 5: Set Up Cost Anomaly Alert
Azure can automatically detect unusual spending:
Alert Name: Unusual-Spending-DetectionScope: All subscriptions
Sensitivity: Medium (balance false positives vs real anomalies)
Frequency: Daily checks
Triggers when:
├─ Spending deviates significantly from historical average
├─ Example: Usually $1,500/day, suddenly $5,000/day
└─ Indicates: Resource leak, forgotten test environment, attack
Recipients:
├─ cfo@techcorp.com
├─ ops-manager@techcorp.com
└─ All team leads
Step 6: Document Budget Configuration
BUDGET & ALERT CONFIGURATION SUMMARY════════════════════════════════════════════════════════════
DEPARTMENT BUDGETS:
Engineering Department:
├─ Budget: $30,000/month
├─ Alert 1 (90%): $27,000
├─ Alert 2 (100%): $30,000
├─ Alert 3 (110%): $33,000
└─ Recipients: engineering-manager, CFO, Finance
Finance Department:
├─ Budget: $16,000/month
├─ Alert 1 (90%): $14,400
├─ Alert 2 (100%): $16,000
├─ Alert 3 (110%): $17,600
└─ Recipients: finance-manager, CFO
Operations:
├─ Budget: $5,000/month
├─ Alert 1 (90%): $4,500
├─ Alert 2 (100%): $5,000
├─ Alert 3 (110%): $5,500
└─ Recipients: ops-manager, CFO
ORGANIZATION TOTAL:
├─ Budget: $51,000/month
├─ Alert 1 (80%): $40,800 (early warning)
├─ Alert 2 (90%): $45,900
├─ Alert 3 (100%): $51,000 (limit reached)
└─ Recipients: CFO, CEO
ANOMALY DETECTION:
├─ Status: Enabled
├─ Sensitivity: Medium
├─ Frequency: Daily
└─ Recipients: CFO, Ops Manager, Team Leads
All budgets and alerts configured: ✓
✅ Complete: All budgets and alerts in place
✅ Departments have spending limits
✅ Escalation path defined (90%→100%→110%)
✅ Anomaly detection enabled
Now that budgets are in place, analyze actual spending to understand patterns.
Step 1: Analyze Costs by Cost Center
Group by: Tag (CostCenter)Time range: Last 30 days
View: Pie chart or bar chart
Cost Breakdown by Department:├─ Engineering: $28,000 (60%)
├─ Finance: $15,000 (32%)
├─ Operations: $4,000 (8%)
└─ Total: $47,000
This tells you:
├─ Engineering spends most (expected - many microservices)
├─ Finance next (critical databases)
├─ Operations least (shared infrastructure)
Step 2: Analyze Costs by Environment
Group by: Tag (Environment)Time range: Last 30 days
Expected results:
├─ Production: $38,000 (81%)
├─ Staging: $6,000 (13%)
├─ Development: $3,000 (6%)
└─ Total: $47,000
This tells you:
├─ Prod costs ~6-7x more than Dev (normal)
├─ Staging costs are reasonable
├─ Dev costs seem high - investigate unused resources?
Step 3: Analyze Costs by Resource Type
Group by: Resource typeTime range: Last 30 days
Expected results:
├─ Virtual Machines: $20,000 (43%)
├─ SQL Databases: $12,000 (26%)
├─ Storage: $8,000 (17%)
├─ Bandwidth: $5,000 (11%)
├─ Other: $2,000 (3%)
└─ Total: $47,000
This tells you:
├─ VMs are biggest cost (scale-down opportunities?)
├─ Databases next (query optimization?)
├─ Storage acceptable
├─ Bandwidth could be reduced with CDN
Step 4: Identify Expensive Resources
- Idle resources (Dev VMs running 24/7?)
- Oversized resources (do we really need Premium VMs?)
- Untagged resources (why weren't they tagged?)
Example findings:
Top 10 Most Expensive Resources:
- sql-prod-main DB: $6,500/month
└─ Tagged: ✓ Needed: ✓ Status: OK
- vm-prod-api-1 (Premium</em>D64): $3,200/month
└─ Tagged: ✓ But: Why Premium? Could use Standard<em>D4?
└─ Potential saving: $1,000/month (if downsize)
- storage-prod-backups: $2,800/month
└─ Tagged: ✓ Status: Correct (GRS for disaster recovery)
- vm-dev-testing-01: $1,500/month
└─ Tagged: ✗ (UNTAGGED - violation!)
└─ Owner: Unknown
└─ Action: Tag and investigate if still needed
- appService-prod-api: $1,200/month
└─ Tagged: ✓ Needed: ✓ Status: OK
Step 5: Forecast Future Spending
Expected:
12-Month Cost Forecast:├─ Current (Jun): $47K
├─ Projected (Jul-Dec): ~$50K/month (5% growth)
├─ Projected (Next year): ~$52K/month
└─ Annual cost: ~$600K
This tells you:
├─ Costs are growing at ~5%/month
├─ Without action, will hit $60K+/month in 1 year
├─ Need to optimize or budget will be exceeded
├─ Identify cost-saving opportunities NOW
Step 6: Create Cost Analysis Report
MONTHLY COST ANALYSIS REPORT════════════════════════════════════════════════════════════
PERIOD: Last 30 days
TOTAL SPEND: $47,000
BY DEPARTMENT:
├─ Engineering: $28,000 (60%)
├─ Finance: $15,000 (32%)
└─ Operations: $4,000 (8%)
BY ENVIRONMENT:
├─ Production: $38,000 (81%)
├─ Staging: $6,000 (13%)
└─ Development: $3,000 (6%)
BY RESOURCE TYPE:
├─ Virtual Machines: $20,000 (43%)
├─ SQL Databases: $12,000 (26%)
├─ Storage: $8,000 (17%)
└─ Other: $7,000 (15%)
TOP COST DRIVERS:
- sql-prod-main: $6,500 ✓ Justified
- vm-prod-api-1: $3,200 ⚠ Review sizing
- storage-backups: $2,800 ✓ Justified
- vm-dev-testing: $1,500 ⚠ Untagged, investigate
- appService-api: $1,200 ✓ Justified
COST ANOMALIES:
└─ vm-dev-testing-01: Untagged VM costing $1,500/month
└─ Owner: Unknown
└─ Action: Tag or shutdown if not needed
└─ Potential saving: $1,500/month if deleted
FORECAST:
├─ Current trend: +5%/month growth
├─ 12-month projection: $600K+ annually
└─ Recommendation: Implement cost optimization initiatives
BUDGET STATUS:
├─ Total budget: $51,000
├─ Actual: $47,000
├─ Remaining: $4,000 (8% buffer)
└─ Status: On track (but tight)
✅ Complete: Full cost visibility by department
✅ Anomalies identified
✅ Forecast generated
✅ Cost optimization opportunities found
Besides budgets, use policies to make cost-smart defaults.
Step 1: Limit VM Sizes to Cost-Optimized Options
Create a policy that only allows certain VM types:
Policy Name: Approved-VM-Sizes-OnlyDescription: Only allow Standard</em>B and Standard<em>D series (cost optimization)
Effect: Deny
Allowed VM Types:
├─ Standard</em>B1s, Standard<em>B2s, Standard</em>B4ms (burstable, cheap)
├─ Standard<em>D2s</em>v3, Standard<em>D4s</em>v3, Standard<em>D8s</em>v3 (balanced)
└─ Standard<em>E2s</em>v3 (for databases needing memory)
Denied VM Types:
├─ Premium<em>D64s</em>v3 (too expensive)
├─ Premium<em>E64s</em>v3 (extremely expensive)
├─ Any AMD-based SKUs (test the need first)
└─ Isolated sizes (reserved for special cases)
Result:
├─ Developer tries to create Premium VM
├─ Policy blocks: "Not in approved list"
├─ Developer must request exception (creates approval process)
└─ Forces cost-conscious decisions
Step 2: Limit Storage Redundancy
Policy Name: Limit-Storage-Redundancy-LRSDescription: Default to LRS, require justification for GRS
Effect: Deny
Rules:
├─ LRS: Always allowed (1 datacenter, cheapest)
├─ ZRS: Allowed in Staging/Prod (3 zones, moderate cost)
├─ GRS: Deny by default (must request exception)
├─ RA-GRS: Deny (very expensive, rare need)
Result:
├─ Default to cheapest option (LRS)
├─ Force business justification for expensive options
├─ No accidental GRS creation
└─ Potential savings: $500/month/storage account
Step 3: Enforce Resource Deletion Timeouts for Temporary Resources
Policy Name: Auto-Shutdown-Temporary-ResourcesDescription: Resources tagged LifeCycle=Temporary shutdown after 30 days
Effect: Audit + Modify
Result:
├─ Tag resource: LifeCycle = Temporary
├─ Policy tracks creation date
├─ After 30 days: Automatically deallocates/stops
├─ Prevents forgotten test resources
└─ Typical savings: $2-5K/month (forgotten test VMs)
Step 4: Test Cost-Prevention Policies
Attempt to create an expensive resource (should be denied):
Action: Attempt VM creationVM Type: Premium<em>D64s</em>v3
Expected: Policy blocks
Message: "VM type not in approved list"
Result: PASS ✓
``
- Try to create GRS storage:
`
Action: Attempt storage account
Redundancy: GRS (Geo-Redundant)
Expected: Policy blocks
Message: "Storage redundancy not approved"
Result: PASS ✓
`
- Create compliant resource (should succeed):
`
Action: Create Standard<em>D4s</em>v3 VM with all tags
Expected: Success ✓
Message: "VM created successfully"
Result: PASS ✓
`
<strong>Step 5: Document Cost Prevention</strong>
COST-PREVENTION POLICY SUMMARY
════════════════════════════════════════════════════════════
POLICIES IMPLEMENTED:
├─ Enforces: Only StandardB/D series
├─ Prevents: Premium/expensive SKUs
├─ Potential savings: $100-1,000/month per violation
├─ Enforces: LRS default, GRS requires exception
├─ Prevents: Accidental expensive replication
├─ Potential savings: $500/month per account
├─ Enforces: Auto-shutdown after 30 days
├─ Prevents: Forgotten test resources
├─ Potential savings: $2,000-5,000/month
MONTHLY IMPACT:
├─ VM cost reduction: ~$500/month
├─ Storage cost reduction: ~$1,000/month
├─ Shutdown forgotten resources: ~$2,000/month
└─ Total potential savings: ~$3,500/month
ANNUAL IMPACT:
└─ Annual savings: ~$42,000/year
<h3 id="validation-checklist">Validation Checklist</h3>
<h3 id="success-criteria">Success Criteria</h3>
✅ Complete: Cost-prevention policies enforced
✅ Expensive mistakes prevented automatically
✅ Developers have cost-smart guardrails
✅ Annual savings estimated
<h2 id="final-assessment-cost-management-checklist">Final Assessment: Cost Management Checklist</h2>
After completing all 5 parts, verify everything is in place:
COST MANAGEMENT & CHARGEBACK FINAL CHECKLIST
════════════════════════════════════════════════════════════
TAGGING STRATEGY
├─ [ ] 5 required tags defined (CostCenter, Environment, Owner, Project, LifeCycle)
├─ [ ] Tagging standard documented
├─ [ ] All existing resources tagged (100%)
└─ [ ] Tagging status: ✓ COMPLETE
POLICY ENFORCEMENT
├─ [ ] 3 tag-requirement policies created and assigned
├─ [ ] 2 cost-prevention policies created (VM sizes, storage)
├─ [ ] Temporary resource shutdown policy created
├─ [ ] All policies tested and working
└─ [ ] Policy status: ✓ COMPLETE
BUDGETS & ALERTS
├─ [ ] Engineering budget: $30,000/month with 3 alerts
├─ [ ] Finance budget: $16,000/month with 3 alerts
├─ [ ] Operations budget: $5,000/month with 3 alerts
├─ [ ] Organization budget: $51,000/month with 4 alerts
├─ [ ] Anomaly detection enabled
└─ [ ] Budget status: ✓ COMPLETE
COST ANALYSIS
├─ [ ] Analyzed costs by department (CostCenter tag)
├─ [ ] Analyzed costs by environment
├─ [ ] Analyzed costs by resource type
├─ [ ] Identified top expensive resources
├─ [ ] Identified anomalies and optimization opportunities
├─ [ ] Generated 12-month forecast
└─ [ ] Analysis status: ✓ COMPLETE
DOCUMENTATION
├─ [ ] Tagging standard documented
├─ [ ] Budget configuration summarized
├─ [ ] Cost analysis report created
├─ [ ] Policy summary with savings calculated
└─ [ ] Documentation status: ✓ COMPLETE
COST MANAGEMENT MATURITY:
├─ Month 1: No visibility ($47K, no tracking)
└─ Post-Lab: Full visibility, budgets, policies ($42K+ annual savings)
OVERALL COMPLETION: 100% _ Partial (identify gaps)
``
✅ Tags enable cost allocation - CostCenter tags let you charge back costs to departments
✅ Policies enforce standards - Cost-prevention policies prevent expensive mistakes
✅ Budgets create accountability - Teams own their budgets and manage to them
✅ Visibility prevents surprises - Monthly cost analysis prevents "sticker shock"
✅ Forecasting enables planning - Know future costs so you can prepare
✅ Automation saves money - Temporary resource shutdown prevents waste
You've now implemented cost management patterns used by: