ESC
← Back to blog

Multi-Cloud Is a Lie You Tell Yourself

· X min read
Cloud Architecture Strategy
AI Summary

The pitch is seductive. Run your workloads on multiple cloud providers. Avoid vendor lock-in. Negotiate better pricing because you can credibly threaten to move. If one provider has an outage, fail over to another. Freedom. Flexibility. Leverage. It sounds great in a strategy deck. In practice, it's one of the most expensive mistakes an engineering organization can make.

I say this as someone who has helped organizations implement multi-cloud architectures and who has helped other organizations dismantle them. The pattern is remarkably consistent: the multi-cloud initiative starts with enthusiasm, consumes enormous engineering effort, and delivers far less value than promised -- often negative value when you account for the operational complexity it introduces.

The Vendor Lock-in Fear

Multi-cloud strategies almost always originate from fear of vendor lock-in. The concern is real but routinely overestimated. Yes, if you build everything on AWS Lambda, DynamoDB, and SQS, migrating to GCP would be a significant undertaking. But this fear misses several important realities.

First, the cost of lock-in is a one-time migration expense. The cost of avoiding lock-in is a perpetual tax on every piece of infrastructure you build, every engineer you hire, and every operational process you maintain. You're paying continuously to avoid a cost you might never incur. The math almost never works out.

Second, the lock-in you should actually worry about isn't cloud provider lock-in. It's architectural lock-in. A poorly designed monolith running on bare EC2 instances is trivial to move between cloud providers -- it's just VMs. But the monolith itself is the lock-in. You're locked into a codebase, a deployment model, and an organizational structure that constrains your ability to evolve. Cloud provider migration is a tractable engineering problem. Architectural migration is an organizational transformation. Focus your fear on the right thing.

Third, cloud providers know that lock-in fear drives multi-cloud adoption, which reduces their revenue. They've responded by making migration easier, not harder. AWS, GCP, and Azure all offer migration tools, compatible APIs, and interoperability features. The walls aren't as high as the multi-cloud vendors want you to believe.

The Lowest Common Denominator Problem

To run the same workload on multiple cloud providers, you need abstractions that work across all of them. This means you can only use features that exist in every provider. You've just voluntarily reduced your toolbox to the intersection of all providers' capabilities.

AWS has DynamoDB -- a fully managed, globally distributed NoSQL database with single-digit millisecond performance. GCP has Spanner -- a globally consistent relational database with horizontal scaling. Azure has Cosmos DB -- a multi-model database with tunable consistency. Each is genuinely innovative. Each takes advantage of its provider's unique infrastructure. In a multi-cloud architecture, you can use none of them. You'll run PostgreSQL on VMs across all three providers because that's the common denominator.

This isn't just a database problem. It extends to everything. Networking: each provider's VPC model has different semantics, different defaults, different performance characteristics. Identity and access management: AWS IAM, GCP IAM, and Azure AD are fundamentally different systems with different mental models. Managed Kubernetes: EKS, GKE, and AKS all run Kubernetes, but the integration points with the underlying cloud -- load balancers, storage classes, IAM, networking -- are provider-specific.

The result is that multi-cloud teams gravitate toward the most portable, least differentiated services on each platform. They run VMs instead of serverless functions. They deploy open-source databases instead of managed ones. They build their own service mesh instead of using the provider's. They're paying cloud prices for an experience that's barely better than running their own data center. The entire value proposition of cloud computing -- managed services, elastic scaling, operational automation -- gets sacrificed on the altar of portability.

Operational Complexity Multiplication

Running infrastructure on one cloud provider is hard. Running it on two providers isn't twice as hard. It's four times as hard. Running on three is nine times as hard. Complexity doesn't add -- it multiplies.

Every operational concern now has multiple implementations. Monitoring: you need CloudWatch and Stackdriver and Azure Monitor, or you need a third-party tool that integrates with all of them. Networking: you need to understand VPC peering in AWS, VPC networking in GCP, and VNet in Azure -- plus the cross-cloud connectivity between them. Security: you need IAM policies, service accounts, and RBAC configurations in each provider, and you need to reason about the interactions between them.

Incident response becomes dramatically harder. When an application spans two cloud providers and something breaks, the debugging surface area doubles. Is the problem in your AWS infrastructure, your GCP infrastructure, or in the cross-cloud networking between them? Your on-call engineers need expertise in both providers. Your runbooks need to cover failure modes in both environments. Your monitoring needs to correlate signals across both platforms.

Terraform and Pulumi can abstract some of this behind a common configuration language, but they can't abstract away the operational differences. Terraform can provision an AWS ALB and a GCP load balancer using similar HCL syntax, but the behavior, performance characteristics, and failure modes of those load balancers are fundamentally different. The abstraction hides the syntax. It can't hide the semantics.

The Skills Gap

Finding engineers who are deeply proficient in one cloud provider is hard enough. Finding engineers who are deeply proficient in two or three is exponentially harder. And "deeply proficient" matters -- the difference between a team that understands a cloud provider's primitives and a team that just knows how to click through the console is the difference between reliable infrastructure and infrastructure that works until it doesn't.

Multi-cloud organizations typically solve this one of two ways, both unsatisfying. Option one: hire specialists for each provider and divide the team. This creates silos, makes cross-cloud debugging harder, and means knowledge about the overall architecture is fragmented. Option two: expect every engineer to know every provider. This produces engineers who are mediocre at everything rather than excellent at one thing. They know enough about each provider to get things working, but not enough to get things working well.

The knowledge gap extends beyond engineering. Security teams need to understand the threat models of multiple providers. Finance teams need to optimize spending across multiple billing systems. Compliance teams need to audit configurations across multiple platforms. Every support function in the organization pays the multi-cloud tax.

