Skip to main content

Module 6: Workload-Specific Cost Optimization

Duration: 60 minutes | Level: Deep-Dive Technical
WAF Alignment: CO:05 (Best Rates), CO:07 (Component Costs), CO:08 (Environment Costs), CO:10 (Data Costs), CO:11 (Code Costs), CO:12 (Scaling Costs), CO:14 (Consolidation)


6.1 Workload Optimization Map

Each workload type has unique cost levers. This module provides prescriptive guidance, CLI commands, and decision trees for the most common Azure services.


6.2 Virtual Machines

Cost Optimization Matrix

OptimizationSavings PotentialComplexityImplementation Time
Right-size underutilized VMs10-50%LowDays
Azure Hybrid Benefit (Windows/SQL)40-82%LowHours
Reserved Instances (1yr/3yr)40-72%LowHours
B-series for burstable workloads15-55%LowDays
Spot VMs for interruptible workloadsUp to 90%MediumDays
Auto-shutdown schedule for non-prod30-70%LowHours
Migrate to containers/serverless30-60%HighMonths

VM Cost Optimization Decision Tree

Key Azure CLI Commands for VMs

# Find underutilized VMs via Azure Resource Graph
az graph query -q "
Resources
| where type =~ 'microsoft.compute/virtualMachines'
| project name, resourceGroup,
vmSize=properties.hardwareProfile.vmSize,
location, os=properties.storageProfile.osDisk.osType
| order by vmSize asc
"

# Resize a VM
az vm resize --resource-group myRG --name myVM --size Standard_D2s_v5

# Enable Azure Hybrid Benefit on a Windows VM
az vm update --resource-group myRG --name myVM --set licenseType=Windows_Server

# Deallocate a stopped VM to stop compute billing
az vm deallocate --resource-group myRG --name myVM

# Set auto-shutdown schedule
az vm auto-shutdown \
--resource-group "DevTest-RG" \
--name "dev-vm-01" \
--time "1900" \
--timezone "Pacific Standard Time"

# Find VMs without Azure Hybrid Benefit enabled
az graph query -q "
Resources
| where type =~ 'microsoft.compute/virtualMachines'
| where properties.storageProfile.imageReference.publisher == 'MicrosoftWindowsServer'
| where properties.licenseType != 'Windows_Server'
| project name, resourceGroup, vmSize=properties.hardwareProfile.vmSize
"

VM Right-Sizing: Metrics to Monitor

MetricRight-Sized RangeAction if BelowAction if Above
CPU Average30-70%Downsize or deallocateUpsize
Memory Average30-70%DownsizeUpsize
Network I/OVaries by workloadConsider smaller SKUConsider network-optimized
Disk IOPSVaries by workloadStep down disk tierStep up disk tier

Rule of thumb: If CPU average is below 5% for 14 days, the VM is likely not needed. If CPU is between 5-30%, it is over-provisioned and should be downsized.

WAF Service Guide: VM Cost Optimization Configuration Recommendations

These come directly from the Azure Well-Architected Framework VM Service Guide:

RecommendationWhy It Matters
Choose the right VM plan size and SKU. Use the VM Selector to identify the best VM for your workloadSKUs are priced by capabilities. Don't overspend on SKUs with features you don't need
Use Spot VMs for batch processing, dev/test, and interruptible workloadsUp to 90% savings. Flexible orchestration lets you mix Spot and regular VMs by percentage
Scale in when demand decreases -- set a scale-in policy on VMSSScaling in reduces the number of running VMs and directly reduces costs
Stop VMs during off-hours using Azure Automation Start/StopThis low-cost automation can significantly reduce idle instance costs for non-production
Use Azure Hybrid Benefit for Windows Server and SQL licensesReuse on-premises Software Assurance licenses at no extra cost on Azure
Use Azure Boost for CPU offloading on supported SKUsOffloading virtualization frees up CPU for your workload -- better performance at same cost
Implement cost guardrails via Azure PolicyRestrict resource types, SKUs, configurations and locations to prevent overspend

VM Family Selection Guide for Cost Optimization

