DEV Community

Cover image for Multi-Cloud Strategy in 2026: When It Helps, When It Hurts, and How to Run It Well
softverseAdmin
softverseAdmin

Posted on Originally published at devopsenginer.com

Multi-Cloud Strategy in 2026: When It Helps, When It Hurts, and How to Run It Well

TL;DR

Multi-cloud is a requirement you discover, not a badge you collect. Add a second cloud when something concrete demands it — a customer's contract, a data-residency rule, a disaster-recovery target you have actually tested, or a capability your primary cloud genuinely lacks. Do not add one to "avoid lock-in" in the abstract or to save money: a second cloud duplicates your platform, your security surface, and your skills bill, and routine cross-cloud traffic is billed as internet egress on the way out.

If you do run more than one cloud, the workable shape is: split by workload (not by layer), keep data in one home per dataset, standardise the boring layer — source control, CI, Terraform workflow, container packaging, telemetry format — and let each cloud's native services stay native inside its boundary.

For most small teams, the right 2026 answer is one primary cloud, plus cheap portability habits: containers, portable data formats, and infrastructure as code. Portability you practise is worth more than portability you merely claim.

Originally published on DevOps Enginer.

Introduction: most multi-cloud is accidental

Ask a room of engineers whether they run multi-cloud and many hands go up. Ask how many chose it — designed it, budgeted for it, staffed it — and most hands go down. The second cloud usually arrives sideways: an acquisition brings its own estate, a customer insists their data live in a specific provider, a data team adopts a warehouse on another cloud, or one team picks a different cloud for a new project and nobody ever consolidates.

That distinction matters, because accidental multi-cloud still incurs all of the costs of deliberate multi-cloud — two identity systems, two network models, two sets of failure modes — without any of the decision-making that makes those costs worth paying.

This guide replaces the original 2025 version of this article, which promised that one unified pipeline could run AWS, Azure, and GCP "without chaos". That was too optimistic, and parts of it were wrong in instructive ways, so I have corrected or removed them throughout this version. The 2026 version starts from a harder question: should you be multi-cloud at all? Only after that does it cover the patterns and the shared platform layer that make a second cloud survivable.

A quick vocabulary check, because vendors blur these words:

  • Multi-cloud: the same organisation runs meaningful workloads on two or more public clouds.
  • Hybrid cloud: public cloud plus your own data centre or private cloud, operated as one estate.
  • Multi-cloud by SaaS: your company uses many SaaS products. That is a procurement fact, not an architecture strategy, and it does not require any of what follows.

Let me be honest about the scale I'm writing from. My own projects live on GitHub and deploy through Vercel, and my AWS and GCP accounts are mostly classrooms — places I spin things up to learn how they work. When something breaks at my scale, it looks like this: a deploy of my own 3D portfolio fails, and I am the developer, the operations team, and the support desk, all in one chair. Because the whole system is one platform I know deeply, I can trace the failure and fix it myself. That experience is exactly why I'm sceptical of doing it across two clouds I only half-know: the same bad evening, split across two providers, two consoles, and two sets of failure modes, helps nobody. For a solo operation, one platform known deeply isn't a compromise — it's the correct size, and it's why everything below starts from the position that a second cloud has to argue its way in.

1. When multi-cloud is a real requirement

A second cloud earns its complexity when at least one of these is true — and documented, not just felt.

1.1 A customer, contract, or regulator requires it

Some enterprise customers will only buy if their data is processed in a named provider or a named jurisdiction. Data-residency rules can have the same effect: the data must live in a specific region, and your primary cloud's footprint or legal posture there does not satisfy the requirement. This is the least glamorous and most legitimate reason. The requirement names the cloud for you; your job is to contain it to the workloads it actually applies to.

1.2 Disaster recovery with a tested target

"If our cloud has a bad day, we fail over to the other one" is a strategy only if three things exist: the data is already replicated, the failover has been rehearsed, and someone has written down the recovery time and recovery point you are actually achieving. A second cloud that has never received a failover is not DR; it is a hope with a billing account. Note the honest middle ground: backups exported to a second provider, with a documented restore path, cover many real disasters at a fraction of active multi-cloud cost.

1.3 A capability gap you can name

Sometimes one workload genuinely belongs elsewhere: a data platform whose warehouse or AI tooling is materially better for a specific job, a managed service with no equivalent on your primary cloud, a region your provider does not serve. The test is specificity. "Their Kubernetes is better" is not a capability gap. "This pipeline cuts from three tools to one on that platform, here is the comparison" is.

1.4 An inherited estate

