system-design

Cloud Provider Primitives (AWS / GCP / Azure Rosetta Stone)

Every cloud offers the same dozen building blocks under different names. Learn the categories once, and the specific products become a lookup table.

Prerequisites: Building Blocks (Part 2), Containers Time to read: ~16 minutes


The idea

🚨 You don’t need to memorize hundreds of cloud products. Every cloud provides the same fundamental categories — compute, storage, networking, databases, messaging — and the trick is knowing the category and what it does. The specific product name (EC2 vs Compute Engine vs Virtual Machines) is trivia you can look up; understanding what a load balancer or an object store is is the real knowledge, and you already have it from Part 2.

🎙️ In an interview, use generic terms (“a load balancer,” “object storage,” “a managed message queue”) unless the interviewer is cloud-specific. Naming AWS products isn’t the skill; knowing what component you need is. This chapter is a translation table so you’re not lost when someone says “S3” or “Pub/Sub.”


The Rosetta Stone

Category What it is AWS GCP Azure
Virtual machines Compute EC2 Compute Engine Virtual Machines
Serverless functions FaaS Lambda Cloud Functions Functions
Serverless containers Run a container, managed Fargate / App Runner Cloud Run Container Apps
Kubernetes Orchestration EKS GKE AKS
Object storage Blobs S3 Cloud Storage Blob Storage
Block storage Disk volumes EBS Persistent Disk Managed Disks
File storage Network filesystem EFS Filestore Azure Files
Relational DB Managed SQL RDS / Aurora Cloud SQL / AlloyDB Azure SQL / DB
NoSQL key-value Managed NoSQL DynamoDB Firestore / Bigtable Cosmos DB
In-memory cache Redis/Memcached ElastiCache Memorystore Cache for Redis
Message queue Queue SQS Cloud Tasks / Pub/Sub Queue Storage / Service Bus
Pub/sub / streaming Events SNS / Kinesis / MSK Pub/Sub / Dataflow Event Hubs / Event Grid
Load balancer LB ELB (ALB/NLB) Cloud Load Balancing Load Balancer / App Gateway
CDN CDN CloudFront Cloud CDN Azure CDN / Front Door
DNS DNS Route 53 Cloud DNS Azure DNS
API gateway Gateway API Gateway API Gateway / Apigee API Management
Secrets Secrets Secrets Manager Secret Manager Key Vault
Key management KMS KMS Cloud KMS Key Vault
Identity/access IAM IAM Cloud IAM Entra ID / RBAC
Data warehouse Analytics Redshift BigQuery Synapse
Monitoring Observability CloudWatch Cloud Monitoring Monitor
Object → event Trigger on storage change S3 events Eventarc Event Grid

🚨 The pattern: every cloud has one of each. When you design “load balancer → app servers → cache → database → object storage,” you’re picking one product from each row. The architecture is cloud-agnostic; only the names change.


The regions/AZ hierarchy

🚨 A universal concept that shapes availability and latency, and it comes up:

Region (geographic area: us-east-1, europe-west1)
  └─ Availability Zone (AZ) — an isolated datacenter with independent power/network
       └─ Your resources

The default posture: multi-AZ (cheap resilience), single-region until you need multi-region (geography or region-failure protection). Data residency (compliance) can force multi-region.


Managed vs self-hosted

🚨 The recurring cloud decision, and a strong interview point: almost every primitive comes as a managed service (the cloud runs it) or you self-host it (run it yourself on VMs/containers).

Managed (RDS, ElastiCache, MSK): the cloud handles patching, backups, failover, scaling, and availability. ✅ Vastly less operational burden — no on-call for the database, automated backups and failover. ❌ Costs more (2-3× the raw compute), less control (versions, config, extensions), some lock-in.

Self-hosted (Postgres on EC2): you run everything. ✅ Full control, cheaper in dollars. ❌ Expensive in engineer-hours — you’re on call for it, you build backups and failover and test them.

🎙️ The default answer for most teams is managed: “I’d use the managed database — automated backups, multi-AZ failover, and patching are things I’d otherwise have to build *and test. Self-hosting makes sense at a scale where the cost difference funds a dedicated team.”* Choosing managed is not a cop-out; it’s the sensible default, and saying so signals maturity. → Choosing a Database


Cloud-specific things worth knowing


Multi-cloud and lock-in

⚖️ A trade-off that comes up:

Lock-in — using a cloud’s proprietary services (DynamoDB, BigQuery) ties you to that cloud. The managed convenience comes with dependency.

Multi-cloud (running on several clouds) reduces lock-in and single-provider risk, but 🚨 is genuinely expensive and complex — you can’t use the best proprietary services, everything must work on the lowest common denominator, and you double the operational surface.

🎙️ The pragmatic position: “I’d optimize for one cloud and its managed services rather than multi-cloud — the proprietary services are a big productivity win, and true multi-cloud portability costs more than the lock-in risk usually justifies. If portability matters, I’d use portable abstractions (Kubernetes, Terraform, open formats) rather than actually running on multiple clouds.” Most “multi-cloud” is aspiration; committing to one cloud well is usually the better call.


⚖️ Trade-offs

Choice Gain Cost
Managed services Minimal ops burden; reliability built in 2-3× cost; less control; lock-in
Self-hosted Control; cheaper dollars Expensive engineer-hours; you build/test everything
Multi-AZ Cheap resilience to datacenter failure Slight cross-AZ latency/cost
Multi-region Region-failure protection, geo-latency Expensive, complex
Single cloud Best proprietary services, simpler Lock-in
Multi-cloud No lock-in, no single-provider risk Complexity, LCD services, doubled ops

In the real world


🚨 Interview traps


🎙️ Soundbites


🛠️ Try it

