Finoud
Multi-Cloud

Managing Cloud Costs Across AWS, GCP, and Azure: The Multi-Cloud Reality Check

Most teams run multi-cloud; almost none feel they have real cost visibility. Here's the actual challenge — normalizing three billing models — and a practical path to one source of truth.

Finoud Team12 min read

The overwhelming majority of organizations run more than one cloud. Ask those same teams whether they have good cost visibilityacross all of them and the room goes quiet. That gap — almost everyone is multi-cloud, almost nobody feels in control of the bill — is the entire problem this article is about.

Multi-cloud isn’t a strategy most teams set out to adopt; it’s a state they wake up in. And the moment you’re in it, a quiet tax kicks in: three providers, three billing models, three sets of native tools that each refuse to look at the other two. You can know your AWS bill cold and still have no honest answer to “what did we spend on cloud last month, by team?” This is a guide to closing that gap — what actually makes it hard, and the practical path to one source of truth.

Why teams end up multi-cloud (on purpose or not)

Before fixing the cost problem, it helps to be honest about how you got here. Almost nobody arrives at multi-cloud through a single clean decision. It accretes:

  • Acquisitions.You bought a company that was all-in on GCP; now you run AWS and GCP whether you wanted to or not. M&A is the single most common path to accidental multi-cloud.
  • Best-of-breed services.Your stack is on AWS, but the data team wants BigQuery, or someone needs Azure OpenAI, or a specific managed service is simply better on another cloud. One workload moves, and now you’re multi-cloud for real.
  • Resilience and avoiding lock-in.Some teams deliberately spread critical workloads across providers so a single cloud’s regional outage can’t take them fully down.
  • Negotiating leverage.A credible ability to move spend is leverage at renewal time. Being genuinely portable — or at least looking portable — changes the conversation with a vendor’s sales team.
  • Shadow IT.A team swiped a corporate card for an Azure subscription to ship something fast, and eighteen months later it’s load-bearing. You didn’t choose it; you inherited it.

The reasons are mostly legitimate. The bill that results is mostly invisible. That’s the tension.

The core problem: three billing models that don’t agree

Here’s the thing nobody tells you when you go multi-cloud: the hard part isn’t running workloads on three clouds. It’s that the three providers describe what you spent in three fundamentally different languages. Same concept — “what did this cost?” — three incompatible answers.

Each cloud’s billing export is its own data model, with its own granularity, its own latency, and its own idea of how to name a thing:

  • AWSgives you the Cost and Usage Report (CUR) — an extremely granular, service-oriented, line-item export delivered to S3, with usage broken down by resource, operation, and usage type, and data that lands close to real time. It’s the richest of the three and also the most verbose; a CUR for a busy account is millions of rows a day.
  • GCPexports detailed billing to BigQuery. The data is excellent, but the taxonomy is entirely GCP’s: services and SKUs are named and grouped differently, labels behave differently from AWS tags, and the schema assumes you’ll query it with SQL rather than click through a console.
  • Azureuses Cost Management, with a structure shaped by its enrollment model. Whether you’re on a Microsoft Customer Agreement (MCA), an Enterprise Agreement, or pay-as-you-go changes how scopes, invoices, and amortization show up — and the cost hierarchy (billing account, billing profile, subscription, resource group) doesn’t map cleanly onto how AWS or GCP slice things.

Then layer on the differences in granularity and lag. AWS resource-level detail is rich but needs to be enabled and lands in S3; GCP’s lives in BigQuery; Azure’s arrives through its own exports and APIs. Amortization of commitments, the timing of credits, and how refunds appear all differ. Stitch three of these together naively and your “total cloud spend” number will be wrong in ways that are hard to even notice.

AWSGCPAzure
Billing exportCost & Usage Report (CUR) to S3Billing export to BigQueryCost Management exports / APIs
Data modelService-oriented line items, per-resourceService + SKU, query-first schemaScope hierarchy tied to enrollment (MCA/EA)
GranularityVery high (resource, operation, usage type)High (SKU-level), via SQLHigh, varies by agreement type
FreshnessNear real-time, multiple updates/dayUpdated through the dayTypically several hours of lag
Tagging primitiveTags (key/value)Labels (key/value)Tags (key/value), some resources untaggable
Commitment modelSavings Plans, Reserved InstancesCommitted Use Discounts (CUDs)Reservations, Savings Plans (compute)
The real work

Multi-cloud cost management is, before anything else, a data normalization problem. Until the three exports speak a common language, every dashboard, allocation, and budget you build on top of them inherits their disagreements.

Comparing true costs across clouds

A question that comes up constantly: “Is X cheaper on AWS or GCP or Azure?” The honest answer is that a list-price comparison is almost always misleading. Discounts, commitment models, instance families, and the gravitational pull of egress distort everything. Here’s how to think about the categories that actually move the bill.

Compute

