DEV Community

Cover image for The Cloud Is Cheap to Provision and Expensive to Understand
Sonia Bobrik
Sonia Bobrik

Posted on

The Cloud Is Cheap to Provision and Expensive to Understand

A cloud resource can be created in seconds, but the organizational obligation attached to it may survive for years. That asymmetry explains why the broader argument that complexity is eating the corporate balance sheet should also be read as a warning to cloud architects: infrastructure complexity does not remain inside an AWS account or a Kubernetes cluster. It migrates into engineering payroll, incident duration, security reviews, delivery delays, audit costs, and strategic decisions that become harder to reverse.

The cloud did not create this problem. It changed its speed.

Before cloud computing, infrastructure usually entered a company through a visible purchasing process. Servers had to be ordered, budgets approved, racks allocated, and deployment capacity planned. That process was slow, but it created friction before complexity entered the system.

Public cloud reversed the sequence. Creation became immediate, while evaluation was postponed.

A developer can now add a database, queue, function, storage bucket, cache, load balancer, secret store, or managed AI service before the organization has answered a more important question: Who will carry this decision after the original project is finished?

That is the real source of cloud sprawl. Companies do not merely accumulate resources. They accumulate permanent responsibilities faster than they can assign, understand, and remove them.

Every Cloud Component Creates Four Liabilities

The price displayed by a cloud provider is only the first cost of a component.

Every additional service creates at least four liabilities.

The first is the runtime liability: the direct amount charged for compute, storage, traffic, backups, observability, support, and idle capacity.

The second is the cognitive liability: the knowledge engineers must retain to configure, debug, secure, upgrade, and recover the service.

The third is the coordination liability: the meetings, ownership boundaries, approvals, documentation, handoffs, and escalation paths required to operate it across teams.

The fourth is the exit liability: the eventual cost of migrating away, consolidating the workload, changing providers, or deleting the service safely.

Cloud cost-management programs usually concentrate on the runtime liability because it appears on an invoice. The other three liabilities are distributed across the company and therefore remain largely invisible.

Consider a small event-processing feature that begins with one queue and two serverless functions. Six months later, it may depend on a dead-letter queue, schema registry, deployment pipeline, secret-management policy, private network endpoint, alerting rules, tracing configuration, replay mechanism, data-retention process, and several dashboards.

The original service might cost only a few hundred dollars per month. Yet changing it safely may require knowledge from platform engineering, security, networking, data engineering, and the product team.

The infrastructure is inexpensive. Understanding its consequences is not.

Complexity Becomes Dangerous When It Outlives Its Context

Most questionable cloud decisions were not obviously wrong when they were made.

A second Kubernetes cluster may have been created to meet an urgent isolation requirement. A new database engine may have supported an experiment with a tight deadline. A dedicated cloud account may have been opened for a customer who required separate billing. A temporary data pipeline may have been introduced during a migration.

The problem begins when the original context disappears but the architecture remains.

The engineer who understood the exception leaves. The customer changes plans. The migration ends. The experiment becomes a small production feature. Nobody revisits the infrastructure because it still works, and deleting working infrastructure appears riskier than continuing to pay for it.

This produces a specific kind of architectural debt: context decay.

The configuration survives, but the reasoning behind it does not.

Traditional documentation rarely solves this problem. A diagram can show that a service connects to three databases, but it may not explain why three databases were necessary, which constraint justified each one, or what would have to become true before they could be consolidated.

Useful architecture documentation must therefore preserve decisions, not merely topology.

For every significant exception, the organization should know what requirement created it, which alternative was rejected, who owns the resulting burden, and when the decision should be challenged again.

Without that information, infrastructure gradually becomes a collection of irreversible assumptions.

Stop Asking Whether a Resource Is Used

Many cloud-cleanup efforts start with a simple question: is this resource being used?

That question catches abandoned volumes, old snapshots, forgotten test environments, and idle virtual machines. It is useful, but it addresses only the easiest form of waste.

A resource can be actively used and still be economically irrational.

A production database may serve real traffic while supporting a feature that produces almost no customer value. A streaming platform may process millions of events that could have been handled by a scheduled batch job. A multi-region deployment may be functioning perfectly even though the product has no recovery requirement that justifies it. A Kubernetes cluster may be heavily utilized while hosting workloads that would be cheaper and easier to run on a managed application platform.

The better question is:

What business requirement would fail if this component disappeared?

If nobody can answer precisely, the company does not have an infrastructure asset. It has an inherited obligation.