Mergers and acquisitions hand you a working system on another cloud. Rewriting or migrating it to satisfy an architecture diagram is usually the expensive option. The strategy here is containment and gradual convergence: connect it safely, observe it centrally, and let natural rewrite moments — not ideology — decide if it ever moves.

1.5 Negotiating leverage — a side benefit, not a strategy

Being able to walk away does improve your negotiating position. But leverage only exists if the walk-away is credible, and it is not credible if moving would take a year. Treat leverage as a bonus that portability habits give you, never as the reason for running two production platforms.

Reasons that do not survive scrutiny

  • "Avoid vendor lock-in." Lock-in lives mostly in your data, your team's habits, and managed services — not in which logo is on the VM. A badly designed multi-cloud estate locks you into two vendors plus a permanent integration tax.
  • "It will be cheaper." Splitting spend usually loses volume discounts and commitment pricing on both sides, duplicates platform services, and adds egress between them. Section 6 goes into the maths.
  • "Provider X had an outage." One provider's bad day does not justify a permanent second platform. Multi-region design inside one cloud answers most availability requirements with far less operational surface.

2. The price you pay: the complexity budget

Every cloud you add charges rent in the same currencies:

  • Skills. IAM, networking, and failure behaviour differ in ways documentation understates. A team that is deep in one cloud and shallow in another is, on its worst day, a single-cloud team with extra pager duty.
  • Security surface. Two clouds means two identity planes, two audit-log formats, two sets of default settings to harden, and cross-cloud credentials to protect. Federation done badly is worse than no federation.
  • Duplicated platform. DNS, certificate handling, secrets, logging pipelines, alerting, backup tooling, and cost reporting all exist twice — or exist once and fit neither cloud well.
  • Lowest-common-denominator pressure. The more you insist that everything work identically everywhere, the more you forfeit the managed services that made each cloud attractive, and the more custom platform you must build and own.
  • Support and escalation. When an incident spans clouds, each provider's support can legitimately point at the other side of the boundary. Your team becomes the integration layer — including at 3 a.m.

None of this means "never". It means the requirement from Section 1 has to be worth a permanent tax, because the tax is permanent.

3. Strategy patterns that actually work

There are three patterns with a decent track record. Most real estates mix the first two; the third is a deliberate engineering programme, not a default.

3.1 Best-of-breed per workload

Split by workload, never by layer. The application and its database live together in the cloud chosen for that workload; another complete workload lives elsewhere. The boundary between clouds is an API or an asynchronous data flow — never a synchronous call chain and never a shared database.

  • Give each workload one accountable owner and one home cloud.
  • Integrate through published APIs, events, or scheduled data exports — paths that tolerate the other side being slow or down.
  • Accept different tooling inside each boundary. The shared layer (Section 4) standardises how you build and observe, not which managed services you use.

This is the pattern behind most honest multi-cloud estates: the data platform sits where its warehouse is strongest, the product platform stays where the team is deepest, and neither pretends to be the other.

3.2 Active–passive disaster recovery

One cloud runs production; the second holds replicated data and enough infrastructure definition to rebuild. Two honest variants:

  • Backup-and-restore across clouds. Export backups and IaC to the second provider; restore on disaster. Cheapest, slowest, and — if restores are tested — perfectly respectable for many RTO/RPO targets.
  • Warm standby (pilot light). Core data replicates continuously; a minimal footprint runs in the second cloud and scales up on failover. Costs more every month, recovers faster, and demands regular failover drills.

What about active–active across clouds? Running the same workload live in two clouds simultaneously is the hardest pattern in this article: it needs conflict handling for writes, global traffic steering, and data consistency decisions that most products do not actually require. If your RTO is measured in hours rather than seconds, active–passive gets you there with a fraction of the machinery. Choose active–active only when a measured business requirement — not an architecture aesthetic — demands it, and budget for the data-consistency work explicitly.

3.3 Cloud-agnostic abstraction

Deliberately build on portable units — containers orchestrated by Kubernetes, PostgreSQL-compatible databases, Kafka-compatible streaming, S3-compatible object storage, OpenTelemetry for telemetry — so workloads can move. This is a real strategy with real costs:

  • You give up managed services that do not fit the portable set, or accept that those parts are not portable.
  • Kubernetes makes the compute layer similar, not identical: identity integration, load balancers, storage classes, and ingress still differ per cloud, and your manifests will grow per-cluster configuration.
  • Abstraction leaks at the worst moments — during incidents, when provider-specific behaviour is exactly what you are debugging.