When Multi-Cloud Actually Makes Sense

I'm not arguing that multi-cloud is never the right answer. There are legitimate scenarios where it's justified. But they're narrower than most organizations assume.

Regulatory compliance: Some industries and geographies require data residency in regions where your primary provider doesn't have presence. If your primary provider is AWS but you need to serve customers in a region where AWS doesn't have a data center and GCP does, running a subset of your workload on GCP is a legitimate business requirement. This is multi-cloud driven by external constraints, not by architectural philosophy.

Mergers and acquisitions: When Company A (running on AWS) acquires Company B (running on GCP), you have a multi-cloud environment whether you wanted one or not. The question is whether to consolidate or maintain both. Consolidation has migration costs. Maintaining both has ongoing operational costs. Either answer might be correct depending on the specifics, but it's a pragmatic decision, not an architectural one.

Best-of-breed for specific workloads: GCP's BigQuery is genuinely better for certain analytics workloads than anything on AWS. AWS's IoT services are more mature than GCP's. If you have specific workloads where one provider has a dominant advantage, it can make sense to run those specific workloads on that provider -- not because you're pursuing a multi-cloud strategy, but because you're making a pragmatic service selection. This is using multiple clouds, not doing "multi-cloud."

Negotiating leverage: There's a legitimate argument that having some presence on a second provider gives you negotiating power with your primary provider. But this doesn't require running production workloads on both. A proof-of-concept or a disaster recovery environment on the second provider demonstrates capability without imposing the full operational burden.

Cloud-Agnostic vs. Cloud-Native

The core tension in multi-cloud is between portability and capability. Cloud-agnostic architectures optimize for portability. Cloud-native architectures optimize for capability. You can't have both.

Cloud-agnostic means using only features that exist across providers. It means VMs instead of serverless, self-managed databases instead of managed ones, custom solutions instead of provider-specific services. You can move between providers, but you've given up the features that make each provider valuable.

Cloud-native means embracing the managed services, the provider-specific integrations, and the unique capabilities of your chosen platform. You get operational efficiency, faster development, and better performance. You also get deeper coupling to the provider. Moving to a different provider would require significant rearchitecture.

The cloud-agnostic approach treats migration as a design constraint. Every architectural decision is filtered through "could we do this on another provider?" This constraint eliminates options, slows decisions, and often leads to worse outcomes. The cloud-native approach accepts that migration, if it ever happens, will require engineering effort -- and invests the effort it would have spent on portability into building better systems instead.

Most organizations would be better served by going cloud-native on one provider and designing for portability at the application layer rather than the infrastructure layer. Containerize your applications. Use well-defined APIs. Keep your business logic decoupled from cloud-specific SDKs. Store data in formats that are provider-independent even if the storage service isn't. This gives you practical portability -- the ability to move with effort -- without the operational burden of running everywhere simultaneously.

The Real Cost of Portability

Every decision to use a portable solution instead of a managed service has a cost. Using self-managed Kafka instead of AWS Kinesis means hiring Kafka experts, managing broker clusters, handling upgrades, and tuning performance. Using self-managed PostgreSQL instead of Aurora means managing replication, backups, failover, and patching. Using a custom deployment system instead of AWS CodeDeploy means building and maintaining that system yourself.

These costs are real, ongoing, and often underestimated. A managed service isn't just about the technology. It's about the operational burden you don't carry. It's about the 3 AM page you don't get because the provider handles failover. It's about the security patches you don't apply because the provider handles them. It's about the capacity planning you don't do because the service scales automatically.

When you choose portability over managed services, you're choosing to carry all of that burden yourself. You're hiring engineers to solve problems that a managed service would solve for you. You're spending engineering time on operational work instead of product work. You're accepting lower reliability because your self-managed solution will never be as battle-tested as a service running across millions of customers.

Is that tradeoff sometimes worth it? Yes. But it's worth it far less often than multi-cloud advocates claim.

What to Do Instead

Pick a primary cloud provider. Go deep on it. Use its managed services. Leverage its unique capabilities. Build expertise on your team. Negotiate pricing based on commitment, not on threats to leave.

Design your applications for portability, not your infrastructure. Containerize. Use standard protocols. Keep cloud-specific code behind clean interfaces. If you ever need to migrate -- and you probably won't -- the application layer is where the real effort lies anyway. Portable applications on provider-specific infrastructure is the sweet spot that gives you practical flexibility without operational overhead.

If you have a genuine need for a second provider -- compliance, a best-of-breed service, an acquisition -- treat it as an exception, not a strategy. Run the minimum viable footprint on the second provider. Don't try to build a symmetric architecture across both. Accept that the second provider is a tactical choice, not an architectural principle.

Multi-cloud isn't a strategy. It's a cost. Sometimes that cost is worth paying. Usually it isn't. The organizations running the most reliable, most cost-effective cloud infrastructure aren't the ones spread across every provider. They're the ones that picked one, went deep, and used the engineering hours they saved to build better systems.

The allure of multi-cloud is the allure of keeping your options open. But optionality isn't free. Every option you keep open is a commitment you didn't make, an optimization you didn't pursue, a managed service you didn't adopt. At some point, the cost of keeping your options open exceeds the value of any option you might exercise. For most organizations, that point arrives long before they've finished building their multi-cloud abstraction layer.

Pick a cloud. Commit to it. Build great systems on it. If you need to move later, you'll cross that bridge when you come to it -- and you'll have the engineering capacity to do it because you didn't spend it all maintaining infrastructure across three providers simultaneously.

Comments