
A practical mental model for choosing cloud primitives without ideology—based on responsibility boundaries, scaling, reliability, cost, and team operating capacity.
Axel Domingues
There’s a phase every team hits where “cloud choice” becomes a personality trait.
None of these are wrong.
What’s wrong is treating them as identity.
Because cloud infrastructure isn’t ideology — it’s a responsibility trade:
What parts of the system do you want to own at 3 a.m.?
This post is a practical mental model for choosing between:
Not by vibes — by constraints.
What you’re really choosing
A responsibility boundary — what you own vs what the provider owns.
The “adult” question
When incidents happen, do you have the operational capacity to handle what you chose?
Every cloud option is a different answer to the same question:
How much platform work do you want to build and maintain?
The common trap is evaluating options as features. The correct evaluation is as ongoing obligations:
The more you don’t want to do those things, the more you want managed services.
The more you must control those things, the more you accept ownership.
That’s it. Everything else is commentary.
Let’s stop using buzzwords and instead describe the contracts.
IaaS
You rent machines (virtual or bare metal) and build everything else.
PaaS
You deploy an app; the platform handles runtime, scaling, patching, routing.
Serverless
You run functions + managed workflows; you trade control for elasticity.
Kubernetes
You build your own platform on top of containers (and then operate it).
A more honest way to compare:
You own:
You get:
You own:
The provider owns:
You get:
You own:
The provider owns:
You get:
You own:
You get:
Instead of arguing about tools, map where the work goes.

A quick heuristic:
Most “cloud comparisons” skip the only questions that consistently decide outcomes.
Ask:
If the answer is “no”, you need more managed services, not fewer.
This isn’t a scorecard — it’s a prompt to think clearly.
Choose PaaS when:
Choose serverless when:
Choose Kubernetes when:
Choose IaaS when:
The healthiest architectures I’ve seen are not “one choice.” They’re a layered blend:
The pragmatic goal
Use the most managed option that still meets your constraints.
Only “graduate” to more control when you can prove the constraints.
This gives you a simple operational center with elastic edges.
If you do Kubernetes, treat it like internal infrastructure with:
If your Kubernetes experience is “every team invents its own ingress and its own Helm chart,” you’re not gaining control — you’re multiplying chaos.
Serverless becomes a mess when:
The fix is to introduce explicit orchestration:
If you must run weird workloads on VMs:
There are two cost models:
Teams obsess over #1 and quietly drown in #2.
Here’s the reality:
You don’t get reliability “for free” anywhere — you just shift where failure happens.
IaaS failures look like
OS patching gaps, snowflake config drift, manual deployments, fragile failover.
PaaS failures look like
Platform limits, noisy neighbors, deployment misconfig, opaque platform incidents.
Serverless failures look like
Retry storms, idempotency bugs, cold starts, event version mismatches.
Kubernetes failures look like
Cluster upgrades, networking/ingress policy mistakes, runaway resource usage, platform drift.
The key is to build guardrails where your chosen model tends to fail.
No matter what you pick, you need:
Start managed and only add control when you can justify it.
The worst path is a big-bang platform migration. The best path is incremental, measured, and reversible.
This is the most common successful path for product companies.
This is common in enterprises migrating legacy systems.
This works well for event-heavy integration products — but you must invest early in correctness (idempotency, contracts).
Kubernetes is not “standard” the way HTTP is standard.
Kubernetes is a platform that requires:
If you don’t have platform capacity, you’re choosing a tax.
Serverless is great for:
It’s usually not great for:
VMs feel simple because you can “just log in and fix it.” That’s not simplicity — that’s manual operations debt.
If you need SSH to keep production stable, the system is telling you something.
Multi-cloud can reduce vendor risk — but it increases complexity.
If you don’t have:
You’re not reducing risk. You’re multiplying failure modes.
If you want this to become architecture (not opinion), write it down.
Use this as your decision record:
Architecture is the ability to explain your decisions
If you can’t explain it in a page, you probably chose it as identity.
AWS Well-Architected Framework
A practical set of questions and tradeoffs across reliability, security, cost, operations, and performance.
Google SRE Book
The canonical “operate like an adult” reference: SLOs, error budgets, incident response, and capacity thinking.
Not always — but it’s often a tax.
If you have a clear platform need (multi-service scale, policy enforcement, deep networking controls) and platform capacity (people + process), it can be the right move.
If you’re doing it because it feels modern, you’re likely buying complexity you don’t need.
Lock-in is not binary; it’s a gradient.
Serverless often couples you to event models, managed workflows, and provider-specific semantics. Kubernetes can reduce some lock-in but tends to lock you into the Kubernetes ecosystem and its operational model.
The right question is:
A hybrid:
It’s the fastest path to “reliable enough” without building a platform team prematurely.
Only if you have a strong reason and strong operational maturity.
Managed databases exist because state is hard. If you choose to operate stateful systems yourself, you’re choosing on-call complexity, upgrades, backups, and recovery engineering.
For most teams: managed DBs are the best bargain in cloud.
This month was about choosing infrastructure without ideology — by understanding responsibility boundaries and operational capacity.
Next month the series shifts from “where do we run it?” to “what data are we producing?”
Data Engineering for Product Teams: OLTP vs OLAP, Streaming, and Truth
Because if you mix operational truth with analytics convenience, you will eventually ship lies — and then make decisions based on them.
Data Engineering for Product Teams: OLTP vs OLAP, Streaming, and Truth
Most “data problems” are actually truth problems. This month is a practical mental model for product teams: where truth lives, how it moves, when to stream, when to batch, and how to keep analytics useful without corrupting production.
Performance Engineering End-to-End: From TTFB to Tail Latency
Performance isn’t a tuning phase — it’s an architecture property. This month I lay out an end-to-end mental model (browser → edge → app → data) and the practical playbook for improving both “fast on average” and “fast under load” without shipping fragile optimizations.