Used selectively — portable where portability is cheap, native where a managed service is the point — this pattern buys options. Used as dogma, it becomes a private cloud you built yourself, hosted on two public ones. (The compute side of this trade-off is covered in depth in Serverless vs Containers.)

Pattern Best for Standing cost Main risk
Best-of-breed per workload Distinct workloads with distinct platform fits Two contained platforms Integration drift at the boundaries
Active–passive DR A tested recovery target against provider-level failure Replication + standby footprint Untested failover; silent replication lag
Cloud-agnostic abstraction Teams that must be able to move workloads Portable-stack engineering; managed services forgone Lowest-common-denominator platform; leaky abstractions

4. The shared layer: standardise the boring parts

You cannot standardise the clouds. You can standardise your layer above them — the paths code, configuration, and telemetry travel. That is where one pipeline and one workflow genuinely help.

4.1 Networking: connect deliberately, route simply

  • Private connectivity. Each provider sells its own interconnect family (Direct Connect, ExpressRoute, Cloud Interconnect), and cross-cloud private links are typically built through colocation / network-fabric partners or plain site-to-site VPN for lower-stakes links. Pick per link, based on traffic volume and sensitivity — not on a diagram that shows a uniform mesh.
  • Address space and DNS. Plan non-overlapping IP ranges across clouds from day one; renumbering later is miserable. Use one DNS authority with per-cloud zones delegated beneath it, so names resolve consistently everywhere.
  • Traffic steering. Keep global entry simple: health-checked DNS failover or a single global load-balancing entry for the workloads that truly need it. Most workloads in a best-of-breed split have one home and need no steering at all.
  • Egress is the standing tax. Traffic between clouds generally travels as internet egress from the source and is billed per GB by destination and tier; the providers' own pricing pages are the only reliable rates (AWS: http://aws.amazon.com/vpc/pricing/ · Azure: https://azure.microsoft.com/pricing/details/bandwidth). Chatty cross-cloud designs pay this tax on every request. Providers have publicised waived or reduced egress for customers fully leaving a platform — AWS describes its programme here: https://aws.amazon.com/blogs/aws/free-data-transfer-out-to-internet-when-moving-out-of-aws/ — but that is an exit door, not a discount on daily cross-cloud traffic. Design so that high-volume data flows stay inside one cloud.

4.2 Identity: one front door, native rooms

  • Humans: one identity provider, federated into every cloud with SSO and lifecycle (SCIM) provisioning. Nobody should have a separate local password per cloud console.
  • Workloads: federate, do not copy keys. Modern workload identity federation lets a workload in one cloud exchange its native token for short-lived credentials in another — Google documents this pattern for AWS, Azure, GitHub, and OIDC providers here: https://docs.cloud.google.com/iam/docs/best-practices-for-using-workload-identity-federation — and the same OIDC approach is what your CI should use to deploy to each cloud. Long-lived access keys pasted into another cloud's secrets store are the cross-cloud equivalent of a password on a sticky note.
  • Authorisation stays native. Federation answers "who is this?" — each cloud's IAM still decides "what may it do?" Resist tools that promise one permission model to rule them all; the models do not map cleanly, and pretending they do creates silent over-privilege.

