Multi-Cloud Cost Optimization: Beyond AWS
Scope of this article
We deliver on AWS. This is technical commentary on how the cost model differs across the three major providers, written for teams who already run more than one. If your Azure or GCP estate needs hands-on work, you want a specialist in that platform, not us.
Running more than one cloud spreads your risk and gives you room to negotiate at renewal. It also splits your cost data across three billing models that do not agree on what a unit of compute is, how a discount gets applied, or when a month ends. The optimization techniques transfer between providers. The tooling does not.
Where multi-cloud cost work gets hard
Billing complexity
Different billing cycles, currencies, and invoice formats. Comparing two providers means normalizing the data before you can start.
Tool fragmentation
Each provider ships its own cost APIs and recommendation engine, and none of them know the others exist.
Resource sprawl
Orphaned resources are harder to spot when no single console shows everything you are paying for.
Patterns that carry across providers
1. Standardize tagging across clouds
One schema, applied everywhere. Azure calls them tags, GCP calls them labels and enforces lowercase keys, so choose names that survive the strictest of the three.
Universal tag schema
{
"CostCenter": "CC-1001", // Same across all clouds
"Project": "CustomerPortal", // Consistent naming
"Environment": "production", // Standardized values
"Team": "WebDev", // Same team structure
"CloudProvider": "aws|azure|gcp", // Track provider
"Region": "us-east-1", // Normalized regions
"Application": "customer-portal" // App identifier
}2. Aggregate cost data in one place
Whether you buy a platform or write the collector yourself, the target is one table with a provider column. The shape of the query is much the same in all three SDKs:
Cost aggregation sketch
import boto3
from azure.mgmt.consumption import ConsumptionManagementClient
from google.cloud import billing
def get_multi_cloud_costs(date_range):
costs = {}
# AWS Costs
aws_ce = boto3.client('ce')
aws_response = aws_ce.get_cost_and_usage(
TimePeriod=date_range,
Granularity='MONTHLY',
Metrics=['UnblendedCost']
)
costs['aws'] = extract_aws_costs(aws_response)
# Azure Costs
azure_client = ConsumptionManagementClient(credential, subscription_id)
azure_costs = azure_client.usage_details.list(
filter=f"properties/usageStart ge '{date_range['Start']}'"
)
costs['azure'] = extract_azure_costs(azure_costs)
# GCP Costs
gcp_client = billing.CloudBillingClient()
gcp_costs = gcp_client.list_billing_accounts()
costs['gcp'] = extract_gcp_costs(gcp_costs)
return costs3. Buy committed capacity on each platform
Every provider sells the same trade: a term commitment in exchange for a discount. The published ceilings differ, and so does how much flexibility you keep.
| Provider | Commitment type | Published ceiling | Flexibility |
|---|---|---|---|
| AWS | Reserved Instances and Savings Plans | 75% | High with Convertible |
| Azure | Reserved VM Instances | 72% | Medium |
| GCP | Committed Use Discounts | 57% | Medium |
Those ceilings are vendor headline numbers, quoted for the longest term on the least flexible option. Treat them as an upper bound, not a forecast.
4. Watch data transfer between providers
Egress is where multi-cloud architectures quietly get expensive. Anything chatty that spans two providers deserves a second look:
Dedicated interconnects
For sustained volume, Direct Connect paired with ExpressRoute or Cloud Interconnect beats public internet egress rates.
Compression and protocol choice
Compress before transfer, and prefer a binary protocol such as gRPC over verbose JSON for high-frequency traffic.
Colocate what talks
Keep services that exchange a lot of data on the same provider and in the same region. Cheapest optimization available, and the one most often missed.
Workload placement
Each provider has areas where its pricing model is genuinely better. Worth knowing when you decide where a new workload lands:
AWS
- Spot capacity, up to 90% off
- Mature reserved capacity market
- Widest regional footprint
- Deep cost tooling out of the box
Azure
- Hybrid and on-prem integration
- Windows and SQL Server licensing benefits
- Enterprise agreement discounts
- Dev and test subscription pricing
GCP
- Sustained use discounts, applied automatically
- BigQuery for analytics workloads
- Per-second billing
- Spot VMs, formerly preemptible
Tooling
Platforms worth evaluating
Flexera One, formerly RightScale Optima
Cross-cloud cost analytics and recommendations.
Apptio Cloudability
Cost management and chargeback reporting across multiple providers.
OpenCost and Kubecost
Open source, container-level cost attribution if most of your spend sits inside Kubernetes.
Build or buy
Build your own when
- You have engineers who will still own it in a year
- Your allocation rules do not fit an off-the-shelf model
- The licence costs more than the build plus the maintenance
- It has to feed an internal system that already exists
For most teams the answer is buy. A cost platform you never finish is worse than a spreadsheet you actually update.
A sensible order of work
Most teams have one dominant provider and a smaller footprint elsewhere. Fix the dominant one first: that is where the money is, and the habits transfer. On the AWS side, our AWS cost audit surfaces the quick wins first, at a fixed price.
Phase 1: visibility
One tag schema, one aggregated cost view. Until spend is attributable, nothing else can be prioritized.
Phase 2: optimization
Right-size, delete orphans, and buy commitments on the platform carrying the most spend.
Phase 3: automation
Alerts, scheduled shutdowns, and policy enforcement so the accounts do not drift back.
Phase 4: governance
A monthly review with named owners. This is the part everyone skips, and it is why the savings do not last.
One thing worth saying plainly
Multi-cloud is a strategic choice with a real operational cost. If you are on more than one provider because of an acquisition, or because of a single service you could not get elsewhere, the cheapest optimization is often consolidation rather than better tooling across all three.