AWS SAA-C03 cheat sheet for secure, resilient, high-performing, and cost-optimized architecture decisions, service mappings, trade-offs, traps, and final review.
Keep this cheat sheet open while drilling questions. SAA-C03 is about trade-offs: availability, performance, cost, operations, and security.
Use the study plan to sequence the guide, then use this page for compressed recall once the chapter lessons are familiar.
If you want a quick architecture cue map, use the constraint flow and pattern sections below before mixed scenario drills.
I verified these current AWS exam facts on May 24, 2026.
| Item | Value |
|---|---|
| Exam | AWS Certified Solutions Architect - Associate |
| Exam code | SAA-C03 |
| Questions | 65 total |
| Scoring | 50 scored + 15 unscored (unscored items are not identified) |
| Question types | Multiple choice and multiple response |
| Time | 130 minutes |
| Passing score | 720, scaled 100-1000 |
| Cost | 150 USD |
| Intended candidate | At least 1 year of hands-on experience designing AWS cloud solutions |
| Domain | Weight | What to compress for final review |
|---|---|---|
| Design Secure Architectures | 30% | IAM, resource policies, KMS, private access, network controls, logging, compliance boundaries |
| Design Resilient Architectures | 26% | Multi-AZ, failover, backup/restore, decoupling, health checks, RTO/RPO fit |
| Design High-Performing Architectures | 24% | scaling, caching, storage/database fit, edge services, load balancing, service quotas |
| Design Cost-Optimized Architectures | 20% | managed service fit, right sizing, storage classes, endpoints vs NAT, purchase options, data transfer |
SAA-C03 is a design-tradeoff exam. The best answer is rarely the most powerful service; it is the lowest-complexity architecture that satisfies the named security, resilience, performance, cost, and operational constraints.
SAA-C03 questions usually compare architectures that are all technically possible. The winning answer is the one that proves the named constraint with the least unnecessary complexity. Before choosing, walk the scenario through this stack:
If two answers both work, choose the one that satisfies the constraint with fewer moving parts, narrower permissions, simpler operations, and clearer failure behavior.
Design Secure Architectures covers secure access, secure workloads, and data protection controls. Separate identity, resource, network, and KMS key-policy controls before choosing a service.
Design Resilient Architectures covers loose coupling, scalability, high availability, fault tolerance, and disaster recovery. Remove single points of failure, decouple components, and match RTO/RPO to the least complex recovery pattern.
Design High-Performing Architectures covers scalable storage, elastic compute, databases, networking, ingestion, and latency/throughput choices. Pick purpose-built services from access pattern, data shape, latency, throughput, and scaling metric.
Design Cost-Optimized Architectures covers storage, compute, database, and network cost design. Optimize the largest cost driver first: idle capacity, wrong storage tier, NAT/data transfer, overprovisioned databases, inefficient scans, or logging volume.
AWS frames SAA-C03 as an associate solutions-architecture exam. Use that boundary to reject distracting answers:
| Question type | Exam-day habit |
|---|---|
| Multiple choice | Find the deciding constraint before comparing services. Security, availability, performance, cost, and operational effort often point to different answers. |
| Multiple response | Include every required design control. If the stem asks for private, highly available access, one selected option may solve routing while another solves redundancy or access policy. |
Unanswered questions are incorrect and there is no penalty for guessing. With 65 questions in 130 minutes, your average budget is exactly 2 minutes per question; mark long architecture stems once you have narrowed the choice.
flowchart TD
Q["Read the last sentence first"] --> C["Find the deciding constraint"]
C --> A["Availability / resilience?"]
C --> P["Performance / scale?"]
C --> S["Security / private access?"]
C --> K["Cost / least ops?"]
A --> E["Eliminate answers that miss that constraint"]
P --> E
S --> E
K --> E
E --> W["Choose the lowest-complexity answer that still works"]
Rule: if the answer is more elaborate but does not better satisfy the named constraint, reject it.
What to notice:
| Stem clue | Eliminate first | Keep in play |
|---|---|---|
| private subnet needs S3 or DynamoDB | NAT gateway by default | gateway VPC endpoint with route table association |
| private access to another account’s service | VPC peering for broad connectivity | PrivateLink with endpoint service and interface endpoint |
| relational database needs HA in one Region | read replica as HA answer | RDS or Aurora Multi-AZ deployment |
| relational read pressure | bigger primary instance only | read replicas, caching, query/index tuning where appropriate |
| unpredictable decoupled workload | synchronous direct calls everywhere | SQS, SNS, EventBridge, Lambda, or Step Functions based on pattern |
| static website plus global delivery | EC2 web servers first | S3 static hosting with CloudFront where requirements fit |
| latency-sensitive global users | single regional ALB only | CloudFront for HTTP content or Global Accelerator for static-IP TCP/UDP acceleration |
| strict least operational effort | self-managed cluster | managed service that satisfies the constraint |
| cross-account encrypted access fails | IAM policy only | resource policy plus KMS key policy/grants and principal trust |
| cost issue with private S3 access | more NAT gateways first | gateway endpoint, storage class fit, data-transfer path review |
| Requirement evidence in the stem | Architecture answer should include | Weak answer to reject |
|---|---|---|
| “private”, “no internet path”, “AWS service access” | VPC endpoints, private subnets, route tables, endpoint/resource policy | NAT or public endpoint when private service access is available |
| “highly available in one Region” | Multi-AZ app and data tiers, health checks, managed failover | Single-AZ instance, snapshot-only recovery, or read replica as HA |
| “regional outage”, “strict RTO/RPO” | Multi-Region DR pattern, replication, DNS/traffic failover, runbooks | Backup-only design when recovery target is minutes |
| “spiky asynchronous work” | Queue/event bus, workers, auto scaling, idempotent processing | Direct synchronous calls between every component |
| “global users”, “HTTP content” | CloudFront, origin design, caching, optional origin failover | One regional ALB without edge acceleration |
| “static IPs”, “TCP/UDP”, “fast regional failover” | Global Accelerator | CloudFront when the protocol is not HTTP(S) content delivery |
| “least operational overhead” | Managed service, serverless, or purpose-built AWS service | Self-managed EC2 cluster unless control is explicitly required |
| “lowest cost” | Correct endpoint/storage/compute/database pattern, then purchase options | Reserved/Savings/Spot answer before fixing the architecture waste |
Use this when the stem is a design trade-off problem rather than a pure service lookup.
flowchart TD
S["Scenario"] --> C["Find the deciding constraint"]
C --> A["Availability, performance, security, or cost?"]
A --> P["Pick the smallest managed architecture that works"]
P --> O["Check operational effort and failure domains"]
O --> E["Reject answers that miss the named constraint"]
| If the question says… | Usually best answer |
|---|---|
| Private subnet needs S3/DynamoDB access | Gateway VPC endpoint |
| Many VPCs with transitive routing | Transit Gateway |
| Cross-account private service exposure | PrivateLink |
| Managed relational HA database | RDS/Aurora Multi-AZ |
| Read scaling for relational DB | Read replicas |
| Highly available shared Linux file storage | EFS |
| Cache hot reads / reduce DB load | ElastiCache |
| Global static + dynamic acceleration | CloudFront (HTTP) or Global Accelerator (TCP/UDP/static IP) |
| Event decoupling and buffering | SQS/SNS/EventBridge based on pattern |
| Strict RTO/RPO across Regions | Warm standby or active-active pattern |
| If the stem combines… | Prefer this reasoning |
|---|---|
| lowest cost + private S3 access | Gateway endpoint beats NAT because it satisfies privacy and removes NAT processing cost. |
| least ops + relational HA | Managed RDS/Aurora Multi-AZ beats self-managed database replication. |
| global performance + HTTP cacheable content | CloudFront beats duplicating full stacks in many Regions unless write locality or active-active is required. |
| global performance + non-HTTP static IP requirement | Global Accelerator beats DNS-only routing because it provides anycast static IPs and fast failover. |
| read scaling + relational workload | Read replicas or Aurora replicas help reads; Multi-AZ alone is not the read-scaling answer. |
| write-heavy key-value workload + massive scale | DynamoDB with a good partition key beats forcing relational scale-out. |
| compliance + encryption | Encryption choice is incomplete without IAM, KMS key policy, rotation/certificate needs, and audit evidence. |
| resilience + cost pressure | Pick the cheapest DR pattern that meets RTO/RPO; do not jump to active-active by default. |
| Topic | Fast recall |
|---|---|
| Security groups vs NACLs | SG stateful, NACL stateless |
| NAT design | One NAT gateway per AZ for HA and to avoid cross-AZ dependency |
| S3 durability vs availability | Very high durability; availability depends on class and design |
| Multi-AZ vs Multi-Region | Multi-AZ for AZ failure; Multi-Region for regional resilience |
| IAM evaluation | Explicit deny overrides any allow |
0.0.0.0/0 → IGW.| Endpoint | Services | What it does | Cost note |
|---|---|---|---|
| Gateway endpoint | S3, DynamoDB | Adds route-table entries; stays on AWS network | No hourly charge |
| Interface endpoint (PrivateLink) | Most AWS services | ENI in subnets; private service access | Hourly + data processing |
Exam cue: “Private subnets must access S3/DynamoDB” → Gateway endpoint (not NAT).
| Control | Level | Stateful? | Typical best practice |
|---|---|---|---|
| Security group | ENI/resource | Yes | Primary control; reference SG‑to‑SG |
| NACL | Subnet | No | Keep simple unless compliance requires |
| Need | Best-fit | Why |
|---|---|---|
| Few VPCs, simple links | VPC peering | Low latency; simple |
| Many VPCs (sprawl), transitive routing | Transit Gateway | Hub-and-spoke; scalable |
| Expose a service privately without routing everything | PrivateLink | Strong isolation; no CIDR coordination |
| Option | Best for | Notes |
|---|---|---|
| Site-to-Site VPN | Quick setup, encrypted tunnel | Uses internet; can be used as DX backup |
| Direct Connect (DX) | Predictable bandwidth/latency | Often paired with VPN for HA |
Exam cue: If the scenario says “quickly establish connectivity,” VPN is common. If it says “consistent performance,” Direct Connect is common.
| Service | Best for | Key idea |
|---|---|---|
| Route 53 | DNS routing and failover | DNS‑based; health checks; TTL matters |
| CloudFront | CDN caching + origin failover for HTTP(S) | Faster global content delivery |
| Global Accelerator | Static anycast IPs + fast failover | Great for TCP/UDP and fast regional failover |
| First question | If yes | If no |
|---|---|---|
| Is the target S3 or DynamoDB from private subnets? | Gateway endpoint | Continue |
| Is the target another AWS service privately? | Interface endpoint/PrivateLink | Continue |
| Is this many-to-many VPC routing? | Transit Gateway | Continue |
| Is this one service exposed across accounts/VPCs? | PrivateLink endpoint service | Continue |
| Is this predictable hybrid bandwidth? | Direct Connect, often with VPN backup | VPN may be enough for quick encrypted connectivity |
| Is the bottleneck global user latency? | CloudFront or Global Accelerator based on protocol | Keep regional design simple |
flowchart LR
U[Users] --> ALB["ALB (Public Subnets)"]
ALB --> App1["App (Private AZ1)"]
ALB --> App2["App (Private AZ2)"]
App1 & App2 --> RDS["RDS/Aurora (Multi-AZ)"]
App1 & App2 --> S3["S3 via Gateway Endpoint"]
App1 & App2 --> DDB["DynamoDB via Gateway Endpoint"]
App1 --> NAT1["NAT GW (AZ1)"]
App2 --> NAT2["NAT GW (AZ2)"]
| Policy/control | Answers “who?” | Answers “what can they do?” | Common exam gotcha |
|---|---|---|---|
| Trust policy | Who can assume a role | No | Too-broad principals |
| Identity policy | No | Principal permissions | Missing conditions/least privilege |
| Resource policy | Who can access the resource | Resource permissions | Forgetting to add cross-account principal |
| SCP (Organizations) | Org guardrail | Restricts | Explicit deny blocks everything |
| KMS key policy | Key admin/use | Key permissions | IAM allow isn’t enough if key policy blocks |
High-yield rule: Explicit Deny wins. If you see Organizations in a scenario, consider SCP effects.
flowchart TD
D["AccessDenied"] --> I["Identity policy"]
I --> R["Resource policy"]
R --> K["KMS key policy or grants"]
K --> O["SCP or explicit deny"]
Fast rule:
| Need | Best-fit | Notes |
|---|---|---|
| Simple default encryption | SSE-S3 | S3-managed keys |
| Audit/control requirements | SSE-KMS | Watch key policy principals |
| Strict key custody | CloudHSM / client-side | More complexity |
Common failure mode: service can’t decrypt because the KMS key policy doesn’t allow the calling principal/service.
| Scenario asks for | Usually include | Do not stop at |
|---|---|---|
| Cross-account access | Role trust policy, identity policy, optional resource policy | Adding permissions only in the trusting account |
| Encrypted cross-account data | Resource policy plus KMS key policy/grants | S3 bucket policy alone |
| Private application tier | Private subnets, SG references, ALB in public subnets if internet-facing | NACL complexity as the primary control |
| Secrets in app configuration | Secrets Manager or SSM Parameter Store, IAM access, rotation where needed | Environment variables with no secret-management story |
| Public web threat mitigation | CloudFront/ALB plus WAF and Shield posture | Security group rules only |
| Sensitive S3 data | Block Public Access, bucket policy conditions, encryption, access logging/Macie where relevant | Making the bucket public and relying on object naming |
aws:SecureTransport) and require encryption where needed.Require TLS for all S3 requests (copy-ready):
1{
2 "Version": "2012-10-17",
3 "Statement": [
4 {
5 "Sid": "DenyInsecureTransport",
6 "Effect": "Deny",
7 "Principal": "*",
8 "Action": "s3:*",
9 "Resource": [
10 "arn:aws:s3:::my-bucket",
11 "arn:aws:s3:::my-bucket/*"
12 ],
13 "Condition": { "Bool": { "aws:SecureTransport": "false" } }
14 }
15 ]
16}
Require access via a specific VPC endpoint (copy-ready):
1{
2 "Version":"2012-10-17",
3 "Statement":[{
4 "Sid":"DenyNotFromVPCE",
5 "Effect":"Deny",
6 "Principal":"*",
7 "Action":"s3:*",
8 "Resource":[
9 "arn:aws:s3:::my-bucket",
10 "arn:aws:s3:::my-bucket/*"
11 ],
12 "Condition":{"StringNotEquals":{"aws:sourceVpce":"vpce-1234567890abcdef0"}}
13 }]
14}
CloudFront note: for private S3 origins, use Origin Access Control (OAC) (don’t make the bucket public).
| Service | What it’s “for” on SAA |
|---|---|
| WAF | L7 protections (IP blocks, rate limiting, OWASP-style rules) |
| Shield | DDoS protection (Standard by default) |
| GuardDuty | Threat detection using logs (findings) |
| Security Hub | Aggregate/standardize findings and posture |
| Inspector | Vulnerability findings for compute/container images |
| Macie | Find sensitive data in S3 |
| Need | Pick | Notes |
|---|---|---|
| HTTP/HTTPS, L7 routing | ALB | Path/host routing, WAF integration |
| TCP/UDP, very high throughput | NLB | Static IPs per AZ, low latency |
| Inline appliances | GWLB | Insert firewalls/IDS appliances |
| Option | Best for | Why it wins |
|---|---|---|
| EC2 | Full OS control and flexibility | Broadest compatibility |
| ECS/Fargate | Containers with low ops | No server management with Fargate |
| EKS | Kubernetes standardization | Ecosystem + portability (more ops) |
| Lambda | Event-driven + bursty workloads | Minimal ops; scales fast |
Exam cue: If the scenario says “least operational overhead,” managed options (Fargate/Lambda/managed data stores) usually beat self-managed EC2.
| Requirement | Best-fit | Why |
|---|---|---|
| Durable object storage | S3 | Highly durable, cheap, scalable |
| Boot / per-instance block volume | EBS | Low-latency block storage for EC2 |
| Shared POSIX file system | EFS | Multi-AZ shared file storage |
| Windows file shares / high-perf file | FSx | Managed Windows/Lustre/etc |
| Type | Best for | Notes |
|---|---|---|
| gp3 | General purpose | Default choice; tune IOPS/throughput |
| io2 | High IOPS + critical workloads | Higher cost; consistent performance |
| st1 | Throughput-heavy HDD | Good for large sequential workloads |
| sc1 | Lowest-cost HDD | Cold throughput workloads |
| Instance store | Temporary scratch | Fast but ephemeral (data lost on stop/terminate) |
Exam cue: EBS is AZ-scoped. For multi-AZ shared storage, EFS/FSx is the usual answer.
| Requirement | Service/Class | Notes |
|---|---|---|
| Hot object storage | S3 Standard | Default |
| Unknown access patterns | S3 Intelligent‑Tiering | Monitoring fee |
| Infrequent access, multi-AZ durability | S3 Standard‑IA | Retrieval fee |
| Infrequent access, single AZ | S3 One Zone‑IA | Cheaper; less resilient |
| Archive | S3 Glacier / Deep Archive | Retrieval time trade-offs |
Exam cue: “Long-term retention / compliance” → Glacier + lifecycle + (sometimes) Object Lock.
| Feature | Multi-AZ | Read replica |
|---|---|---|
| Primary purpose | HA/failover | Read scaling |
| Writes | One primary | Still one primary |
| Failover | Automatic | Manual promotion (generally) |
Rule: Multi-AZ is about availability; read replicas are about scale.
| Need | Best-fit |
|---|---|
| Relational + joins + transactions | RDS/Aurora |
| Massive key-value scale | DynamoDB |
| Sub-millisecond cache | ElastiCache |
| DynamoDB read cache | DAX |
| Service | Best for | Notes |
|---|---|---|
| Redis | Rich features + durability options | Replication, multi-AZ patterns, data structures |
| Memcached | Simple cache | Very simple, no persistence |
| If the architecture needs… | Confirm these details |
|---|---|
| Multi-AZ availability | App tier, load balancer, NAT, and database all avoid a single-AZ dependency. |
| Safe failover | Health checks, DNS/traffic routing, replicated data, and tested runbooks exist. |
| Loose coupling | SQS/SNS/EventBridge/Step Functions separates producers from consumers. |
| Backpressure handling | Queue depth, retry, DLQ, visibility timeout, and idempotency are addressed. |
| Legacy app reliability | Load balancer, Auto Scaling, managed database, and minimal app-change patterns are considered. |
| Data durability | Backup, replication, versioning, Object Lock, or database snapshots match the failure mode. |
| Strategy | Typical RTO | Typical RPO | Cost | Notes |
|---|---|---|---|---|
| Backup/Restore | High | Hours | Low | Cheapest; slowest recovery |
| Pilot Light | Medium | Minutes–hours | Med | Minimal core in DR |
| Warm Standby | Low | Minutes | Med+ | Scaled-down prod running |
| Multi-site active-active | Very low | Seconds | High | Complex; highest cost |
| Data layer | Multi-Region option |
|---|---|
| S3 | CRR |
| DynamoDB | Global tables |
| Aurora | Aurora Global Database |
| Routing policy | Best for |
|---|---|
| Failover | Active-passive DR |
| Weighted | Canary / migrations |
| Latency | Lowest latency routing per user |
| Geolocation | Compliance/content by country |
Exam cue: If you need faster failover with static anycast IPs, consider Global Accelerator. If you need caching + origin failover for HTTP(S), consider CloudFront.
| Pattern | Pros | Cons |
|---|---|---|
| Active-passive | Cheaper; simpler operations | Higher RTO; failover/failback steps |
| Active-active | Lowest downtime; global performance | Most complex; highest cost |
flowchart LR
Users --> R53[Route 53]
R53 -->|Primary| A[Region A]
R53 -->|Failover| B[Region B]
A --> AppA[App + DB]
B --> AppB[Warm standby]
| Service | Think “this answers…” |
|---|---|
| CloudWatch | “How is it performing?” (metrics/logs/alarms) |
| CloudTrail | “Who did what?” (API audit trail) |
| Config | “What changed?” (config history + compliance) |
| X-Ray | “Where is latency?” (distributed traces) |
Exam cue: if the requirement is auditing and investigations, CloudTrail is usually the anchor.
High-yield alarms to know
HTTPCode_Target_5XX_Count, TargetResponseTime| Pattern | Option | Notes |
|---|---|---|
| Steady baseline | Savings Plans | Flexible discount for compute |
| Predictable, fixed needs | Reserved Instances | Strong discount for known shape |
| Fault-tolerant | Spot | Biggest savings; design for interruption |
| Tool | Best for |
|---|---|
| Cost Explorer | Trend analysis and spend breakdown |
| Budgets | Alerts on spend/usage thresholds |
| Cost Anomaly Detection | Unexpected spend spikes |
| Compute Optimizer | Rightsizing recommendations |
| Trusted Advisor | Best-practice checks (cost/security/perf) |
| Cost and Usage Report (CUR) | Most detailed cost dataset export |
If monthly spend is the explicit constraint, check these in order:
| Area | Lever | Example |
|---|---|---|
| Compute | Right-size + Graviton | Smaller instance families, Graviton where supported |
| Compute | Spot for fault-tolerant | Batch/worker tier with Spot + scaling |
| Storage | S3 lifecycle tiering | Move logs to IA/Glacier |
| Storage | gp3 tuning | Tune IOPS/throughput instead of overprovisioning |
| Network | Endpoints over NAT | S3/DynamoDB via Gateway endpoints |
| Edge | Cache at CloudFront | Reduce origin load and egress |
Cross-account role assumption (trust policy):
1{
2 "Version":"2012-10-17",
3 "Statement":[{
4 "Effect":"Allow",
5 "Principal":{"AWS":"arn:aws:iam::222233334444:role/TeamRole"},
6 "Action":"sts:AssumeRole"
7 }]
8}
Route 53 failover (pseudo steps):
11) Create primary A/AAAA alias to ALB in Region A with Health Check.
22) Create secondary A/AAAA alias to ALB in Region B with Health Check.
33) Set routing policy to Failover: Primary / Secondary.
44) Verify health checks and simulate failover.
If multiple answers work, pick the one that best matches the explicit constraint (for example: lowest cost or least operational effort) while still meeting availability and security requirements.