AWS SAA-C03: How to Design Highly Available and Fault-Tolerant Architectures for the AWS Certified Solutions Architect – Associate exam
Introduction
Honestly, SAA-C03 resilience questions get a lot easier when you stop chasing the buzzwords and just ask, “What’s the actual failure domain here?” Are we dealing with a single instance dying, an Availability Zone going sideways, or a full-blown Regional outage? Once you’ve got that sorted out, line it up against the business’s RTO and RPO, then pick the simplest AWS pattern that actually fits. That’s how you dodge the usual exam traps, like mixing up backups with high availability, read replicas with failover, or plain old scaling with true fault tolerance.
This domain is really about precision. “Highly available,” “fault tolerant,” “durable,” “scalable,” and “disaster recovery” are related, but they are not interchangeable. AWS exam questions often hide the right answer behind one small clue phrase, so your job is to identify exactly what must stay online, what can recover later, and what level of interruption or data loss is acceptable.
Core resilience concepts
Use these terms carefully:
| Concept | Meaning | Typical AWS exam clue |
|---|---|---|
| High availability | Keep a workload available through common failures with minimal interruption. | Usually in one Region, commonly across at least two AZs. |
| Fault tolerance | Continue operating through failures, often with minimal or no interruption depending on architecture. | Requires redundancy and automatic failover; usually higher cost. |
| Disaster recovery | Recover service after a major outage such as a Regional event. | Backups, replication, standby Region, RTO/RPO tradeoffs. |
| Durability | How reliably data is preserved over time. | S3, backups, snapshots, versioning. |
| Scalability | Ability to handle more load by adding capacity. | Auto Scaling, read replicas, caching. |
| Backup | Point-in-time copy used for recovery. | Good for DR, not immediate failover. |
AWS is responsible for resilience of the cloud; you are responsible for resilience in the cloud. Managed services definitely take a load off, but they don’t magically erase your responsibility to remove single points of failure, protect data, and actually test recovery.
RTO is how long the business can be down. RPO is how much data loss is acceptable. Examples:
- RTO hours, RPO hours: backup and restore may be enough.
- RTO minutes, low RPO: Multi-AZ plus replication or warm standby.
- Very low RTO, cross-Region continuity: active-passive or active-active multi-Region design.
Be careful with “no data loss” language. Inside a Region, some managed HA patterns use synchronous replication. Across Regions, many services replicate asynchronously, so zero data loss is not a default assumption.
In-Region high availability patterns
For SAA-C03, the default answer for surviving an AZ failure is Multi-AZ, not multi-Region. A solid, resilient web app usually keeps the internet-facing Application Load Balancer in public subnets across at least two AZs, runs the app instances or tasks in private subnets in those same AZs, and protects the database with Multi-AZ failover. That’s the basic pattern I reach for most of the time.
Usually, I think of it as a layered setup: DNS points users to an Application Load Balancer spread across multiple public subnets, the load balancer hands traffic to an Auto Scaling group or container service in private subnets across at least two AZs, the app talks to a resilient database layer like RDS Multi-AZ or Aurora, and then you add supporting pieces like S3, EFS, or caching only where they really add value.
The key implementation details matter:
- Use subnets in at least two AZs.
- Make sure the load balancer’s attached to subnets in multiple AZs. ELB doesn’t become multi-AZ by magic — you’ve got to place it in multiple subnets.
- Set the Auto Scaling group up across multiple subnets and AZs so it’s not tied to just one failure domain.
- Set the minimum and desired capacity with an AZ failure in mind, so the app can still keep running if one AZ drops out.
If your ASG desired capacity is 2 and you’ve got one instance in each AZ, losing one AZ means you’ve just lost half your capacity. That’s not a bug in the math — that’s just the design. Sometimes that’s perfectly acceptable, and sometimes it’s nowhere near enough. If the requirement says the app must continue performing normally after one AZ fails, you may need more baseline capacity.
Compute patterns: EC2, containers, and Lambda
EC2 web tier: the classic pattern is ALB + Auto Scaling Group across multiple AZs. Use a launch template, health checks, and stateless instances. ALB target group health checks should point to a real application path such as /health, not just a TCP port that says the instance is alive while the app is broken.
Useful ASG details for the exam:
- EC2 health checks detect instance failure.
- ELB health checks detect application-level failure and can trigger replacement.
- Lifecycle hooks can delay registration until bootstrapping completes.
- Instance warm-up prevents scaling decisions from reacting too early.
Stateless design is central to HA. If sessions live on one EC2 instance, failover breaks user experience. Move session state out of the instance and into something shared, like ElastiCache for Redis, DynamoDB, or another central store. Sticky sessions can be a quick band-aid, sure, but they also box you in and usually aren’t the best answer when resilience matters.
Load balancer selection:
- ALB: Layer 7 HTTP and HTTPS, host-based and path-based routing, WebSocket support, common web apps.
- NLB: Layer 4 TCP, UDP, and TLS, static IP needs, very high throughput, non-HTTP workloads.
- GWLB: traffic distribution to virtual appliances using GENEVE.
ALB cross-zone load balancing is effectively built in. NLB design is more about Layer 4 requirements, static entry points, and protocol needs. Pick NLB because the workload actually needs TCP, UDP, TLS, or static IPs — not just because it sounds tougher.
Now, when you’re looking at ECS, Fargate, EKS, and Lambda, the right choice really depends on how much control you need and how much ops overhead you want to avoid.
- ECS on Fargate is a strong managed answer for containerized apps with low operational overhead.
- ECS on EC2 gives more control but adds fleet management.
- EKS is appropriate when Kubernetes is explicitly required.
- Lambda is a regional managed service with AWS-managed availability across multiple AZs, but application resilience still depends on retries, concurrency limits, downstream services, and multi-Region planning if Regional DR is required.
Small exam guardrail here: if Kubernetes isn’t explicitly required, EKS is often more machinery than you need.
Traffic, DNS, and network resilience
Route 53 is the standard DNS answer. Common routing policies include failover, weighted, latency-based, geolocation, and multivalue answer routing. Geoproximity routing is available through Route 53 Traffic Flow. Alias records are commonly used when you want a domain name to point cleanly at an ALB, NLB, CloudFront distribution, or another AWS resource.
Route 53 failover still works through DNS, so the cutover speed isn’t instant — it depends on TTL settings and whatever caching the resolvers are doing. That makes it excellent for many DR patterns, but not instantaneous.
A correct failover pattern uses a primary alias record that points application traffic to a load balancer in one Region and associates a health check with that endpoint. A secondary alias record points to a standby load balancer in another Region and is used when the primary health check fails.
Global Accelerator is often the better answer when the requirement includes fast global failover, static anycast IP addresses, or improved failover behavior beyond DNS caching limits. It uses AWS global edge infrastructure and health-based routing to endpoint groups, but it doesn’t make every failover concern disappear.
CloudFront improves resilience mainly by caching content at edge locations and reducing origin load. Cached objects can keep being served until they expire, and origin groups can sometimes handle failover, but CloudFront still isn’t a replacement for backend HA when you’re dealing with uncached or dynamic traffic.
VPC design: use public subnets for internet-facing load balancers and private subnets for application and database tiers. Hidden SPOFs often appear in egress design. A NAT Gateway is highly available within one AZ, but it doesn’t automatically protect the other AZs for you. If you want outbound access that’s resilient to an AZ failure, put a NAT Gateway in each AZ and route each private subnet to the NAT Gateway in the same AZ.
Put another way, each private subnet should use the NAT Gateway in its own Availability Zone instead of depending on one that lives somewhere else. Yes, it costs a bit more, but it removes the cross-AZ dependency and gives you a much sturdier design.
Also reduce NAT dependence where possible by using VPC endpoints, especially gateway endpoints for S3 and DynamoDB and interface endpoints for supported AWS APIs.
Storage and database resilience
S3 is both highly durable and highly available as a service, making it ideal for static assets, logs, backups, and data lakes. But just putting files in S3 doesn’t suddenly make the whole application tier highly available. The big resilience features to remember here are Versioning, lifecycle rules, Same-Region Replication, and Cross-Region Replication. Replication doesn’t happen on its own — you need to configure it, grant the right IAM permissions, and have a destination bucket ready.
EBS volumes are AZ-scoped block storage for EC2. They are not shared multi-AZ storage. Snapshots live in S3 and are what you use for backup and restore. Multi-Attach exists only for limited io1 and io2 scenarios and does not solve general shared multi-AZ filesystem needs.
EFS is the standard answer for shared Linux file storage across instances in multiple AZs. EFS Standard is a Regional, multi-AZ service. Instances access it through mount targets in subnets. If the workload needs Windows SMB or some more specialized filesystem behavior, FSx may be a better fit than EFS.
AWS Backup centralizes backup plans, vaults, retention, and cross-Region or cross-account copy for supported services. That definitely helps with governance, but recovery still comes down to whether you’ve actually tested the restore process.
RDS and Aurora:
- RDS Multi-AZ is the default answer for automatic relational failover within one Region. Standard Multi-AZ deployments use a standby copy and are meant for HA, not read scaling.
- Read replicas are primarily for read scaling and DR support; they do not equal automatic Multi-AZ failover.
- RDS Multi-AZ DB clusters for some engines provide a different model with readable standbys and faster failover characteristics than older single-standby patterns.
- Aurora uses storage replicated across multiple AZs. Failover usually promotes an Aurora Replica. Use the writer endpoint for writes and reader endpoint for read scaling.
- Aurora Global Database is a multi-Region option for Aurora-specific DR and low-latency global reads, but it is not the same as standard RDS Multi-AZ.
DynamoDB is a regional service designed for multi-AZ resilience. Point-in-time recovery and backups are there to support recovery. Global Tables provide multi-Region multi-active replication, but you should understand that cross-Region replication has consistency and conflict-handling implications.
ElastiCache matters in resilience questions too. Redis supports replication groups, Multi-AZ, and automatic failover. Memcached doesn’t give you native replication or failover, so it’s not the right answer when the requirement calls for cache HA.
Messaging, decoupling, and serverless resilience
Decoupling prevents one slow component from taking down everything else.
- SQS buffers work and isolates producers from consumers.
- SNS provides push-based publish and subscribe fan-out.
- EventBridge provides an event bus and rule-based routing.
For SQS, know the operational controls:
- Standard queues: at-least-once delivery, best-effort ordering, highest scale.
- FIFO queues: ordered processing and deduplication, lower throughput characteristics.
- Visibility timeout: prevents multiple consumers from processing the same in-flight message immediately.
- Dead-letter queue: captures poison messages after repeated failures.
- Long polling: reduces empty responses and cost.
A common resilient serverless pattern is API Gateway calling a Lambda producer, which then drops messages onto SQS. Then a Lambda consumer processes those messages and writes the results to DynamoDB, while a dead-letter queue catches the ones that keep failing.
This works well because the front end can respond quickly, SQS soaks up traffic spikes, and the consumer can retry safely without dragging the whole system down. But don’t assume exactly-once processing out of the box — that’s not the default. Use idempotency keys, conditional writes, or some other deduplication logic so retries don’t create duplicate side effects.
Disaster recovery strategies
When the failure domain is the entire Region, move from HA thinking to DR thinking.
| Strategy | RTO/RPO profile | Cost | Typical use |
|---|---|---|---|
| Backup and restore | Highest RTO/RPO | Lowest | Cost-sensitive workloads |
| Pilot light | Lower RTO than backup and restore | Low to moderate | Core services pre-positioned in DR Region |
| Warm standby | Lower RTO and RPO still | Moderate to high | Scaled-down but running environment in DR Region |
| Active-active | Lowest RTO/RPO | Highest | Critical global workloads |
Implementation examples:
- Backup and restore: store backups in another Region, use CloudFormation to recreate infrastructure, then restore data.
- Pilot light: keep databases, replication, and minimal core services running in the DR Region; scale app tiers during failover.
- Warm standby: maintain a reduced but functional stack in the DR Region and scale out when needed.
- Active-passive or active-active: steer traffic using Route 53 or Global Accelerator, with service-specific replication.
AWS Elastic Disaster Recovery (DRS) is worth knowing for lift-and-shift style DR. It continuously replicates servers to a recovery Region and can reduce recovery time for traditional workloads.
And don’t forget the supporting stuff — KMS keys, Secrets Manager secrets, IAM roles, certificates, and parameter values all need to be available in the recovery Region, or your failover can stall even when the compute and data are ready.
Hybrid and security considerations
For hybrid resilience, remember that AWS Site-to-Site VPN gives you two tunnels per VPN connection, but true end-to-end resilience may still need redundant customer gateway devices, multiple VPN connections, or Direct Connect with VPN backup. Transit Gateway makes hub-and-spoke connectivity a lot cleaner, and honestly, it can take a good chunk of the pain out of routing complexity.
Security controls can directly affect availability. Some of the sneaky outage causes I’ve seen are overly restrictive security groups, NACL mistakes, missing KMS permissions for encrypted restores, and secrets that never got replicated to the DR Region. For public entry points, AWS WAF and Shield help a lot with resilience against application-layer attacks and distributed denial-of-service traffic. Systems Manager Session Manager can reduce reliance on bastion hosts.
Troubleshooting common resilience failures
ALB unhealthy targets: check target group path, port, health check matcher, instance security groups, NACLs, and whether the application is actually listening. A really common mistake is pointing health checks at a path that returns 302 or 403 instead of 200.
ASG replacement loop: look for failed user data, bad AMI, broken launch template, or ELB health checks failing before the app is ready. Lifecycle hooks or longer grace periods may help.
Route 53 failover not working: verify health check status, alias target health behavior, and remember DNS caching. Low TTL helps, but resolvers may still cache.
RDS failover confusion: make sure the deployment is Multi-AZ, not just a read replica. Applications should reconnect using the database endpoint rather than hardcoded instance IPs.
NAT outage symptoms: private instances cannot reach package repositories or public APIs. Check whether each private subnet routes to a NAT Gateway in the same AZ.
SQS backlog growth: review queue depth, consumer concurrency, Lambda throttling, visibility timeout, and dead-letter queue counts.
Exam scenarios and keyword decoder
| Requirement clue | Best answer | Common wrong answer |
|---|---|---|
| Survive one AZ outage | Multi-AZ design across at least two AZs | Single-AZ ASG or backups only |
| Automatic relational DB failover | RDS Multi-AZ | Read replica alone |
| Read-heavy relational workload | Add read replicas | Use Multi-AZ for read scaling |
| Shared file storage across EC2 instances | EFS | EBS across AZs |
| Durable object storage | S3 | EBS for static assets |
| Buffer spikes, decouple backend | SQS | SNS alone |
| Fast global failover, static IPs | Global Accelerator | Route 53 only |
| Lowest-cost DR | Backup and restore | Active-active multi-Region |
| Need Kubernetes specifically | EKS | Choose EKS when not required |
My exam checklist is simple:
- Identify the failure domain.
- Decide whether the problem is HA, fault tolerance, or DR.
- Read for RTO and RPO clues.
- Find hidden single points of failure.
- Choose the simplest managed service that still meets protocol, consistency, compliance, and cost requirements.
Conclusion
The default in-Region HA answer is usually Multi-AZ. The default relational failover answer is usually RDS Multi-AZ. Read replicas are for scaling, not primary failover. EFS and EBS are not interchangeable. S3 is highly durable and highly available as a service, but it does not make the whole application highly available. Route 53 gives DNS-based failover; Global Accelerator is the stronger answer for fast global failover and static IP requirements. And SQS is one of the most useful tools for absorbing spikes and preventing cascading failure.
If you keep matching the requirement to the failure domain and then pick the simplest correct AWS pattern, SAA-C03 resilience questions become much less intimidating. That is not just good exam technique. It is good architecture.