4.3 Observability: one pane, honestly assembled

  • Standardise the format before the tool: OpenTelemetry instrumentation and a Collector pipeline can receive, process, and export telemetry in a vendor-agnostic way (https://opentelemetry.io/docs/collector/), so services in every cloud emit the same traces, metrics, and structured logs.
  • Build incident dashboards around user-facing SLIs — request success, latency, saturation — with the cloud as a dimension, not as the organising principle. During an incident you ask "is checkout failing?" first and "on which cloud?" second.
  • Keep each cloud's native logs flowing into the same place, and rehearse the cross-cloud incident: one timeline, one severity definition, one postmortem template. Also budget for it — shipping all logs across clouds is itself an egress and ingestion bill.

4.4 Infrastructure as code with Terraform: one workflow, not one module

Terraform is the most practical common workflow for multi-cloud — but be precise about what is shared. HashiCorp's own documentation is blunt: Terraform talks to each platform through a provider plugin, and every provider defines its own resource types (https://developer.hashicorp.com/terraform/language/block/provider). An aws_vpc and a google_compute_network are different resources with different arguments. There is no write-once-run-anywhere module for real infrastructure.

What you can share:

  • One workflow: the same review → plan → approve → apply discipline, the same CI shape, the same policy checks for every cloud.
  • One repository layout: shared platform modules for your standards (naming, tagging, logging) beside clearly separated per-cloud stacks — for example infra/aws/…, infra/gcp/…, each with its own state backend in its own cloud. One shared state file across clouds concentrates risk and serialises unrelated teams.
  • One set of conventions: naming, tags/labels for cost and ownership, and environment promotion rules that mean the same thing everywhere.

For a deeper comparison of Terraform with the per-cloud alternatives, see Terraform vs Pulumi vs CloudFormation.

4.5 Delivery: same artifact, admitted differences

  • Build the container image once, record its digest, and promote that digest through environments in both clouds. Rebuilding per cloud destroys the "same artifact" guarantee.
  • A GitOps controller such as Argo CD can reconcile many clusters from one source of truth, with per-cluster overlays holding the honest differences — endpoints, storage classes, ingress annotations — instead of pretending the clusters are identical.
  • Keep deployment approvals and evidence in the same system for every cloud, so a release record reads the same way regardless of target.

5. Data gravity: the part that actually locks you in

Applications are replaceable; data accumulates gravity. Every month a dataset lives somewhere, more reports, pipelines, caches, and habits attach to it — and moving it means moving terabytes out through a billed egress door while keeping it consistent during the move.

Practical rules:

  • One home per dataset. Each dataset has exactly one authoritative cloud. Other clouds consume it through APIs, events, or scheduled exports with an explicit freshness expectation ("up to 15 minutes behind" is a design decision, not an accident).
  • Managed databases do not travel. A managed PostgreSQL on one cloud and its near-namesake on another differ in extensions, backup mechanics, failover behaviour, and operational tooling. "Both are Postgres" is the beginning of a migration plan, not the plan.
  • Object storage is the most portable layer — the S3 API is widely imitated — but even there, identity integration, lifecycle rules, and event systems differ, and bulk movement is an egress project, not a config change.
  • Write the exit down. For each important dataset, keep a one-page note: export format, estimated volume, the tool you would use, and when you last tested a restore into a scratch environment. An exit plan you have never tested is a hypothesis.

My respect for data gravity was earned in a small, embarrassing way. My AWS account is a learning account, and more than once I've opened it weeks after an experiment and found the leftovers still sitting there — an unattached volume, an old snapshot, a bucket with no lifecycle rule — each one tiny, all of them mine, none of them announced. If a handful of forgotten test resources can quietly accumulate in one account I supposedly control, I have no illusions about what years of real data does inside a dataset that matters. So my portability habit is deliberately boring: my projects run in containers, and the infrastructure I define lives in Terraform rather than in console clicks. That buys real options — the same image can run on another platform, and my infrastructure exists as reviewable code I could adapt to a different provider. What it does not protect me from is the data layer itself: once data accumulates history and habits in one place, moving it is a project, not a config change — which is why the exit notes above matter more than the container format.

6. Cost and skills: the honest trade-offs

Multi-cloud cost conversations usually show the savings slide and skip the rest of the deck. The full picture:

Costs that go up

  • Two sets of platform services: logging, monitoring, secrets, DNS, backup, and security tooling are bought or built twice.
  • Standing data-transfer charges on every chatty cross-cloud path (Section 4.1), plus the interconnect or VPN links themselves.
  • Weaker discount leverage: spend split across providers buys smaller commitment tiers in each, and enterprise agreements reward concentration.
  • People cost — the largest line, and the one never in the spreadsheet: on-call depth, training, and the senior time spent being the integration layer.

Costs that can go down

  • A specific workload placed on the platform where it is genuinely cheaper for that shape of work — after including the data movement to feed it.
  • Avoided re-platforming when an inherited estate is allowed to stay put.
  • Option value at contract renewal, if your portability is real.

If you want the single-cloud cost discipline that should come first, the tactics in AWS Cost Optimization will save most teams more than a second cloud ever will.

Skills are the binding constraint. A useful rule: do not run a production cloud your team cannot debug at 3 a.m. without the one person who "knows that cloud". If a second cloud enters the estate, budget for at least two engineers with real depth in it, or buy that depth through a managed service — and say which you chose, in writing, before the first workload lands.

7. Decision checklist: should you go multi-cloud?

Answer honestly. The checklist is designed to talk you out of it unless a requirement talks louder.

  • [ ] Can we name the requirement — contract, regulation, recovery target, capability gap — in one sentence, with an owner?
  • [ ] Is the requirement worth a permanent second platform: identity, networking, observability, backups, and on-call?
  • [ ] Do the workloads split cleanly, with data in one home per dataset and no synchronous cross-cloud call chains?
  • [ ] Have we priced the whole thing — duplicated platform services, egress on real traffic volumes, weaker discounts, and people's time — not just the compute comparison?
  • [ ] Do at least two engineers have production depth in the second cloud, or is there a funded plan to buy it?
  • [ ] For DR claims: has the failover or restore actually been rehearsed in the last year?
  • [ ] Do we have an exit note per key dataset, and have we tested a restore?
  • [ ] If the honest answer to the first question is "flexibility" — have we considered the cheaper portfolio instead: one cloud, containers, IaC, portable data formats, tested backups?

If the first box is unticked, stop. Stay on one cloud and buy the cheap portability habits; they deliver most of the freedom multi-cloud promises, at a small fraction of the standing cost. If the first box is ticked but several others are not, your project is not "adopt multi-cloud" — it is "close these gaps, then adopt it in the smallest scope that satisfies the requirement".

So where do I land personally? I do have "a second cloud" — as a learning account, where its job is to teach me, not to carry anything that matters. For anything real at my scale, I would not go multi-cloud: a solo project or a small team gets more reliability from one cloud used well, plus the cheap portability habits, than from a second platform nobody has real depth in. What would change my mind is a requirement with a name — a customer contract that specifies where data must be processed, a data-residency rule my primary cloud can't satisfy, or a recovery target I have actually rehearsed and can't meet inside one provider. The day one of those arrives in writing, I'll design for two clouds on purpose. Until then, the second account stays what it honestly is: a classroom, not a strategy.

8. Common mistakes

  1. Splitting by layer instead of workload — front end in one cloud, database in another — which welds the clouds together with latency and egress on every request.
  2. Declaring "no lock-in" while adopting two clouds' managed services casually, ending up locked into both, plus the integration code between them.
  3. Believing Terraform makes infrastructure portable. It standardises your workflow; the resources, defaults, and failure modes remain provider-specific.
  4. Untested DR. Replication quietly lagging or broken, a failover runbook last opened a year ago, credentials in the standby cloud expired.
  5. Static keys between clouds. Long-lived credentials copied into another provider's environment "temporarily", then forgotten — a standing cross-cloud attack path.
  6. Forcing identical tooling everywhere, including where a cloud's native service is clearly better, and paying for a bespoke platform team to maintain the sameness.
  7. No owner for the boundary. Integrations, shared dashboards, and the cross-cloud network belong to "everyone", so they belong to no one during an incident.
  8. Counting only the compute quote. The business case ignores duplicated platform services, egress at real volumes, and the senior hours spent integrating.

FAQ

What is the difference between multi-cloud and hybrid cloud?
Multi-cloud means running workloads on two or more public cloud providers. Hybrid cloud combines a public cloud with your own data centre or private cloud as one estate. Many organisations are both, but the strategies, tooling, and failure modes differ enough that the words should not be used interchangeably.

Does multi-cloud really prevent vendor lock-in?
Only partly, and only if you invest in portability deliberately. Compute is the easiest layer to move; data, managed services, identity integration, and team skills are where lock-in actually lives. Splitting workloads across clouds without portable data practices usually replaces one dependency with two.

Is multi-cloud cheaper than a single cloud?
Usually not for the estate as a whole. Individual workloads can be cheaper on a better-fitting platform, but duplicated platform services, cross-cloud egress, weaker volume discounts, and extra staffing typically outweigh placement savings. Treat cost as a reason to evaluate a specific workload move, not as a reason to adopt multi-cloud generally.

Can Terraform deploy the same infrastructure to any cloud?
No. Terraform offers one workflow and language, but each cloud is reached through its own provider with its own resource types and arguments. Shared modules can encode your standards; the infrastructure definitions themselves remain per-cloud.

We only use Kubernetes — aren't we already cloud-agnostic?
You have portable compute packaging, which is valuable, but identity, load balancing, storage, ingress, and managed data services still differ per cloud, and your clusters will carry per-cloud configuration. Kubernetes narrows the portability gap; it does not close it.

What is the smallest sensible multi-cloud footprint?
One workload with a named requirement, in its own account/project boundary, integrated through APIs or data exports, observed centrally, with an owner. That is a strategy. "A bit of everything in both clouds" is not.

Conclusion

Multi-cloud done well is boring in the best way: a named requirement, workloads with one home each, data that stays put, a shared layer for identity, delivery, and telemetry, and rehearsed answers for failure and exit. Multi-cloud done casually is two of everything — including outages you have to debug twice.

If you take one idea from this guide, take the ordering: requirement first, pattern second, tooling last — and for everyone without that first item, one cloud plus practised portability habits is not a compromise. It is the strategy.

Related guides

Top comments (0)