SAA-C03 · Reference architecture

Infrastructure map — where every service actually sits

Four diagrams to fix the spatial mental model the mocks turn on: what scope a service lives at, how a landing-zone Organization is arranged, what goes where inside a VPC, and how a request threads through the whole thing from an internet client all the way to a data store — with the on-prem side wired in.

Container / boundary
Logical scope (Global, AZ, OU)
Highlighted / shared
Main data path
One-way exposure (PrivateLink)
Control / trust / audit

01 Scope containment — global → region → AZ → subnet

The single biggest source of confusion in the mocks. Everything AWS runs sits inside exactly one of these bands, and the band decides what a resource can and cannot reach. Read outside-in.

GLOBAL · one control plane worldwide Route 53 · CloudFront · WAF (on CF) · Shield · IAM · Organizations · Global Accelerator · IAM Identity Center REGION · e.g. us-east-1 · everything below is inside one region S3 · DynamoDB · Lambda · SQS · SNS · KMS keys · Kinesis · Athena · Glue · Redshift · RDS/Aurora control plane · CloudTrail (trail) · Config · Secrets Manager · ECR · Step Functions EFS · a single regional file system with a mount target per AZ · Aurora Global Database spans regions · DynamoDB Global Tables span regions VPC · a regional network container · your CIDR Route tables · Internet Gateway · NAT Gateway placement · VPC endpoints · Security Groups · NACLs · Transit Gateway attachment AZ · us-east-1a Public subnet NAT Gateway · ALB target · bastion IGW route: 0.0.0.0/0 → IGW Private-app subnet EC2 · Fargate task ENI · Lambda ENI Egress route: 0.0.0.0/0 → NAT-a Private-data subnet RDS primary · EFS mount-tgt-a ElastiCache node · no default route EBS volumes are AZ-bound to their instance Instance store: ephemeral, dies on stop AZ · us-east-1b Public subnet NAT Gateway · ALB target Route: 0.0.0.0/0 → IGW Private-app subnet EC2 · Fargate task ENI Egress: 0.0.0.0/0 → NAT-b Private-data subnet RDS standby (sync) · EFS mt-b ElastiCache replica Multi-AZ RDS = one primary + one hidden sync standby here AZ · us-east-1c Public subnet NAT-c · ALB target One NAT per AZ = no cross-AZ egress Private-app subnet EC2 · Fargate task ENI Egress: 0.0.0.0/0 → NAT-c Private-data subnet Aurora replica · EFS mt-c Read scaling target Subnets are AZ-scoped · one subnet = one AZ · VPC spans all 3
A resource can only reach things at its own scope or wider. An EC2 instance in a private-app subnet in AZ-a can hit S3 (regional, via a gateway endpoint), the RDS primary in AZ-a's data subnet (VPC), and the internet through NAT-a (AZ) — but its EBS volume cannot move to AZ-b, and its subnet does not exist in the other two AZs.

02 Multi-account landing zone — how accounts talk

A typical AWS Organization. The Management account never runs workloads — it authors the guardrails and pays the bills. Everything else lives in Organizational Units below it, and the interesting arrows are the cross-account patterns: RAM (share subnets), PrivateLink (expose one service one-way), and the Organization CloudTrail that collects every account's audit log.

AWS ORGANIZATION Management account Authors SCPs · consolidated billing Cost Anomaly Detection · never hosts workloads SCP GUARDRAILS APPLY TO EVERY ACCOUNT BELOW · SLRs are exempt FOUNDATIONAL OU Log Archive account Organization CloudTrail bucket (S3 + Object Lock Compliance) Config aggregator · VPC Flow Logs sink Immutable · write-only from every account S3 · Object Lock (Compliance) · KMS · CloudTrail Security account GuardDuty delegated admin · Security Hub org-wide findings IAM Access Analyzer · Macie admin Assumes a read-only IAM role in every workload for audit GuardDuty · Security Hub · Macie · Access Analyzer Shared Services account AWS Managed Microsoft AD · Route 53 Resolver rules Central VPC with subnets shared to workloads via RAM Common services exposed via PrivateLink (NLB behind endpoint) Managed AD · RAM · PrivateLink service · Route 53 Resolver WORKLOADS OU Workload A · web application 3-AZ VPC (subnets shared from Shared Services via RAM) CloudFront (WAF, Shield Adv) → ALB → ASG → RDS Multi-AZ S3 for static assets · KMS CMK for RDS + S3 Cognito User Pool on the ALB for auth Writes CloudTrail events into Log Archive account Consumes internal APIs from Shared Services via PrivateLink VPC · ALB · ASG · RDS · CloudFront · WAF · KMS · Cognito Workload B · data platform 3-AZ VPC with private subnets only Kinesis Data Streams → Firehose → S3 data lake (Parquet) Glue Data Catalog + Crawler · Athena · Redshift DMS for source-DB replication into Redshift Cross-account: reads a raw bucket in Workload A via bucket policy Writes CloudTrail events into Log Archive account Kinesis · Firehose · S3 · Glue · Athena · Redshift · DMS RAM subnets shared PrivateLink one-way, one service CloudTrail (dashed) →
Nesting shows scope: everything inside the SCP-guardrail box is subject to policies the Management account writes. Cross-account trust is always explicit — an IAM role in the target account with a trust policy naming the source. PrivateLink exposes one service one-way (never opens a route); RAM shares subnets so workload compute sits inside a network the Shared Services account owns. The Log Archive bucket uses S3 Object Lock in Compliance mode — root itself cannot shorten retention.