This distinction matters because resource optimization can accidentally preserve bad architecture. Teams resize instances, negotiate discounts, buy commitments, and reduce storage prices without questioning why the underlying system exists in its current form.

They make the wrong design cheaper instead of making the system simpler.

Build a Cloud Complexity Ledger

Organizations already maintain financial ledgers, service catalogs, asset inventories, and security registers. They should also maintain a record of where operational complexity is being created.

A cloud complexity ledger does not need to become another large governance database. It can be a small set of fields stored beside the infrastructure code or service definition.

For each production capability, record the business outcome, accountable team, primary dependencies, recovery requirement, monthly cost, deployment mechanism, exceptional controls, and conditions for retirement.

The critical field is not the resource owner. It is the complexity owner.

A resource owner may be responsible for keeping a database online. A complexity owner is responsible for deciding whether the organization should continue operating that database at all.

This prevents a common failure mode in which every component has a technical owner but nobody owns the architecture created by the collection of components.

The ledger also creates a basis for comparison. Two services may generate similar revenue, but one may require five times as many operational dependencies. Two teams may have similar headcounts, but one may spend most of its time maintaining infrastructure exceptions.

Those differences should influence investment decisions.

Complexity should not be measured by counting cloud services alone. A company using thirty well-standardized managed services may be easier to operate than one using ten heavily customized systems.

The relevant measure is the amount of human interpretation required to make a safe change.

Put a Complexity Budget Into Architecture Reviews

Performance, availability, security, and direct cost already influence architecture decisions. Complexity should become an explicit design constraint alongside them.

A complexity budget defines how much permanent operational burden a workload is allowed to introduce relative to its importance.

A regulated payment system may justify multiple regions, strict isolation, dedicated encryption infrastructure, and sophisticated recovery procedures. An internal reporting tool probably does not.

The objective is not to ban advanced architecture. It is to prevent teams from applying high-criticality designs to low-criticality problems.

Before approving a new infrastructure component, ask what capability it adds that the current platform cannot provide, what permanent operational work it creates, which existing component it may eventually replace, and how the team will know whether the decision was successful.

The last question is often missing.

Infrastructure proposals usually describe how a component will be introduced. They rarely define the evidence that would justify keeping it.

A new streaming platform might be approved because the current batch process is too slow. The architecture decision should then specify the required latency improvement, expected traffic, operating cost, and review date. If the workload never reaches the predicted scale, the decision should be reopened.

This turns architecture from a sequence of permanent additions into a portfolio of testable assumptions.

Standardize the Interface, Not Every Implementation

A common response to cloud complexity is aggressive standardization. One database. One deployment model. One cluster design. One approved language. One monitoring system.

This can reduce variation, but it can also produce a rigid central platform that blocks legitimate needs.

The more effective approach is to standardize the interface between teams and infrastructure.

Developers should encounter a consistent way to request a production service, declare ownership, define reliability requirements, expose metrics, manage secrets, estimate cost, and retire a workload. The implementation underneath that interface can vary when the variation is justified.

This is where internal platforms become valuable. However, a platform should not be judged by the existence of a developer portal or a catalog of templates.

Its value comes from the decisions it removes.

A strong internal platform eliminates the need for every application team to independently design identity, networking, deployment, observability, backup, and cost-allocation patterns. A weak platform simply places another interface in front of the same underlying complexity.

Google’s 2025 DORA research on software delivery and internal platforms reinforces an important point: tools amplify the quality of the system around them. Faster code production does not fix unclear workflows, fragmented platforms, or tightly coupled architecture. It pushes more change into those weaknesses.

This becomes especially important as AI-assisted development increases the volume of code and infrastructure changes. Generating another Terraform module is easy. Proving that the organization needs another infrastructure pattern is still difficult.

Make the Safe Option the Fastest Option

Governance fails when the approved path is slower than the workaround.

If creating a compliant production service requires several tickets, manual security approval, a networking request, and days of waiting, developers will search for another route. The resulting shadow infrastructure is not necessarily evidence of irresponsible engineering. It may be evidence that the official platform is badly designed.

Controls should therefore be embedded at the moment of creation.

A production-ready service template can automatically include ownership metadata, log retention, encryption, deployment checks, baseline alerts, backup policies, cost labels, and an expiration rule for non-production resources.

The goal is not to make developers complete a longer form. The goal is to encode decisions that should not have to be made repeatedly.

AWS publishes extensive guidance on reusable cloud architecture patterns, but patterns create value only when they reduce the number of decisions teams must revisit. Copying an architecture pattern without defining when it should be used merely standardizes complexity.