1. Map a design to three clouds. Take any architecture from Part 12 and pick the specific products from each of AWS, GCP, and Azure. Notice the architecture doesn’t change — only the names. That’s the whole point: the design is cloud-agnostic.

2. Deploy across AZs. Deploy a service across two availability zones (managed load balancer distributing across them). Then simulate an AZ failure (or read how the cloud handles it) and confirm the service survives. That’s the cheap resilience of multi-AZ.

3. Managed vs self-hosted, priced. For a real workload, price a managed database (RDS) against self-hosting Postgres on EC2 — including a fraction of an engineer’s salary for operations. Find where the crossover is. It’s usually much later than the raw compute difference suggests.

4. Find the egress cost. For a data-heavy scenario (serving media, cross-region replication), compute the monthly egress cost. Compare storage cost to transfer cost. For media, egress usually dominates — which is the argument for a CDN.


Check yourself

1. Why is it better to think in categories than to memorize cloud products? Because every cloud provider offers the same fundamental categories — compute, serverless, object storage, block storage, managed SQL, NoSQL, cache, queue, pub/sub, load balancer, CDN, DNS, secrets, KMS — just under different brand names (S3 vs Cloud Storage vs Blob Storage). The real knowledge is understanding what each *category* does and when to use it: what a load balancer is, what object storage is for, when you need a queue. That knowledge is portable across clouds and is what you learned in Part 2. The specific product name is trivia you can look up in seconds and that changes between providers and over time. In an interview, describing "a load balancer in front of app servers, a cache, a managed relational database, and object storage behind a CDN" demonstrates the actual skill — knowing which components the system needs — whereas naming AWS products just shows you've used AWS. Memorizing hundreds of product names is low-value; understanding a dozen categories is high-value and transfers everywhere.
2. What's the difference between an availability zone and a region, and what's the default posture? An **availability zone (AZ)** is an isolated datacenter within a region — with independent power, cooling, and networking, so it's a separate failure domain — but close enough to other AZs in the same region for low-latency synchronous replication. A **region** is a geographic area (a city or country) containing multiple AZs, and different regions are far apart. The distinction matters for resilience and latency: AZs protect against a single datacenter failure (power outage, fire) while staying fast to replicate between; regions protect against an entire region failing and let you serve users geographically, but are far apart so cross-region communication is slow and expensive. The default posture is **multi-AZ, single-region**: deploy across multiple AZs by default because it's cheap resilience against a datacenter failure (your service survives an AZ outage with minimal cost or latency impact), and stay single-region until you specifically need multi-region — for protection against a whole-region failure, to serve users in distant geographies with low latency, or because data residency compliance requires it. Multi-region is expensive and complex, so you adopt it deliberately, not by default.
3. When should you choose a managed service over self-hosting? Almost always, for most teams — managed is the sensible default. A managed service (RDS, ElastiCache, managed Kafka) has the cloud provider handle patching, backups, failover, scaling, and high availability, so you don't operate that infrastructure. The trade-off is that it costs more in dollars (typically 2-3× the raw compute) and gives you less control (which versions, configs, and extensions are available) with some lock-in. Self-hosting (running Postgres yourself on VMs) is cheaper in dollars and gives full control, but is far more expensive in engineer-hours: you build and *test* backups and failover, you're on call for the database at 3am, and you own capacity planning and upgrades. The decisive factor is usually that the operational tasks a managed service handles — especially *tested* backups and reliable automated failover — are things teams either don't build well or don't validate, so the managed premium buys reliability you'd struggle to match. Self-hosting makes sense at a scale where the dollar savings genuinely fund a dedicated team to operate it properly, or when you need control the managed service can't provide. Choosing managed is a maturity signal, not laziness.
4. Why does egress cost matter so much for data-heavy systems? Because cloud providers charge asymmetrically for data movement: data flowing *in* is usually free, but data flowing *out* to the internet is expensive (often $0.05-0.09/GB), data crossing between availability zones is billed, and data crossing between regions costs more still. For compute-heavy or storage-heavy systems this is minor, but for data-heavy systems — serving media, video streaming, large API responses, cross-region replication, feeding analytics pipelines across regions — the volume of data transfer can dominate the total bill, often exceeding compute and storage costs combined. A service serving 100 TB/month of media might pay a few thousand dollars to *store* it and many thousands more to *serve* it. This is why it's a common cost surprise, why keeping data flows local (same AZ, same region) matters, and why CDNs are cost-effective for serving media — CDN egress is cheaper than origin egress and the CDN absorbs most requests, dramatically reducing origin egress. Understanding that egress, not compute, often drives cost for these systems is a strong senior signal in a design discussion.
5. What's the pragmatic position on multi-cloud vs committing to one cloud? For most organizations, commit to one cloud and use its managed and proprietary services well, rather than pursuing genuine multi-cloud. Multi-cloud (actually running production across several providers) promises reduced lock-in and resilience against a single provider's failure, but the costs are steep and often underappreciated: you can't use each cloud's best proprietary services (DynamoDB, BigQuery, Spanner) because your workloads must run on the lowest common denominator that exists everywhere, you double the operational surface (two sets of tooling, IAM, networking, monitoring to master), and the complexity slows everything down. The proprietary managed services are a large part of what makes a cloud worthwhile, and forgoing them to stay portable usually costs more than the lock-in risk it avoids. The pragmatic middle ground: if portability genuinely matters, achieve it through *portable abstractions* — Kubernetes for orchestration, Terraform for infrastructure, open data formats — which give you an exit path without the cost of actually running multi-cloud today. Most "multi-cloud strategy" is aspiration; the productive move is to commit to one cloud deeply while keeping your architecture portable enough that migrating later is feasible if you ever need to.

Further reading