EC2, Compute Engine, and Azure Virtual Machines all rent you a VM, but they don’t name or shape the machines the same way. Families, vCPU-to-memory ratios, and sustained- versus committed-use discounting all differ. The biggest cross-cloud lever right now is Arm: AWS Graviton, GCP’s Arm-based Axion/Tau offerings, and Azure’s Cobalt/Ampere instances can cut compute cost meaningfully versus comparable x86 — but only for workloads you can actually run on Arm. Compare effective rates after your commitments and after any Arm migration, not the on-demand x86 sticker price.

Storage

S3, Google Cloud Storage, and Azure Blob Storage all sell tiered object storage — hot, infrequent-access, archive — but the tier boundaries, minimum storage durations, retrieval fees, and request pricing differ enough that the “cheapest” tier depends entirely on your access pattern. Archive is nearly free to store and expensive to read; guess your retrieval frequency wrong and the cheap tier becomes the expensive one. Lifecycle policies matter more than the headline per-GB rate.

Managed databases

This is where comparisons get genuinely hard. RDS and Aurora, Cloud SQL and AlloyDB, Azure SQL Database and Cosmos DB are not equivalents you can line up in a row. They differ in engine compatibility, how they meter (provisioned vCPU/RAM versus serverless capacity units versus Cosmos’ request units), how storage and I/O are billed, and how replicas and high-availability are priced. Compare on a workload basis — this specific database, this throughput, this availability target — not on a spec sheet.

Egress and inter-cloud data transfer

And the one that quietly wrecks multi-cloud economics: data transfer. Moving data out of a cloud to the internet is metered and far from free; moving data betweenclouds means you often pay egress on the source side for the privilege. A chatty architecture that spans providers — a service on AWS calling a database on GCP, or analytics in BigQuery reading from S3 — can rack up transfer charges that dwarf the compute it’s connecting. The cheapest cross-cloud byte is the one you don’t move. Co-locate data and the compute that uses it, and treat any new cross-cloud data path as a cost decision, not just an architectural one.

Easy to miss

Inter-cloud egress is the cost that doesn’t show up in a per-service comparison because it lives betweenthe services. It’s also the cost that makes naive “just run it on whichever cloud is cheaper” thinking backfire.

Unify tagging first

Everything downstream — allocation, chargeback, per-team budgets — depends on one unglamorous prerequisite: consistent metadata. You cannot allocate spend across clouds if AWS resources are tagged team, GCP resources are labeled owner, and Azure resources have no tag at all. The dimension you want to report on has to exist, with the same meaning, on every provider.

The mechanics differ — AWS calls them tags, GCP calls them labels, Azure calls them tags again but won’t let you tag everything — so you need a normalized scheme and the discipline (ideally enforced in IaC and policy) to apply it everywhere. That’s a whole discipline of its own; we go deep on it in implementing a unified tagging and cost-allocation strategy across AWS, GCP, and Azure. For this article, just hold onto the order of operations: tag normalization comes before allocation, always.

One source of truth for reporting

The native dashboards are good — within their walls. Cost Explorer is genuinely useful for AWS. GCP Billing reports answer GCP questions. Azure Cost Management is fine for Azure. The problem is structural: none of them can see the other two, so none of them can ever answer a multi-cloud question. There is no native “total cloud spend” view because no provider is incentivized to build you one that includes its competitors.

A unified reporting layer has to deliver at least four things:

  1. Total spend across all providers— one honest number, normalized for amortization and credits, that you can hand to finance without an asterisk.
  2. Per-team and per-environment views— spend sliced by the dimensions you tagged, regardless of which cloud the resources live on.
  3. Per-service views that map across clouds— “compute” that sums EC2 + Compute Engine + Azure VMs, “object storage” that sums S3 + GCS + Blob, so categories mean the same thing everywhere.
  4. Anomalies in one feed— a spike is a spike whether it happened on AWS or Azure; you shouldn’t have to check three consoles to find out something broke.

Every one of these depends on normalization to shared dimensions. The raw exports won’t line up; the work is mapping each provider’s taxonomy onto a common set of service categories, cost types, and tags, so that a chart of “storage spend by team” is actually comparing like with like instead of quietly summing three different definitions of “storage.”

Allocation and chargeback across clouds

Once spend is normalized and tagged, you can do the thing finance actually wants: attribute cost to the teams and products that incurred it. In multi-cloud this gets a wrinkle, because a single team’s footprint often spans providers — their app on AWS, their analytics on GCP, their AI workload on Azure. Their “cloud cost” is a sum across clouds that no single console will ever show them.

Two recurring challenges:

  • Shared infrastructure.Networking, observability, shared data platforms, and central CI/CD don’t belong to one team. You need an allocation rule — proportional, even split, or usage-based — to divide that shared cost fairly, and you need it to apply consistently across every cloud.
  • Cross-cloud team footprints.Rolling a team’s spend up means joining tagged spend from all three providers into one number. If the tags don’t match across clouds, the rollup is fiction.