VM SeriesUse CaseCost Characteristic
B-series (Burstable)Dev/test, low-traffic web servers, small DBs15-55% cheaper than equivalent general purpose. Accumulate credits during idle, burst when needed
D-series (General Purpose)Balanced CPU/memory for most production workloadsStandard pricing, good all-rounder. Use Dv5 for latest generation savings
E-series (Memory Optimized)In-memory databases, SAP HANA, cachingHigher per-hour cost but fewer VMs needed for memory-heavy apps
F-series (Compute Optimized)Batch, gaming servers, analyticsHigh CPU-to-memory. Cost-effective for CPU-bound workloads
L-series (Storage Optimized)Big data, SQL, NoSQL, data warehousingHigh throughput local NVMe storage. Avoid Premium SSD cost for temp data
N-series (GPU)ML training, inference, renderingExpensive per hour. Use Spot where possible and shutdown when idle
Arm64 (Dpsv6, Epsv6)Cloud-native, scale-out, containerizedUp to 50% better price-performance vs x86 for eligible workloads

Comprehensive VM Cost Checklist for Customers

#ActionQuick Win?Est. Savings
1Identify and deallocate VMs with < 5% CPU for 14 daysYes100% of those VMs
2Right-size VMs with 5-30% CPU to next smaller SKUYes20-50% per VM
3Enable Azure Hybrid Benefit on all eligible Windows/SQL VMsYes40-82%
4Set auto-shutdown on all dev/test VMsYes30-70%
5Move dev/test to B-series burstable VMsYes15-55%
6Purchase 1-year RI for stable production VMsNo40-60%
7Purchase 3-year RI for long-term stable VMsNo60-72%
8Use Spot VMs for batch, CI/CD, non-criticalNoUp to 90%
9Evaluate Arm64 for scale-out workloadsNoUp to 50%
10Apply Azure Policy to restrict allowed SKUsNoPrevents sprawl

6.3 Azure Kubernetes Service (AKS)

AKS Cost Optimization Strategies

StrategyDescriptionSavings PotentialBest For
Cluster AutoscalerScale nodes based on pod demand20-40%All production clusters
Spot Node PoolsNon-critical workloads on interruptible nodesUp to 90%Batch, dev/test
Cluster Start/StopShutdown dev/test clusters off-hours50-70%Non-production
Node Autoprovision (NAP)Auto-select optimal VM SKU for pending pods10-30%Complex workloads
HPAScale pods horizontally based on CPU/memoryVariablePredictable demand
VPARight-size pod CPU/memory requests and limits10-30%Fluctuating resource needs
KEDAEvent-driven scaling, can scale to zeroUp to 100% idleSporadic workloads
Arm64 NodesCost-efficient ARM-based processorsUp to 50%Cloud-native apps
AKS Cost AnalysisGranular cluster cost breakdown by K8s constructVisibilityAll clusters

AKS Architecture for Cost Optimization

AKS CLI Commands

# Stop an AKS cluster (saves all compute costs)
az aks stop --name myAKSCluster --resource-group myRG

# Start an AKS cluster
az aks start --name myAKSCluster --resource-group myRG

# Add a Spot node pool for batch workloads
az aks nodepool add \
--resource-group myRG \
--cluster-name myAKSCluster \
--name spotnodepool \
--priority Spot \
--eviction-policy Delete \
--spot-max-price -1 \
--enable-cluster-autoscaler \
--min-count 0 --max-count 10

# Enable cluster autoscaler on existing node pool
az aks nodepool update \
--resource-group myRG \
--cluster-name myAKSCluster \
--name nodepool1 \
--enable-cluster-autoscaler \
--min-count 1 --max-count 5

# Enable AKS cost analysis add-on
az aks update --resource-group myRG --name myAKSCluster --enable-cost-analysis

AKS Autoscaling Decision Guide

AutoscalerLayerTriggerScale to Zero?Best For
HPAPod (horizontal)CPU, memory, custom metricsNoPredictable demand apps
VPAPod (vertical)Historical CPU/memory usageNoRight-sizing requests
KEDAPod (event-driven)Queue length, HTTP traffic, eventsYesSporadic/event-driven
Cluster AutoscalerNodePending pods, idle nodesNo (min 1)All clusters
NAPNodePod requirementsNoComplex multi-SKU

Important: Do not use VPA and HPA on the same CPU or memory metrics simultaneously. You can use VPA for CPU/memory with HPA for custom metrics.


6.4 Storage & Databases

Storage -- WAF Service Guide Recommendations

These come from the Azure Well-Architected Framework Blob Storage Service Guide:

WAF RecommendationCustomer Action
Identify the meters used to calculate your bill (capacity, operations, optional features)Run a billing review to understand which meters drive cost
Choose a billing model for capacity -- evaluate commitment-based (reserved) vs consumptionFor stable storage, pre-purchase reserved capacity for up to 38% savings
Choose the most cost-effective default access tierSet default to Cool if most blobs are infrequently accessed
Upload data directly to the most cost-efficient tierSpecify Cool/Cold/Archive at upload time instead of uploading to Hot first
Use lifecycle management policies to auto-tier dataAutomate Hot-to-Cool (30d), Cool-to-Cold (90d), Cold-to-Archive (180d) transitions
Disable features you don't need (versioning, soft delete on high-churn accounts)Every blob overwrite creates a version/snapshot -- this can explode storage cost silently
Create budgets and monitor usageUse Storage insights to identify accounts with no or low use
Pack small files before moving to cooler tiersCooler tiers have higher per-operation costs. Fewer large files = fewer operations
Use standard-priority rehydration from archive (not high-priority)High-priority rehydration costs significantly more

Storage Cost Optimization -- Actionable Checklist

#ActionImpactAzure CLI / Portal
1Upgrade all Storage v1 accounts to GPv2Enables tiering, reserved capacityaz storage account update --kind StorageV2
2Enable Lifecycle Management PolicyAuto-tier blobs by last-modified datePortal > Storage Account > Lifecycle management
3Find and delete unattached managed disksImmediate storage savingsaz disk list --query "[?managedBy==null]"
4Delete old disk snapshots (30+ days)Reduce snapshot storage costaz snapshot list --query "[?timeCreated < '...']"
5Move snapshots from Premium to Standard60% savings on snapshot storagePortal > Snapshot > Change tier
6Review backup redundancy (GRS vs LRS for dev/test)50% backup storage savingsPortal > Recovery Services vault > Properties
7Disable blob versioning on high-churn accountsPrevent silent cost explosionPortal > Storage Account > Data protection
8Enable reserved capacity for stable storageUp to 38% savings on capacityPortal > Reservations > Add > Storage
9Review soft delete retention periodsLong retention on high-churn = high costStart with 7 days, increase as needed
10Disable SFTP support when not actively transferringBilled hourly even when idlePortal > Storage Account > SFTP

Storage Tiering Flow

Key action: Enable Lifecycle Management Policy to automate blob transitions between tiers based on last-modified date.

# Find unattached managed disks
az disk list \
--query "[?managedBy==null].[name, diskSizeGb, sku.name, resourceGroup]" \
--output table

# Find old disk snapshots (30+ days)
$threshold = (Get-Date).AddDays(-30).ToString("yyyy-MM-ddTHH:mm:ssZ")
az snapshot list \
--query "[?timeCreated < '$threshold'].[name, diskSizeGb, resourceGroup]" \
--output table

# Find Storage v1 accounts that should be upgraded
az graph query -q "
Resources
| where type =~ 'microsoft.storage/storageaccounts'
| where kind == 'Storage' or kind == 'BlobStorage'
| project name, resourceGroup, kind, location
"

Azure SQL Database Cost Optimization -- Comprehensive Guide

Based on the Azure SQL Database Cost Management documentation:

Purchasing Model Decision

SQL Cost Optimization Strategies

StrategyDescriptionSavingsWhen to Use
Serverless tierAuto-pause when idle, pay per second of compute usedUp to 70% for sporadicDev/test, apps with idle periods
Elastic PoolsShare provisioned resources across multiple databases30-50% vs individual DBsMulti-tenant apps, varying DB workloads
Reserved CapacityPre-commit to vCores for 1 or 3 years33-65%Stable, predictable production databases
Azure Hybrid BenefitUse existing SQL Server licensesUp to 55%Customers with Software Assurance
DTU to vCore migrationMove from DTU to vCore for more granular controlVariableWhen DTU model is inefficient
Right-size computeMatch provisioned vCores/DTUs to actual usage20-50%Over-provisioned databases
Scale down non-prodUse lower tiers for dev/test/staging50-80%Non-production environments
Free tier100,000 vCore seconds + 32 GB storage per month free100%Small apps, prototyping
# Find Azure SQL Databases and their pricing tiers
az graph query -q "
Resources
| where type =~ 'microsoft.sql/servers/databases'
| where name != 'master'
| project name, resourceGroup,
sku=sku.name, tier=sku.tier,
capacity=sku.capacity,
location
| order by tier asc
"

