Multi-Cloud & Hybrid Patterns#

Multi-cloud is one of the most over-sold and under-scrutinised strategies in cloud architecture. Vendors and analysts promote it as best practice; practitioners know it doubles operational complexity. This section separates the legitimate use cases from the cargo-cult adoption and covers the patterns that make multi-cloud and hybrid architectures work when they’re genuinely needed.


When Multi-Cloud Makes Sense#

Legitimate Reasons#

ReasonScenarioExample
Best-of-breed servicesA specific provider has a uniquely superior serviceBigQuery for analytics + AWS for everything else
M&A inheritanceAcquisition brings workloads on a different cloudCompany A (AWS) acquires Company B (Azure)
Regulatory requirementRegulator mandates no single-vendor dependencyFinancial services in some jurisdictions
Data sovereigntyProvider lacks a region in a required countryGCP has no region in a required market; Azure does
Negotiation leverageCredible multi-cloud capability improves pricing negotiationsDemonstrably portable workloads

Bad Reasons (But Commonly Cited)#

Claimed ReasonReality
“Avoid vendor lock-in”You trade one lock-in (cloud) for another (abstraction layer). The abstraction layer is your own code, which is harder to maintain than managed services.
“Redundancy across clouds”Cross-cloud failover is extraordinarily complex. Within-cloud multi-region is far simpler and better tested.
“We want flexibility”Flexibility without usage is waste. Design for portability only when you’ll actually port.
“Our team knows both”Your team will become mediocre at two clouds instead of excellent at one.

The Cost of Multi-Cloud#

Multi-cloud is not free. Quantify these costs before committing:

Multi-Cloud Overhead
│
├── Operational Complexity
│   ├── Two sets of IAM models
│   ├── Two networking architectures
│   ├── Two monitoring/alerting systems
│   ├── Two CI/CD pipelines
│   └── Two incident response playbooks
│
├── Engineering Cost
│   ├── Abstraction layers to maintain
│   ├── Lowest-common-denominator design (can't use best features)
│   ├── Doubled learning curve for every engineer
│   └── More complex testing matrices
│
├── Financial Cost
│   ├── Cross-cloud data transfer (egress fees)
│   ├── Lost volume discounts (spend split across providers)
│   ├── Duplicate tooling licences
│   └── Additional support contracts
│
└── Reliability Risk
    ├── More failure modes (cross-cloud connectivity)
    ├── Harder to debug distributed issues
    └── Blast radius now spans two clouds

Vendor Lock-In Analysis#

Lock-in is real, but it’s a spectrum, not a binary. Evaluate it per service, not per cloud.

Lock-In Risk by Service Category#

CategoryLock-In RiskPortabilityMigration Effort
Compute (VMs)LowDocker images run anywhereDays
Containers (K8s)LowK8s is portable; managed add-ons aren’tWeeks
Object storageLowS3 API is the de facto standardDays–weeks
Relational DB (PostgreSQL)LowStandard SQL, multiple managed optionsWeeks
Serverless functionsMediumCode is portable; triggers and IAM aren’tWeeks–months
Proprietary DB (DynamoDB, Cosmos)HighData model is provider-specificMonths
ML/AI servicesHighModels are portable; training pipelines aren’tMonths
Identity (IAM)Very HighEvery provider’s IAM model is uniqueMonths
Networking (VPC, TGW)Very HighArchitecture is provider-specificMonths
Workflow/orchestrationHighStep Functions, Workflows are not interchangeableMonths

Lock-In Decision Framework#

For each service:
│
├── Is there a portable standard? (SQL, K8s, S3 API, OCI)
│   ├── Yes → Use it. Portability is built in.
│   └── No
│       ├── Is there a credible open-source alternative?
│       │   ├── Yes → Evaluate: is the managed service worth the lock-in?
│       │   │         (Usually yes — operational savings outweigh switching cost)
│       │   └── No → Accept the lock-in, but isolate the dependency behind an interface
│       └── Is this a strategic or commodity service?
│           ├── Strategic → Accept lock-in for competitive advantage (e.g., Spanner for global consistency)
│           └── Commodity → Prefer the portable option

Abstraction Layers#

If you pursue multi-cloud, you need abstraction layers to shield application code from provider-specific APIs. But abstractions have costs.

Abstraction Approaches#

ApproachComplexityPortabilityPerformance
Cloud-agnostic IaC (Terraform, Pulumi)MediumInfrastructure onlyN/A
Kubernetes everywhereHighCompute + networkingNear-native
Application-level interfacesMediumPer-serviceSlight overhead
Service mesh (Istio, Consul)HighNetworking + observabilityOverhead
Portable ML frameworks (MLflow, Kubeflow)MediumML pipelinesSlight overhead

Cloud-Agnostic IaC#

Terraform is the most common tool for multi-cloud IaC. Each provider has its own Terraform provider, but the workflow (plan → apply → state) is consistent.

┌─────────────────────────────────────────┐
│              Terraform Code              │
│                                          │
│  module "aws_vpc" {                      │
│    source = "./modules/aws/networking"   │
│  }                                       │
│                                          │
│  module "azure_vnet" {                   │
│    source = "./modules/azure/networking" │
│  }                                       │
│                                          │
│  module "gcp_vpc" {                      │
│    source = "./modules/gcp/networking"   │
│  }                                       │
└─────────────────────────────────────────┘
        │           │           │
        ▼           ▼           ▼
   AWS API     Azure API    GCP API

Limitation: Terraform abstracts the workflow, not the resources. An aws_vpc and an azurerm_virtual_network are different resources with different arguments. You still need provider-specific knowledge.


Cross-Cloud Data Patterns#

Data synchronisation across clouds is one of the hardest multi-cloud problems.

Data Sync Patterns#

PatternLatencyConsistencyComplexity
ETL/batch syncHoursEventual (batch window)Low
CDC (Change Data Capture)Seconds–minutesEventual (stream lag)Medium
Dual-writeReal-timeRequires distributed TX or sagaVery high
Shared object storageMinutesEventualLow
API-based syncReal-timeRequest-levelMedium

Cross-Cloud Architecture#

┌────────────── AWS ──────────────┐    ┌────────── GCP ──────────────┐
│                                  │    │                              │
│  ┌──────────┐   ┌────────────┐  │    │  ┌────────────┐             │
│  │ App Tier  │──►│ PostgreSQL │  │    │  │ BigQuery   │             │
│  │ (ECS)    │   │ (RDS)      │  │    │  │ (Analytics)│             │
│  └──────────┘   └─────┬──────┘  │    │  └─────▲──────┘             │
│                        │         │    │        │                     │
│                        │ CDC     │    │        │ Load               │
│                        ▼         │    │        │                     │
│               ┌────────────────┐ │    │  ┌─────┴──────┐             │
│               │ Kafka / Debez- │─┼────┼─►│ Dataflow   │             │
│               │ ium (CDC)      │ │    │  │ (ingest)   │             │
│               └────────────────┘ │    │  └────────────┘             │
│                                  │    │                              │
└──────────────────────────────────┘    └──────────────────────────────┘
                   Cross-cloud data: CDC from AWS → GCP for analytics

Egress Cost Awareness#

TransferAWSGCPAzure
Same region, same AZFreeFreeFree
Same region, cross-AZ$0.01/GBFreeFree
Cross-region$0.02/GB$0.01–0.08/GB$0.02/GB
To internet (egress)$0.09/GB (first 10TB)$0.12/GB$0.087/GB
To another cloudSame as internet egressSameSame

Cross-cloud egress is billed as internet egress — the most expensive tier. Budget for it or minimise it.


Hybrid Architecture Patterns#

Hybrid means some workloads on-prem, some in the cloud. It’s the most common state during migration and sometimes the permanent state for regulated industries.

Hybrid Patterns#

PatternDescriptionUse Case
Cloud burstingBaseline on-prem, burst to cloud for peaksSeasonal retail, batch processing
Tiered hybridDev/test in cloud, prod on-prem (or reverse)Migration phases, cost optimisation
Edge + cloudEdge devices process locally, sync to cloudIoT, retail POS, factory floors
Data hybridRegulated data on-prem, analytics in cloudHealthcare, financial services
Disaster recoveryPrimary on-prem, DR in cloudCost-effective DR without second DC

Consistency Across Environments#

ChallengeSolution
Different IAM modelsFederate identity from a single IdP
Different networkingSite-to-site VPN or Direct Connect with consistent DNS
Different monitoringCentralised observability platform (Datadog, Grafana Cloud)
Different IaCTerraform for both (if cloud on-prem tools like vSphere have providers)
Different CI/CDSingle pipeline tool deploying to multiple targets

Service Mesh Across Clouds#

A service mesh provides consistent networking, security, and observability across services regardless of where they run.

Cross-Cloud Mesh Architecture#

┌──────────── AWS ────────────────┐    ┌──────────── GCP ──────────────┐
│                                  │    │                                │
│  ┌─────┐  ┌─────┐  ┌─────┐     │    │  ┌─────┐  ┌─────┐            │
│  │Svc A│  │Svc B│  │Svc C│     │    │  │Svc D│  │Svc E│            │
│  │+proxy│  │+proxy│  │+proxy│     │    │  │+proxy│  │+proxy│            │
│  └──┬──┘  └──┬──┘  └──┬──┘     │    │  └──┬──┘  └──┬──┘            │
│     │        │        │         │    │     │        │                │
│  ───┴────────┴────────┴───      │    │  ───┴────────┴───             │
│        Mesh Data Plane          │    │    Mesh Data Plane            │
│                                  │    │                                │
│     Control Plane (local)        │    │   Control Plane (local)       │
└────────────────┬─────────────────┘    └──────────┬─────────────────────┘
                  │         Federation             │
                  └──────────────┬─────────────────┘
                                 │
                          Global Control
                          (Consul, Istio multi-cluster)

When this is worth the complexity: You have services that must communicate across clouds with mTLS, traffic management, and unified observability. For most organisations, this is unnecessary — pick one cloud and use its native service mesh.


Key Takeaways#

  • Multi-cloud doubles operational complexity — pursue it only when there’s a specific, measurable benefit (best-of-breed, M&A, regulation)
  • “Avoiding vendor lock-in” is rarely a sufficient justification — the abstraction layer becomes its own maintenance burden
  • Evaluate lock-in risk per service, not per cloud; use portable standards (SQL, K8s, S3 API) where they exist
  • Cross-cloud data transfer is billed at internet egress rates — factor this into every multi-cloud cost model
  • Terraform provides workflow abstraction but not resource abstraction — you still need provider-specific expertise
  • Hybrid architecture is the pragmatic reality for most migrations; invest in consistent identity, networking, and observability across environments