For years, one of the most common questions in cloud architecture has been: Are we locked in?
It is a reasonable question. But I increasingly think it is often the wrong first question.
A system can be highly portable and still be fragile. It can use containers, Kubernetes, Terraform, open databases, and carefully isolated provider adapters, yet still fail badly when a region, identity service, DNS dependency, control plane, SaaS provider, or network path disappears.
At the same time, a system can make deliberate use of proprietary cloud services and still be remarkably resilient if its failure modes are understood and its critical paths are designed to survive them.
Portability is about how easily a workload can move. Resilience is about whether the outcome can continue.
Those are related properties, but they are not the same property.
The Cloud Has Matured. The Dependency Graph Has Not Become Simpler.
Cloud infrastructure is no longer an emerging choice for most large engineering organizations. The CNCF's 2025 annual survey reported that 98 percent of surveyed organizations had adopted cloud native techniques, while 82 percent of container users were running Kubernetes in production.
That maturity is good news. It also changes the architecture conversation.
Early cloud discussions were often about whether the cloud itself was reliable enough. Today the more interesting question is how much of a business has quietly converged on the same underlying dependencies.
Ten applications may look independent on an architecture diagram while sharing the same region, identity provider, secrets platform, CI service, DNS layer, observability backend, artifact repository, or managed database control plane.
We tend to draw application dependencies. We are less consistent about drawing concentration.
That distinction matters because an outage does not care how many boxes appear on the diagram. It follows the dependency graph.
Multi Cloud Is Not Automatically Resilience
When concentration risk becomes visible, the instinctive response is often multi cloud.
The argument sounds straightforward. If one provider can fail, run on two.
Sometimes that is exactly the right decision. But "multi cloud" can describe several very different architectures.
An organization may use one cloud for customer applications and another for analytics. That is multi cloud, but it does not make either workload resilient to its primary provider failing.
A team may maintain Terraform modules capable of deploying an application to two providers. That improves portability, but if the secondary environment has never handled production traffic, the organization has a migration option, not necessarily a recovery capability.
A company may even operate applications in two clouds while depending on a single external identity provider or a single SaaS control plane. The visible infrastructure is diversified while the critical path is not.
The label tells us very little.
The architecture question is more concrete: Which failure are we trying to survive, for how long, and what must remain available while it happens?
Resilience Starts With the Business Outcome
Architects naturally think in infrastructure units: regions, clusters, databases, queues, availability zones.
Business resilience is experienced differently.
A customer wants to make a payment. A warehouse needs to ship an order. A clinician needs to retrieve information. An employee needs to authenticate. A partner needs to submit a transaction.
The useful starting point is therefore not "How do we make every service multi region?" It is "What is the smallest useful business outcome that must continue?"
That question often produces a better architecture.
Perhaps checkout must continue but recommendation updates can stop. Perhaps existing users need access while new account creation can wait. Perhaps transactions can be accepted and queued even if downstream settlement is delayed. Perhaps read access is essential while writes can temporarily degrade.
Resilience does not always mean preserving the entire system at full capability.
Sometimes the most resilient design is one that knows how to become smaller.
Graceful Degradation Deserves More Attention
Architecture discussions about availability frequently jump from normal operation to failover.
There is an important space between those two states.
Can the system operate without personalization? Can it use a cached entitlement when the authorization dependency is unavailable? Can a request be accepted durably and completed later? Can a user see stale but safe data? Can a noncritical integration be bypassed?
These are product questions as much as technical ones.
That is why operational resilience cannot be delegated entirely to infrastructure teams. Product owners, architects, security teams, data owners, and engineering leaders need a shared understanding of what degraded operation is acceptable.
A failover design answers, "Where else can this run?"
A graceful degradation design answers, "What can still work?"
The second question is often cheaper, faster, and more valuable.
The Hidden Concentration Is Usually Above the Compute Layer
Containers have made application compute impressively portable.
But compute is only one layer of a production system.
Consider the services surrounding a typical application: identity, DNS, certificates, secrets, messaging, databases, object storage, API management, telemetry, feature flags, source control, build systems, artifact registries, security scanning, incident management, and third party APIs.
Moving a container is easy compared with reconstructing that operating environment during an incident.
This is why portability work can create false confidence. Teams prove that an application image starts on another cluster and conclude that the workload is portable. What they have actually proven is that the process can start.
The business capability may still depend on twenty things that did not move with it.
A better resilience review traces the critical transaction from edge to system of record and asks what happens when each shared dependency is unavailable.
Control Planes Are Dependencies Too
Managed services deliberately separate the control plane from the data plane. That separation is one of the reasons cloud platforms can provide sophisticated infrastructure without requiring every organization to operate it themselves.
But architects should be precise about what a control plane failure means.
A running workload may continue serving traffic while deployment, scaling, configuration changes, credential operations, or recovery actions become unavailable. In other cases, a control plane dependency may sit directly in the request path.
The important question is not whether the service has a control plane. Everything has a control mechanism somewhere.
The question is whether your recovery plan depends on the same component that has failed.
If the only way to recover from an outage requires a functioning control plane inside the affected failure domain, the recovery architecture contains a circular dependency.
Portability Still Matters, Just for Different Reasons
None of this is an argument against portability.
Portability can be strategically valuable for negotiating power, regulatory requirements, acquisitions, regional expansion, technology transitions, workload placement, and avoiding a dead end when a service no longer fits.
It can also support resilience when moving a workload is genuinely part of the recovery strategy.
The mistake is paying the portability tax everywhere without identifying the decision it is protecting.
Every abstraction has a cost. Avoiding a useful managed service because an equivalent API does not exist on another provider may mean building and operating more infrastructure yourself. The organization gains theoretical mobility while accepting additional operational complexity every day.
That trade can be worthwhile. It should not be automatic.
Optionality is valuable when we know which option we expect to exercise.
Resilience Has an Economic Boundary
It is technically possible to make almost anything more redundant.
We can add regions, providers, replicas, queues, caches, alternate network paths, standby environments, and independent control systems.
Eventually the cost and complexity of the protection exceed the value of the outcome being protected.
This is where architecture and business leadership have to meet.
Not every workload deserves active active operation across providers. Not every dependency needs an independent substitute. Not every internal application needs five nines of availability.
The goal is not maximum redundancy. It is deliberate resilience.
Criticality should determine investment. Recovery objectives should reflect business impact. The architecture should make the remaining risk visible enough that leaders can consciously accept it.
A resilient organization is not one with no single points of failure. At meaningful scale, that is an unrealistic standard.
It is an organization that knows where its important single points of failure are.
Test the Exit Before Calling It an Exit
There is another uncomfortable distinction between architecture diagrams and operational reality.
A documented failover path that has never been exercised is a hypothesis.
The same is true of cloud portability.
If a team says it can redeploy elsewhere, how long does that actually take? Where does the data come from? Are credentials available independently? Does DNS fail over? Are capacity quotas already established? Can the secondary environment absorb production load? Do operators know the procedure without inventing it during the incident?
Resilience becomes real through evidence.
That evidence does not always require dramatic game days that take down production. Teams can test restoration, exercise dependency failures, validate degraded modes, rehearse regional evacuation, and measure recovery time in controlled environments.
The point is simple: if recovery matters, recovery should be an executable capability rather than a diagram.
A More Useful Architecture Review
I would replace the generic question "Are we cloud agnostic?" with a smaller set of sharper questions.
- Which business capabilities are truly critical?
- What shared dependencies sit on their critical paths?
- Which failures can we tolerate through degradation rather than failover?
- Where are we concentrated by region, provider, SaaS vendor, identity system, network, or control plane?
- What recovery capability have we actually tested?
- Where does portability materially reduce a risk we care about?
- What complexity are we accepting in exchange for that portability?
Those questions turn resilience from a cloud ideology into an engineering decision.
The Goal Is Not Independence
Modern software is built from dependencies. That is not a design failure. It is how we avoid rebuilding databases, networks, identity systems, orchestration platforms, and global infrastructure from scratch.
The goal cannot be complete independence.
The goal is to understand dependence well enough to decide where it is acceptable.
Cloud architecture has spent years teaching teams to think about availability zones, regions, immutable infrastructure, and portable workloads. Those practices remain useful. But mature resilience requires one more step: tracing the business outcome through the entire dependency graph and deciding what should happen when parts of that graph disappear.
Sometimes the answer will be another region. Sometimes another provider. Sometimes a queue, a cache, a manual process, or a deliberately reduced product experience.
And sometimes the right answer will be to accept the risk because eliminating it costs more than the interruption is worth.
That is not weak architecture.
That is architecture making the trade off visible.
Portability gives us somewhere else to go. Resilience determines whether we can keep doing what matters.
Further Reading
Cloud Native Computing Foundation. 2025 Annual Cloud Native Survey, published January 20, 2026.
NIST. Secure Software Development Framework and DevSecOps Practices, 2025–2026.
Google Cloud. Cloud architecture and reliability guidance.