# Check if any SQL DBs can use serverless
az graph query -q "
Resources
| where type =~ 'microsoft.sql/servers/databases'
| where sku.tier == 'GeneralPurpose'
| where sku.name !contains 'Serverless'
| project name, resourceGroup, sku=sku.name
"

Cosmos DB Cost Optimization

StrategyDescriptionSavings
Autoscale throughputAutomatically scale RUs up/down based on demand10-70% vs fixed provisioned
Reserved capacityPre-purchase RUs for 1 or 3 yearsUp to 65%
Serverless modePay per request for sporadic workloadsUp to 90% vs provisioned idle
Optimize query RU costUse indexing policies, avoid cross-partition queries30-80% per query
Rate limitingImplement client-side rate limiting to avoid 429sPrevents over-provisioning
Time-to-live (TTL)Auto-delete old documents to reduce storageVariable

PostgreSQL / MySQL Flexible Server

StrategyDescription
Burstable tier (B-series)For dev/test and low-traffic workloads
Stopped serverStop the server when not in use (no compute charges)
Reserved capacityPre-commit for 1 or 3 years for 30-65% savings
Scale compute tierMatch compute to actual workload requirements
Storage auto-growPrevent manual over-provisioning of storage

6.5 Networking -- The Hidden Cost Driver

Key insight: Data transfer (egress) is often the most overlooked cost in Azure. Many customers pay 10-20% of their bill on egress without realizing it if architecture is not well designed.

Networking Cost Drivers Ranked by Impact

#Resource / Cost DriverTypical Monthly CostHow It Accumulates
1Data Transfer (Egress)$0.05-$0.087/GBCross-region, internet-bound data adds up fast
2ExpressRoute$55-$500/month + per-GB meteredCharges even when unused. Metered plans charge per GB
3Azure Firewall$912/month (Standard) or $1,827/month (Premium)Base cost per hour + per-GB processed
4Application Gateway / WAF$250-$700/monthFixed capacity units + per-GB processed
5VPN Gateway$139-$1,012/monthCharged per hour. VpnGw1 vs VpnGw5 varies 7x
6Load Balancer (Standard)$18/month + per-ruleCharged per rule per hour. Idle LBs still cost
7Public IPs (Standard)$3.65/month eachCharged even when unattached. Orphaned PIPs add up
8NAT Gateway$32/month + per-GBSteady charge even with low traffic

Egress Cost Reduction Architecture

Networking Cost Optimization Checklist

#ActionAzure CLI / Resource GraphSavings
1Delete orphaned Public IPsaz graph query -q "Resources | where type =~ 'microsoft.network/publicIPAddresses' | where isnull(properties.ipConfiguration)"$3.65/month each
2Remove idle Load BalancersCheck for empty backend pools$18+/month each
3Remove idle Application GatewaysCheck for empty backend pools$250+/month each
4Delete unused VNet GatewaysCheck for zero connections$139+/month each
5Downgrade Azure Firewall Premium to StandardVerify no Premium features (TLS inspection, IDPS) used$900+/month
6Consolidate Azure Firewalls (hub-spoke)One central Firewall per region, not per spoke$900+/month per extra
7Deprovision unused ExpressRoute circuitsCheck traffic, confirm no active peerings$55-500/month each
8Use Private Endpoints for PaaS servicesEliminates public internet egressVariable
9Co-locate services in same regionFree intra-region data transferVariable
10Use Azure CDN for static content deliveryFree Azure-to-CDN transferVariable

Key Egress Rules of Thumb

  • Intra-region transfer: Free (between services in the same Azure region)
  • Inter-region transfer: $0.02-$0.087/GB depending on regions
  • Internet egress: $0.05-$0.087/GB (first 5 GB/month free)
  • ExpressRoute metered egress: $0.025/GB for Zone 1
  • Azure CDN delivery: Free from Azure origin to CDN PoP
  • Target: No more than 15% of total Azure spend on data transfer
# Find orphaned Public IPs
az graph query -q "
Resources
| where type =~ 'microsoft.network/publicIPAddresses'
| where isnull(properties.ipConfiguration)
| project name, resourceGroup, sku=sku.name, location
"