The best default path should cover ordinary workloads extremely well. Unusual workloads should remain possible, but the team choosing an exception must also accept responsibility for operating it.

Freedom without ownership produces sprawl.

Consolidate Control Planes Before Consolidating Clouds

Multi-cloud is frequently blamed for infrastructure complexity. Sometimes correctly. Operating equivalent networking, security, deployment, and observability systems across several providers can create enormous overhead.

But migrating everything to one provider does not automatically produce simplicity.

A company can have one cloud provider and still operate dozens of account structures, deployment frameworks, policy engines, observability stacks, Kubernetes distributions, infrastructure repositories, and identity models.

The more useful goal is control-plane consolidation.

Teams should have one authoritative service catalog, one ownership model, one primary policy system, one incident-routing mechanism, one cost-allocation standard, and one supported method for deploying each major workload category.

The underlying infrastructure may still span providers or regions, but engineers should not have to reconstruct the organization every time they cross a boundary.

This is also why “single pane of glass” projects often disappoint. They aggregate dashboards without reducing the number of systems that must be understood.

Visibility is not simplification.

A map of a maze is useful. Removing unnecessary walls is better.

Measure the Cost of Change, Not Just the Cost of Compute

The most revealing cloud metrics are often absent from cloud dashboards.

CPU utilization, storage growth, network traffic, and monthly spend describe infrastructure consumption. They do not describe whether the organization can operate that infrastructure efficiently.

A practical complexity-reduction program should track signals closer to engineering work:

  • Time required for a developer unfamiliar with a service to identify its owner, dependencies, deployment history, dashboards, and recovery procedure.
  • Number of separate systems that must be consulted to diagnose a production failure.
  • Percentage of infrastructure exceptions with an owner and review date.
  • Time between approving a new service and making it production-ready.
  • Share of engineering capacity spent on maintenance, migrations, upgrades, and infrastructure coordination.
  • Number of workloads that cannot be connected to a customer, product, compliance requirement, or measurable business capability.
  • Infrastructure removed or consolidated during the same period in which new infrastructure is created.

The first metric is particularly valuable. Call it mean time to comprehension.

Give an experienced engineer who does not own the service a realistic scenario: a latency increase, failed deployment, expired credential, unexpected cost spike, or regional outage. Measure how long it takes them to identify what is happening and who can safely act.

This reveals problems that architecture reviews and cloud invoices miss.

A system can be highly available and still be dangerously difficult to understand.

Delete Infrastructure as a Normal Engineering Activity

Creation is celebrated. Deletion is treated as cleanup.

That incentive structure guarantees accumulation.

Removing an unnecessary queue, database, service, pipeline, cluster, account, or deployment path should be treated as meaningful engineering output. Deletion reduces future incident surfaces, security exposure, upgrade work, documentation requirements, and decision overhead.

It also restores strategic freedom.

Every unnecessary dependency limits what the organization can change next. A company may want to move a workload, replace a vendor, enter a regulated market, or redesign a product, only to discover that years of infrastructure coupling make the decision prohibitively expensive.

This is the exit liability becoming visible.

Regular deletion reviews should therefore examine more than idle resources. Teams should identify duplicate capabilities, low-value workloads, temporary systems without end dates, custom components now available as managed services, and architectures whose original assumptions are no longer true.

The most valuable question is not “Can we turn this off today?”

It is “What would have to change before we could turn it off?”

That question converts vague technical debt into a concrete sequence of work.

The Practical Reset

A company does not need a multi-year cloud transformation to regain control. It needs a repeatable method for challenging permanent obligations.

Select one important customer journey and trace every infrastructure dependency required to complete it. Identify where ownership becomes unclear, where several tools provide the same capability, where exceptions have lost their original context, and where cost cannot be connected to the outcome.

Then remove or standardize one layer.

Do not begin by building an enterprise-wide portal. Do not start by moving everything to another cloud. Do not purchase another optimization dashboard before understanding which decisions it is expected to improve.

Begin where complexity is already slowing change.

The objective is not minimal infrastructure. Minimalism can become its own form of dogma. The objective is infrastructure whose sophistication is proportional to the problem being solved.

A complex global payments platform may be rational. A complex internal scheduling tool is not.

Cloud architecture becomes economically dangerous when the company pays for complexity continuously but can no longer explain the return it receives.

The strongest engineering organizations do not simply provision resources efficiently. They control the rate at which permanent obligations enter the system, preserve the reasoning behind important exceptions, and remove infrastructure that no longer earns its operating burden.

The cloud made creation almost free.

The next competitive advantage will come from making understanding, change, and deletion cheap as well.

Top comments (0)