03 VPC anatomy — the standard 3-AZ layout

One VPC, three AZs, three subnet tiers per AZ. This is the shape almost every exam scenario assumes without saying so. The interesting placements: ALB spans public subnets across all AZs, RDS Multi-AZ pins a primary in one AZ and a hidden sync standby in another, EFS puts a mount target in every AZ, and the S3 gateway endpoint is the way to avoid NAT data charges for S3 traffic.

INTERNET Internet Gateway VPC · 10.0.0.0/16 · one region · SGs and NACLs · route tables Application Load Balancer · targets across all 3 AZs AZ · us-east-1a Public subnet · 10.0.0.0/20 route: 0.0.0.0/0 → IGW NAT-a Gateway ALB target-a bastion (opt.) Private-app subnet · 10.0.16.0/20 route: 0.0.0.0/0 → NAT-a EC2 (ASG) Fargate task Lambda ENI (VPC-attached) Private-data subnet · 10.0.32.0/20 no default route RDS primary Multi-AZ writer EFS mt-a mount target ElastiCache primary Redis / Memcached node AZ · us-east-1b Public subnet · 10.0.1.0/20 route: 0.0.0.0/0 → IGW NAT-b Gateway ALB target-b Private-app subnet · 10.0.17.0/20 route: 0.0.0.0/0 → NAT-b EC2 (ASG) Fargate task ECS service tasks Private-data subnet · 10.0.33.0/20 no default route RDS standby sync · not readable EFS mt-b mount target ElastiCache replica read + failover AZ · us-east-1c Public subnet · 10.0.2.0/20 route: 0.0.0.0/0 → IGW NAT-c Gateway ALB target-c Private-app subnet · 10.0.18.0/20 route: 0.0.0.0/0 → NAT-c EC2 (ASG) Fargate task Spot Fleet workers Private-data subnet · 10.0.34.0/20 no default route Aurora replica read + failover target EFS mt-c mount target ElastiCache replica extra read scaling sync replication VPC endpoints · Gateway: S3 · DynamoDB (attached to route tables, free) · Interface: SQS · SNS · SSM · Secrets Manager · KMS · ECR (ENIs, paid) · Transit Gateway attachment for hybrid + peering
ALB is one object with targets in every AZ, so a single URL survives the loss of one AZ. RDS Multi-AZ hides its standby — you never point traffic at it; failover reuses the primary's endpoint. Instances in a private-app subnet reach S3 through the S3 gateway endpoint — traffic never leaves the AWS network and skips NAT data charges. EBS volumes live in exactly one AZ; instance store dies with the instance.

04 Request path — internet to database, with on-prem wired in

Follow one HTTPS request from a mobile client all the way to a table row, and follow one on-prem query in through Direct Connect at the same time. Every decision the mocks care about — where WAF attaches, why Global Accelerator beats DNS for blue/green, why the private-DNS lookup needs a Route 53 Resolver inbound endpoint — is a hop on this line.

TWO CLIENTS · same VPC target Mobile user public internet DNS is cached on device On-prem datacenter Customer Gateway (CGW) CIDR 192.168.0.0/16 internal DNS server GLOBAL EDGE Route 53 alias · latency · failover · weighted CloudFront + WAF · Shield Advanced attached Global Accelerator anycast · beats DNS caches · UDP REGION · us-east-1 · one VPC DX Gateway private VIF · encrypted VPN or Site-to-Site VPN backup Transit Gateway hub for VPCs + on-prem route tables segment Application Load Balancer Cognito User Pool auth attached natively · WAF geo-match if no CloudFront Private-app subnets · ASG across 3 AZs EC2 ASG target tracking on CPU deregistration delay for long-lived connections Fargate service task role · one per container EFS mount for shared state Lambda API GW (HTTP) + JWT authorizer Layers for shared code RDS Proxy for connections Decoupling · SQS (queue) · SNS (fan-out) · Kinesis (ordered stream) FIFO for exactly-once + ordering · standard for throughput · priority = two queues, poll higher first Data · private-data subnets + regional AWS services RDS Multi-AZ sync standby · same endpoint Aurora Global for <1s RPO DR encrypt via snapshot copy S3 bucket via gateway endpoint SSE-KMS · Object Lock events → SQS / Lambda DynamoDB via gateway endpoint on-demand for spikes Global Tables = active-active EFS · ElastiCache · Redshift · Kinesis cache-aside with TTL for aggregations EFS: mount target in each AZ · SG-controlled Route 53 Resolver endpoints inbound: on-prem → resolves PHZ outbound: VPC → forwards to on-prem DNS Direct Connect · private VIF private DNS hybrid
Two paths, same destination. The mobile client goes through Route 53 and one of the two edge accelerators — CloudFront (cacheable HTTP, WAF/Shield attach here) or Global Accelerator (UDP, non-cacheable, when DNS caching would defeat a Route 53 traffic shift). The on-prem client goes over Direct Connect through a DX Gateway into a Transit Gateway, then out to the same VPC. WAF sits wherever the traffic first enters AWS — on CloudFront for the internet path, on the ALB when there is no CloudFront in front. Between compute and slow work, always SQS. Between compute and S3/DynamoDB, always the gateway endpoint.