# Find idle Load Balancers (empty backend pools)
az graph query -q "
Resources
| where type =~ 'microsoft.network/loadbalancers'
| where array_length(properties.backendAddressPools) == 0
| project name, resourceGroup, sku=sku.name, location
"

# Find Azure Firewalls and their SKU (Premium vs Standard)
az graph query -q "
Resources
| where type =~ 'microsoft.network/azureFirewalls'
| project name, resourceGroup, sku=properties.sku.tier, location
"

# Find VNet Gateways with no connections
az graph query -q "
Resources
| where type =~ 'microsoft.network/virtualNetworkGateways'
| project name, resourceGroup, gatewayType=properties.gatewayType,
sku=properties.sku.name, location
"

6.6 Monitoring & Log Analytics

Log Analytics Cost Optimization

OptimizationDescriptionSavings Potential
Commitment TiersPre-commit to daily ingestion volume (100, 200, 300+ GB/day)15-30%
Basic Logs PlanLower cost for infrequently queried tables60-80%
Data Collection Rules (DCR)Filter and transform data before ingestionReduce volume 30-50%
Table-level RetentionSet different retention per table based on compliance needsVariable
Dedicated ClusterAggregate 500+ GB/day across workspacesVolume discount
Managed PrometheusReplace Container Insights metrics for AKSSignificant
TransformationsModify/filter control plane and data plane logs before storage20-50%

Log Analytics Decision Tree

AKS Monitoring Cost Optimization

BeforeAfterImpact
Container Insights (full metrics)Managed Prometheus + GrafanaSignificant cost reduction
All control plane logs enabledDisable unnecessary log categoriesReduce Log Analytics ingestion
Default data collectionCustom DCR with filteringIngest only needed data
# Check Log Analytics workspace pricing tier
az monitor log-analytics workspace show \
--resource-group myRG \
--workspace-name myWorkspace \
--query "{name:name, sku:sku.name, retentionDays:retentionInDays}" \
--output table

6.7 App Service & Azure Functions

App Service Cost Optimization -- Deep Guide

StrategyDescriptionSavingsPortal / CLI
Upgrade v2 to v3 SKUv3 is cheaper AND supports RI/Savings Plan10-30%Portal > App Service Plan > Scale up
Delete Stopped appsStopped App Services still incur plan charges100% of those appsaz webapp delete
Enable autoscaleScale instances based on CPU/memory/HTTP queue20-50%Portal > Scale out > Custom autoscale
Reserved InstancesPre-commit for P1v3, P2v3, P3v3 plans35-55%Portal > Reservations > App Service
Use Free/Shared tier for dev prototypingF1 (free) or D1 (shared) for non-production100%Portal > Scale up
Consolidate apps onto fewer plansMultiple apps can share one App Service PlanVariableMove apps to shared plan
Use Deployment Slots only when neededEach slot consumes resources on the planReduce instance countPortal > Deployment slots
# Find stopped App Services (still being charged)
az graph query -q "
Resources
| where type =~ 'microsoft.web/sites'
| where properties.state == 'Stopped'
| project name, resourceGroup, kind, location
"

# Find App Service Plans and their SKUs
az graph query -q "
Resources
| where type =~ 'microsoft.web/serverfarms'
| project name, resourceGroup,
sku=sku.name, tier=sku.tier,
workers=properties.numberOfWorkers,
location
| order by tier asc
"

# Find App Service Plans with zero apps (wasted cost)
az graph query -q "
Resources
| where type =~ 'microsoft.web/serverfarms'
| where properties.numberOfSites == 0
| project name, resourceGroup, sku=sku.name, location
"

Azure Functions Cost Optimization

PlanBest ForCost ModelKey Optimization
ConsumptionSporadic, event-driven workloadsPay per execution + execution timeFirst 1M executions/month free. Scale to zero
Flex ConsumptionVariable workloads needing VNETPer-second billing with always-ready instancesSet always-ready minimum low
Premium (EP)Sustained load with VNET/unlimited executionPre-warmed instances, per-second billingRight-size minimum instances
DedicatedApps sharing App Service PlanApp Service Plan pricingAlready paying for plan

Logic Apps Cost Tips

