Multi-Cloud Cost Optimization β AWS, Azure & GCP Guide
In this tutorial, you'll learn about Multi. We cover key concepts, practical examples, and best practices to help you understand and apply this topic effectively.
Multi-Cloud Cost Optimization is the practice of managing and reducing infrastructure costs across AWS, Azure, and GCP simultaneously β normalizing billing, minimizing cross-cloud data transfer, using cloud-agnostic tools, and implementing FinOps practices for centralized governance.
What You'll Learn
By the end of this guide, you'll be able to normalize Multi-Cloud billing, use tools like OpenCost and CloudHealth, minimize data transfer costs between clouds, implement FinOps practices, choose workloads per provider by pricing, and negotiate enterprise discounts.
Why It Matters
Multi-Cloud strategies offer flexibility and vendor independence but create cost complexity. Different pricing models, data transfer charges between clouds, and fragmented tooling lead to 20-30% higher costs than single-cloud. Without centralized optimization, each cloud's waste compounds. DodaTech runs Durga Antivirus Pro across AWS (compute) and GCP (ML training), saving 25% by choosing the right workload for each cloud.
Real-World Use
Lyft runs analytics on AWS and ML on GCP, optimizing each workload for the cheapest cloud. Atlassian uses a Multi-Cloud FinOps team to manage $100M+ across AWS and Azure. Niantic (PokΓ©mon Go) uses GCP for real-time game servers and AWS for data analytics, cutting costs by 30%.
flowchart TB
subgraph "Multi-Cloud Cost Hub"
AWS[AWS Cost] --> C[Central Dashboard]
AZURE[Azure Cost] --> C
GCP[GCP Cost] --> C
end
C --> D[Normalized Reports]
C --> E[Cross-Cloud Transfer]
C --> F[Workload Placement]
D --> G[FinOps Team]
F --> H[Choose Cheapest Cloud]
style C fill:#6c5ce7,color:#fff
Prerequisites: Understanding of AWS Cost, Azure Cost, and GCP Cost basics. Familiarity with Cloud Computing helps.
1. Normalizing Multi-Cloud Billing
Each cloud provider uses different billing dimensions. Normalize to compare apples-to-apples.
| Dimension | AWS | Azure | GCP |
|---|---|---|---|
| Compute pricing | Per second (min 60s) | Per minute (min 60s) | Per second (min 60s) |
| Discount model | SP, RI | RI, Savings Plan | CUD, SUD |
| Storage pricing | Per GB-month | Per GB-month | Per GB-month |
| Network egress | $0.09/GB | $0.087/GB | $0.12/GB |
| SQL managed | Per hour | Per hour (DTU/vCore) | Per second (slot) |
class MultiCloudBillNormalizer:
def __init__(self):
self.entries = []
def add_entry(self, cloud, service, amount_usd, commitment="on_demand"):
self.entries.append({"cloud": cloud, "service": service, "amount": amount_usd, "commitment": commitment})
def compare(self):
from collections import defaultdict
by_cloud = defaultdict(float)
for e in self.entries:
by_cloud[e["cloud"]] += e["amount"]
print(f"{'Cloud':<10} {'Monthly Spend':<15} {'Share':<10}")
print("-" * 35)
total = sum(by_cloud.values())
for cloud, amount in sorted(by_cloud.items(), key=lambda x: x[1], reverse=True):
print(f"{cloud:<10} ${amount:<10,.0f} {amount/total*100:<5.1f}%")
normalizer = MultiCloudBillNormalizer()
normalizer.add_entry("AWS", "EC2", 25000)
normalizer.add_entry("AWS", "RDS", 8000)
normalizer.add_entry("Azure", "VMs", 18000)
normalizer.add_entry("Azure", "SQL DB", 5000)
normalizer.add_entry("GCP", "GCE", 12000)
normalizer.add_entry("GCP", "BigQuery", 4000)
normalizer.compare()
Expected output:
Cloud Monthly Spend Share
-----------------------------------
AWS $33,000 46.5%
Azure $23,000 32.4%
GCP $16,000 22.5%
2. Multi-Cloud Cost Tools
| Tool | Clouds | Key Features |
|---|---|---|
| CloudHealth | AWS, Azure, GCP | Rightsizing, reservations, reporting |
| Cloudability | AWS, Azure, GCP | Budgets, anomaly detection |
| OpenCost | K8s-native | Per-namespace cost across clouds |
| Vantage | AWS, Azure, GCP | Modern UI, HUDs, recommendations |
class OpenCostSimulator:
"""Simulate multi-cloud cost allocation."""
def __init__(self):
self.clusters = {}
def add_cluster(self, name, cloud, nodes, cost_per_node):
self.clusters[name] = {"cloud": cloud, "nodes": nodes, "cost": nodes * cost_per_node}
def namespace_breakdown(self, namespace_allocation):
total = sum(c["cost"] for c in self.clusters.values())
print(f"{'Namespace':<20} {'Cloud':<10} {'Allocation':<12} {'Monthly Cost':<15}")
print("-" * 57)
for ns, pct in namespace_allocation.items():
cost = total * pct / 100
print(f"{ns:<20} {'mixed':<10} {pct:<5.1f}% ${cost:<8.2f}")
oc = OpenCostSimulator()
oc.add_cluster("prod-aws", "AWS", 20, 500)
oc.add_cluster("prod-gcp", "GCP", 15, 450)
oc.namespace_breakdown({"production": 50, "staging": 20, "ml-training": 20, "data-warehouse": 10})
Expected output:
Namespace Cloud Allocation Monthly Cost
---------------------------------------------------------
production mixed 50.0% $4,375.00
staging mixed 20.0% $1,750.00
ml-training mixed 20.0% $1,750.00
data-warehouse mixed 10.0% $875.00
3. Cross-Cloud Data Transfer Costs
Data leaving one cloud to another is the most expensive hidden cost in Multi-Cloud:
# cross_cloud_transfer.py
connections = {
"AWS us-east-1 β GCP us-central1": {"gb": 5000, "rate": 0.08},
"GCP us-central1 β Azure eastus": {"gb": 3000, "rate": 0.085},
"AWS eu-west-1 β GCP europe-west1": {"gb": 2000, "rate": 0.09},
"Internal each cloud": {"gb": 15000, "rate": 0},
}
for conn, s in connections.items():
cost = s["gb"] * s["rate"]
print(f"{conn:<40} ${cost:>8.2f}/mo")
Expected output:
AWS us-east-1 β GCP us-central1 $400.00/mo
GCP us-central1 β Azure eastus $255.00/mo
AWS eu-west-1 β GCP europe-west1 $180.00/mo
Internal each cloud $0.00/mo
Mitigations:
- Keep data-intensive communication within one cloud
- Use Direct Connect / ExpressRoute / Interconnect for private links
- Use Multi-Cloud object storage (like MinIO) to avoid egress
- Archive cross-cloud data to cold storage before transfer
4. Workload Placement by Cloud Pricing
Each cloud has different pricing strengths:
| Workload | Cheapest Cloud | Why |
|---|---|---|
| GPU/ML training | GCP | Preemptible GPUs 60-80% cheaper |
| Windows VMs | Azure | Native Windows licensing, Hybrid Benefit |
| Linux burstable | AWS | t3/t4g instances, Spot Fleet |
| Kubernetes | GCP/GKE | No control plane cost, Autopilot |
| SQL Server | Azure | Best managed SQL + Hybrid Benefit |
| Big data (Spark) | AWS EMR | Cheapest per-hour + Spot integration |
class WorkloadPlacer:
def recommend(self, workload, requirements):
recommendations = {
"ml_training": {"cloud": "GCP", "reason": "Preemptible GPUs save 70%", "estimated_savings": "60-80%"},
"windows_vms": {"cloud": "Azure", "reason": "Hybrid Benefit + native Windows", "estimated_savings": "30-50%"},
"linux_web": {"cloud": "AWS", "reason": "Graviton + Spot", "estimated_savings": "40-60%"},
"kubernetes": {"cloud": "GCP", "reason": "Autopilot, no control plane cost", "estimated_savings": "20-30%"},
"sql_server": {"cloud": "Azure", "reason": "Best managed SQL + Hybrid Benefit", "estimated_savings": "30-40%"},
}
return recommendations.get(workload, {"cloud": "unknown", "reason": "Cost analysis needed"})
placer = WorkloadPlacer()
for wl in ["ml_training", "windows_vms", "Kubernetes", "sql_server"]:
rec = placer.recommend(wl, {})
print(f"{wl:<20} β {rec['cloud']:<6} {rec['reason']}")
Expected output:
ml_training β GCP Preemptible GPUs save 70%
windows_vms β Azure Hybrid Benefit + native Windows
kubernetes β GCP Autopilot, no control plane cost
sql_server β Azure Best managed SQL + Hybrid Benefit
5. FinOps for Multi-Cloud
FinOps (Financial Operations) brings financial accountability to cloud spend:
- Visibility: Centralized dashboard across all clouds
- Allocation: Tag/label every resource with cost center and project
- Optimization: Continuous rightsizing, reservations, spot/ preemptible
- Governance: Budgets, policies, automated shutdowns
- Negotiation: Use Multi-Cloud leverage for enterprise discounts
class FinOpsDashboard:
def __init__(self):
self.clouds = {}
def add_cloud(self, name, monthly_spend, savings_potential):
self.clouds[name] = {"spend": monthly_spend, "savings": monthly_spend * savings_potential}
def show(self):
total_spend = sum(c["spend"] for c in self.clouds.values())
total_savings = sum(c["savings"] for c in self.clouds.values())
print(f"{'Cloud':<10} {'Monthly':<12} {'Savings Potential':<20} {'Optimized':<12}")
print("-" * 54)
for name, c in self.clouds.items():
print(f"{name:<10} ${c['spend']:<8,.0f} ${c['savings']:<8,.0f} ${c['spend'] - c['savings']:<8,.0f}")
print(f"{'TOTAL':<10} ${total_spend:<8,.0f} ${total_savings:<8,.0f} ${total_spend - total_savings:<8,.0f}")
finops = FinOpsDashboard()
finops.add_cloud("AWS", 45000, 0.35)
finops.add_cloud("Azure", 28000, 0.30)
finops.add_cloud("GCP", 22000, 0.25)
finops.show()
Expected output:
Cloud Monthly Savings Potential Optimized
------------------------------------------------------
AWS $45,000 $15,750 $29,250
Azure $28,000 $8,400 $19,600
GCP $22,000 $5,500 $16,500
TOTAL $95,000 $29,650 $65,350
Common Mistakes
1. Duplicate Discounts Across Clouds
Buying Reserved Instances on AWS and Committed Use Discounts on GCP for the same workload. Choose one primary cloud per workload.
2. Ignoring Cross-Cloud Egress
Moving data between clouds costs $0.08-0.12/GB both ways. A 10TB daily transfer costs $800-1,200/day. Architect data locality when possible.
3. Not Using Cloud-Agnostic Tools
Each cloud's native tools show only its own costs. Use tools like CloudHealth or OpenCost for unified visibility.
4. Different Tagging Standards
If AWS tags are "CostCenter" but Azure tags are "cc", cost allocation breaks. Standardize tag/label names across clouds.
5. Not Negotiating Multi-Cloud Discounts
Vendors offer committed spend discounts. Use your Multi-Cloud leverage to negotiate better rates with each provider.
Practice Questions
1. What is the most expensive hidden cost in Multi-Cloud? Cross-cloud data transfer egress. Moving data between AWS and GCP costs $0.08-0.12/GB, and it's charged by both the sending cloud (egress) and receiving cloud (ingress).
2. How would you normalize billing across clouds? Map each cloud's SKU names to a common taxonomy. Use a centralized FinOps tool (CloudHealth, Vantage) that imports billing from all clouds. Normalize to common dimensions: vCPU-hours, GB-months, GB-transferred.
3. Which cloud is cheapest for GPU workloads? GCP is typically cheapest for GPU workloads due to preemptible GPU availability (60-80% discount) and per-second billing. AWS Spot GPU instances are also competitive.
4. What is the FinOps lifecycle? Visibility β Allocation β Optimization β Governance β Negotiation. The cycle repeats continuously as workloads and pricing change.
5. Challenge: Design a Multi-Cloud cost Strategy for a company spending $200k/month across AWS (60%), Azure (25%), and GCP (15%). Identify $50k in savings opportunities.
Mini Project: Multi-Cloud Savings Estimator
class MultiCloudSavingsCalculator:
def __init__(self):
self.workloads = []
def add_workload(self, name, current_cloud, monthly_cost, recommended_cloud, savings_pct):
self.workloads.append({
"name": name, "current": current_cloud, "cost": monthly_cost,
"recommended": recommended_cloud, "savings_pct": savings_pct,
})
def calculate(self):
total_current = sum(w["cost"] for w in self.workloads)
total_optimized = sum(w["cost"] * (1 - w["savings_pct"]) for w in self.workloads)
print(f"{'Workload':<25} {'Current':<10} {'Recommended':<12} {'Monthly':<10} {'Savings':<10}")
print("-" * 67)
for w in self.workloads:
optimized = w["cost"] * (1 - w["savings_pct"])
print(f"{w['name']:<25} {w['current']:<10} {w['recommended']:<12} ${optimized:<7,.0f} ${w['cost'] - optimized:<7,.0f}")
print(f"\nTotal current: ${total_current:,.0f}/mo")
print(f"Total optimized: ${total_optimized:,.0f}/mo")
print(f"Total savings: ${total_current - total_optimized:,.0f}/mo ({((total_current-total_optimized)/total_current*100):.0f}%)")
calc = MultiCloudSavingsCalculator()
calc.add_workload("ML training", "AWS", 15000, "GCP", 0.40)
calc.add_workload("Web servers", "Azure", 12000, "AWS", 0.25)
calc.add_workload("Databases", "GCP", 8000, "Azure", 0.30)
calc.calculate()
FAQ
Related Concepts
What's Next
You now understand multi-Cloud Cost Optimization! Next, explore Cost Anomaly Detection for catching unexpected spend spikes, and learn about Cloud FinOps practices for building a cost-conscious culture.
- Practice daily β Review normalized Multi-Cloud costs in a single dashboard
- Build a project β Create a cross-cloud egress monitor that alerts on large transfers
- Explore related topics β Check out workload placement optimization frameworks
Built by the developers of Doda Browser, DodaZIP, and Durga Antivirus Pro.
Built by the developers of DodaTech
Doda Browser, DodaZIP & Durga Antivirus Pro