Then decide how far to take it. Showbackshows each team what they spent — visibility without a bill — and is the right place to start; it changes behavior through awareness and costs you no political capital. Chargebackactually moves the cost to the team’s budget, which creates real accountability but demands that your numbers be defensible to the cent. Start with showback, earn trust in the data, then graduate to chargeback once nobody disputes the figures.

Governance at scale

Visibility tells you what happened. Governance is how you keep it from getting worse. Across three clouds, the controls you’d run on one each need a per-cloud and an aggregate dimension:

  • Budgets, two ways. Per-cloud budgets catch a single provider running hot; an aggregate budget catches the case where each cloud looks fine alone but the total has crept past the plan. You want both, with alerts that fire before the month closes, not after.
  • Commitments, per cloud. This is the one teams get wrong most often: Savings Plans, CUDs, and Reservations do not transfer between clouds. A commitment is a bet on one provider’s baseline. Each cloud needs its own coverage and utilization tracking and its own purchasing cadence. The decision framework is the same everywhere — cover the stable baseline, ladder terms, review monthly — and we lay it out in the Savings Plans vs Reserved Instances decision framework; read CUDs and Azure Reservations as the GCP and Azure analogues of the same idea.
  • Anomalies, aggregated. Detect spikes per cloud, but triage them in one place. A single alerting surface across providers is the difference between catching a runaway cost in hours versus at month-end. The trick is separating real anomalies from normal variance, which we cover in detecting cost anomalies versus normal variance.
  • Rightsizing, per cloud. Idle and oversized resources exist everywhere, but the resource types, metrics, and remediation differ by provider. Run the analysis per cloud; report the savings in one list ranked by impact.

When (not) to consolidate

Reading all this, the tempting conclusion is “multi-cloud is a mess, let’s pick one cloud.” Sometimes that’s right. Often it isn’t. It’s a real trade-off, not a foregone conclusion.

Lean single-cloudStay multi-cloud
Cost mechanicsConcentrated spend earns deeper volume discounts and bigger commitments; no inter-cloud egress.Spend is split, so discounts are shallower and you pay to move data between providers.
OperationsOne billing model, one tag scheme, one set of tools to master.Three of everything — the normalization tax this whole article describes.
ResilienceA single provider's outage is your outage.Critical workloads can fail over across providers.
LeverageLess credible threat to walk at renewal.Genuine portability is negotiating power.
Best-of-breedYou live within one provider's service catalog.Pick the best service per job, wherever it lives.

Weigh it honestly. If you’re multi-cloud purely by accident — one stray Azure subscription, a workload nobody owns — consolidating that back into your primary cloud is usually a clean win. If you’re multi-cloud for resilience, leverage, or a genuinely better service, the operational tax is the price of those benefits, and the answer isn’t to consolidate — it’s to get the visibility and governance that make the tax bearable. The mistake is staying sprawled by inertia while getting none of the upside.

How Finoud helps

Finoud connects AWS, GCP, and Azure as equals — native integrations for all three, not one cloud with the others bolted on — and does the normalization work for you: mapping each provider’s billing export onto shared service categories, reconciling tags and labels into one scheme, and rolling everything up into a single source of truth for total spend, per-team allocation, and per-service comparison. On top of that it tracks commitment coverage and utilization per cloud (Savings Plans, CUDs, and Reservations alike), detects anomalies across providers in one feed, and surfaces rightsizing opportunities everywhere — so the next time someone asks “what did we spend on cloud, and where’s the waste?” you have one honest answer instead of three partial ones. Join the waitlist for early access.

Frequently asked questions

Is multi-cloud actually more expensive than single-cloud?
It can be — you split spend across providers, so you lose the volume-discount concentration of a single vendor, and you pay egress every time data crosses between clouds. But the bigger and more common cost is operational: lost visibility and fragmented governance, where waste hides in a console nobody checks. The raw rates are rarely the thing that hurts you most.
Can I compare costs across AWS, GCP, and Azure apples-to-apples?
Not directly. Each provider uses a different service taxonomy, bills at different granularity, and applies its own discount models, so a line item in one cloud has no exact equivalent in another. To make comparison mean anything, you first normalize spend to common dimensions — compute, storage, egress, by team or environment — and compare on those.
Do reserved capacity commitments transfer across clouds?
No. AWS Savings Plans and Reserved Instances, GCP Committed Use Discounts, and Azure Reservations are all provider-specific and non-transferable — a commitment on one cloud does nothing for usage on another. Each cloud needs its own commitment strategy, sized to its own stable baseline.
Do I need a third-party tool, or are native dashboards enough?
Native dashboards — Cost Explorer, GCP Billing, Azure Cost Management — are genuinely good within their own cloud, and you should use them. What they can't do is compare or allocate spend across clouds, because none of them sees the other two. A single-pane-of-glass layer is what unifies them into one total, one per-team view, and one anomaly feed.