ScenarioRecommendation
High-volume workflows (100k+ actions/month)Standard tier (fixed, predictable pricing)
Sporadic triggers (< 1000 runs/month)Consumption tier (pay per action)
Enterprise integration with ISEEvaluate migration to Standard + VNET integration

6.8 AI & Azure OpenAI Services -- Cost Optimization Deep Dive

Azure OpenAI Pricing Models

ModelPricing ApproachBest For
Pay-as-you-go (Standard)Per 1K tokens consumedVariable, unpredictable workloads
Provisioned Throughput (PTU)Fixed hourly rate for reserved capacityPredictable, high-volume production
Batch APISame tokens at reduced rate, async processingNon-real-time inference (reports, analysis)
Global StandardLower per-token cost, Microsoft routes to optimal regionLatency-insensitive workloads

Token Cost Comparison (Illustrative)

ModelInput (per 1M tokens)Output (per 1M tokens)Use When
GPT-4o$2.50$10.00Complex reasoning, code generation
GPT-4o-mini$0.15$0.60Summarization, classification, simple Q&A
GPT-3.5-turbo$0.50$1.50Legacy workloads, simple completions

Key insight: GPT-4o-mini is 16x cheaper than GPT-4o for input and delivers excellent quality for most business tasks. Always test if a cheaper model meets your quality bar.

Azure OpenAI Cost Optimization Strategies

StrategyDescriptionSavings Potential
Model right-sizingUse GPT-4o-mini instead of GPT-4o where quality allows80-95% per request
Prompt engineeringReduce system prompt tokens, use structured output, fewer examples20-50% per request
Semantic cachingCache embeddings of similar queries, return cached responses50-90% for repeated queries
Batch APIProcess non-urgent requests in batch at reduced rates50% per token
PTU commitmentPre-purchase provisioned throughput for predictable workloads30-50% vs pay-as-you-go
Max tokens limitSet max_tokens to prevent unnecessarily long responses10-40% per request
Content filteringOnly enable needed content filters (custom filters cost more)Variable
Chargeback by API keySeparate API keys per business unit to track and allocate costsAccountability
Azure BudgetsSet budget alerts on OpenAI resource groupsPrevention
# Find all Azure OpenAI resources and their configurations
az graph query -q "
Resources
| where type =~ 'microsoft.cognitiveservices/accounts'
| where kind == 'OpenAI'
| project name, resourceGroup, sku=sku.name, location
"

Azure Cognitive Search Cost Tips

StrategyDescription
Right-size replicasUse minimum replicas that meet query performance SLA
Right-size partitionsMatch partition count to index size, not peak projections
Use Basic/Free tier for dev/testStandard S1+ is expensive
Semantic rankerOnly enable when needed (per-query cost)

6.9 Implementation Timeline


Key Takeaways

  1. Every workload type has unique cost levers -- there is no one-size-fits-all
  2. VMs: Right-size first, then AHB, then Reservations/Savings Plans, then Spot for eligible workloads
  3. AKS: Cluster Autoscaler + Spot node pools + Start/Stop for non-prod + KEDA for event-driven
  4. Storage: Lifecycle policies are free money; delete orphaned disks and old snapshots
  5. Networking: Egress is the hidden cost -- use Private Endpoints, CDN, same-region co-location
  6. Monitoring: Basic Logs plan, commitment tiers, DCRs, and managed Prometheus for AKS
  7. Start with quick wins (hours), then structured optimization (months), then FinOps culture (ongoing)

References

WAF Service Guides (Cost Optimization per Resource)

ResourceWAF Service Guide Link
Virtual Machines & VMSSlearn.microsoft.com/.../virtual-machines-review
Blob Storagelearn.microsoft.com/.../storage-accounts/cost-optimization
Azure SQL Databaselearn.microsoft.com/.../azure-sql/database/cost-management
AKSlearn.microsoft.com/.../aks/best-practices-cost
Azure Firewalllearn.microsoft.com/.../azure-firewall
App Servicelearn.microsoft.com/.../app-service-web-apps
Cosmos DBlearn.microsoft.com/.../cosmos-db
Log Analyticslearn.microsoft.com/.../azure-log-analytics

Other References


Previous Module: Module 5 — Usage Optimization & Waste Reduction
Next Module: Module 7 — AI Workload Cost Optimization
Back to Overview: README — Cost Optimization

📖Learn