High Availability: ELB and Route 53 Health Checks, Multi-AZ Design
A highly available environment keeps serving users when instances, Availability Zones or entire Regions fail, by detecting failure with health checks and moving traffic to healthy capacity automatically. Task 2.2 of the SOA-C03 exam covers that plumbing: choosing among the Elastic Load Balancing types and configuring their listeners, target groups and health checks; diagnosing unhealthy targets and load-balancer-generated 502, 503 and 504 errors; using Route 53 endpoint, calculated and alarm-based health checks to gate DNS answers; and building Multi-AZ fault tolerance with Auto Scaling groups, RDS Multi-AZ deployments and ElastiCache replication groups. Scenarios usually start from a symptom — a standby that serves no reads, a failover record that never fails over, one zone misbehaving while health checks pass. This lesson works through each layer in turn: the load balancer inside a Region, DNS across Regions, deliberate failover with Application Recovery Controller, the database and cache tiers, and the single-AZ dependencies that quietly undermine all of it.
On this page11 sections
- ALB vs NLB: choosing the right load balancer
- One ALB, many sites: listener rules, certificates and routing algorithms
- Target groups, cross-zone load balancing, and deregistration delay
- ELB health checks: the settings that decide who gets traffic
- Debugging: all targets unhealthy after a deploy
- Route 53 health checks: gating DNS answers
- Two layers of health checking: in-Region and cross-Region
- Deliberate failover: ARC, Global Accelerator and Resilience Hub
- Multi-AZ databases: RDS Multi-AZ, readable standbys, and read replicas
- Cache-tier failover: ElastiCache endpoints and engines
- Static stability: automatic failover vs ops action, and single-AZ traps
- Choose among ALB, NLB and Gateway Load Balancer, and combine them for PrivateLink, static IPs and appliance insertion
- Configure ALB listener rules, SNI certificates and routing algorithms for several sites and services
- Configure target-group health checks — port, path, success codes, thresholds — and predict fail-open behaviour
- Diagnose all-targets-unhealthy conditions and load-balancer-generated 502, 503, 504 and 403 responses
- Configure Route 53 endpoint, calculated and alarm-based health checks and active-passive failover with alias records
- Use ARC zonal shift, zonal autoshift and Region switch for deliberate failover, and tell them apart from Global Accelerator and Resilience Hub
- Build Multi-AZ fault tolerance for the web, database and cache tiers, including the client-side settings failover depends on
- Identify single-AZ dependencies and size capacity for static stability
ALB vs NLB: choosing the right load balancer
The ALB-versus-NLB choice comes down to the layer at which the load balancer must make decisions: an Application Load Balancer reads HTTP requests, a Network Load Balancer forwards connections. Two further types exist for narrower jobs — the Gateway Load Balancer for appliance fleets and the legacy Classic Load Balancer, which new designs don't use.
| Application Load Balancer | Network Load Balancer | Gateway Load Balancer | |
|---|---|---|---|
| Layer | 7 — HTTP/HTTPS (and gRPC) | 4 — TCP, UDP, TLS | 3 — all IP packets |
| Routing | Path, host, header and query-string rules to different target groups; redirects and fixed responses | Flows to a target group by listener; no content inspection | Every packet to a healthy appliance, transparently (GENEVE, port 6081) |
| Addressing | DNS name only; the IPs behind it change | Static IP per AZ, with Elastic IP support | Reached through Gateway Load Balancer endpoints used as route-table targets |
| Health-check protocols | HTTP, HTTPS | TCP, HTTP, HTTPS | TCP, HTTP, HTTPS |
| Client IP at the target | In the X-Forwarded-For header | Preserved at the connection level (client IP preservation) | Original packet unchanged |
| Requirement that decides it | Content-based routing, many sites on one listener, authentication, Lambda targets | Non-HTTP protocols, fixed IPs for allowlists, PrivateLink, extreme connection rates | Inserting third-party firewalls or inspection appliances into the traffic path |
Three combinations come up in operations work:
- Static IPs or PrivateLink in front of layer-7 routing. An NLB can forward to an ALB through an ALB-type target group. The NLB supplies the static IPs, or serves as the load balancer behind a VPC endpoint service (AWS PrivateLink accepts only an NLB or a GWLB, never an ALB directly), while the ALB keeps its path and host rules. PrivateLink consumers reach the service through interface endpoints in their own VPCs, so overlapping CIDR ranges on either side don't matter.
- Appliance insertion. A Gateway Load Balancer distributes traffic across a scalable fleet of virtual appliances, health-checks them and stops sending flows to failed ones. Route tables send traffic to a GWLB endpoint, so inspection is transparent to the applications on either side.
- Client IP preservation on an NLB changes only the source address a target sees (and therefore what the target's security group must allow). It plays no part in which target or zone receives a flow.
Every load balancer type places nodes in each enabled Availability Zone, which makes it the traffic-steering half of every Multi-AZ design in the rest of this lesson.
One ALB, many sites: listener rules, certificates and routing algorithms
A single Application Load Balancer can serve many domains and services, because each listener evaluates an ordered list of rules and an HTTPS listener can hold several certificates.
- Rule order. Listener rules are evaluated from the lowest priority number to the highest, and the first rule that matches wins; the default action applies only when nothing matches. A broad rule such as
/api/*with a lower number than a narrower/api/admin/*rule captures the narrower traffic too, so give the specific rule the lower number. - Host-based routing. Rules can match the
Hostheader, soshop.example.comandblog.example.comcan reach different target groups through the same listener on port 443. - Several certificates on one listener. An HTTPS listener has a default certificate plus a certificate list; the ALB uses SNI (the host name the client sends in the TLS handshake) to present the matching certificate. You don't need one load balancer or one port per domain.
Within a target group, the ALB's routing algorithm decides which healthy target gets each request: round robin (the default), least outstanding requests (useful when request cost varies a lot), or weighted random. The setting exists only on ALB target groups. An NLB has no such choice: it selects a target per flow with a flow hash of the connection's protocol, addresses and ports, so a long-lived connection stays on one target.
Target groups, cross-zone load balancing, and deregistration delay
A target group is the unit you actually operate: a set of targets (instances, IP addresses, Lambda functions, or an ALB behind an NLB) plus the health-check and traffic settings that decide which of them receive traffic. One load balancer can route to many target groups, and one target group's health-check settings apply to every target in it — which is why a bad health-check setting takes out the whole group at once.
Cross-zone load balancing controls whether a load balancer node in one AZ can send traffic to targets in another.
| ALB | NLB | |
|---|---|---|
| Default | On | Off (configurable on the load balancer or per target group) |
| Where it's set | Always on at the load balancer level; can be turned off per target group | On the load balancer, or overridden per target group |
| With it off | Each node spreads its share only across targets in its own AZ | Each node spreads its share only across targets in its own AZ |
| Inter-AZ data charges | None for cross-zone traffic when on | Cross-zone traffic is billed as inter-AZ data transfer |
With cross-zone off on an NLB, clients' DNS lookups spread traffic roughly evenly across the zones' nodes, so an AZ with fewer targets gives each of them more work: an AZ holding three targets while another holds nine leaves the three each carrying roughly three times the load of their peers. There are two fixes. Turn cross-zone on (which adds inter-AZ data charges), or keep the same number of targets in every enabled AZ — for example by letting a balanced Auto Scaling group place them — which costs nothing extra.
Deregistration delay (called connection draining on the Classic Load Balancer) is how a target leaves gracefully. A deregistered target enters the draining state: it gets no new requests, while in-flight requests have up to the configured delay to finish — 300 seconds by default, configurable from 0 to 3,600 seconds. When an Auto Scaling group scales in an instance attached to a target group, it waits for draining to finish before terminating it. Tune the value to the workload. Raise it above the longest legitimate request (long file transfers, streaming exports), or anything still running when the delay expires is cut off. Lower it to just above the longest request when every request finishes in seconds and deployments sit in draining for minutes for no reason.
ELB health checks: the settings that decide who gets traffic
ELB health checks are periodic probes that each load balancer node sends to every registered target, and their settings live on the target group:
- Protocol — HTTP or HTTPS for an ALB target group (ALB target groups have no TCP health check); TCP, HTTP or HTTPS for NLB and GWLB target groups.
- Port —
traffic-port(the default) probes each target on the port it was registered with, so the check follows the application if targets are re-registered on a new port. An explicit port number overrides that: if the application moves to a new port but the check still names the old one explicitly, every target fails even though the application is serving. - Path — a lightweight endpoint such as
/health. - Success codes (matcher) — 200 by default; an ALB accepts a list or range such as
200,302or200-399. Health checks don't follow redirects: a 3xx response is judged by its own status code against the matcher, so an application that redirects unauthenticated requests (for example to a sign-in page) fails a 200-only check while working normally. The cleaner fix is an unauthenticated health path that returns 200; the alternative is a matcher that also accepts the redirect status. - Interval, timeout and thresholds — the unhealthy threshold is the number of consecutive failures before a target is marked unhealthy; the healthy threshold is the number of consecutive successes before it is trusted again. Detection time is roughly interval × threshold: with a 10-second interval and an unhealthy threshold of 3, a crashed target leaves rotation about 30 seconds later, and with a healthy threshold of 5 it returns about 50 seconds after recovery.
What happens to an unhealthy target: the load balancer stops routing new requests to it but keeps probing, and traffic returns once it passes the healthy threshold. The load balancer itself never terminates or replaces anything. Replacement is the Auto Scaling group's job, and only if the group's health check type includes ELB; with the default EC2 status checks only, an instance with a dead application but a running VM stays in the fleet, unhealthy, indefinitely.
Fail open. When every target in an ALB target group is unhealthy, the ALB routes requests to all of them anyway rather than refusing traffic — so a broken health check alone often causes little user impact. Fail-open ends as soon as enough targets are healthy again, and from then on only the healthy targets get traffic. If targets recover gradually, the first few to pass absorb the whole load and may be overwhelmed before the rest catch up. The target group health settings control this: the unhealthy state routing threshold (default: a minimum of 1 healthy target; can be set as a count or a percentage) defines how many healthy targets are needed before the load balancer stops failing open. A related DNS failover threshold decides when a zone's load balancer node is taken out of DNS.
Debugging: all targets unhealthy after a deploy
When every target goes unhealthy at the same moment, in every AZ, the cause is a systemic mismatch between the health check and the application, not a problem with individual instances. Work this list:
- Path. Did the new version move or drop the health endpoint? A check against
/healththat now returns 404 fails every target. Curl the path from inside the VPC and read the actual status code. - Port and protocol. Is the health check set to an explicit port the application no longer listens on, instead of
traffic-port? Does the application now redirect HTTP to HTTPS (a 301 against a matcher of 200)? - Security groups. The instance security group must allow inbound traffic from the load balancer — best expressed by referencing the ALB's security group — on the health-check port. Security groups are stateful: replies to allowed inbound probes go out regardless of outbound rules, so editing outbound rules doesn't cause this. Rules on the client-facing side (the ALB's own inbound rules, or NACLs on the path from users) affect clients reaching the ALB, not target health.
- The application itself. A deploy-wide fault — bad configuration, a database login that fails at startup — that makes the application answer 500 everywhere is a genuine all-unhealthy.
Contrast with some targets unhealthy: that is instance-level (one host's crashed process, a full disk) or zonal, so you investigate the specific instance or AZ, not the target-group configuration.
Errors the load balancer generates itself point at where the fault is:
| Code | What it means | Typical cause |
|---|---|---|
| 502 Bad Gateway | The target sent a malformed response or closed or reset the connection | Crashed application, wrong port; intermittent 502s under light load when the target's keep-alive timeout is shorter than the ALB idle timeout, so the target closes a connection the ALB is about to reuse. Set the target's keep-alive timeout higher than the ALB idle timeout. |
| 503 Service Unavailable | No target to send the request to | The target group has no registered targets (the requests never appear in target logs). With registered but all-unhealthy targets, the ALB fails open instead. |
| 504 Gateway Timeout | The target didn't respond within the idle timeout | Slow requests: the ALB connection idle timeout defaults to 60 seconds and is configurable, so any request whose response takes longer than the idle timeout fails with a 504 at that point; raise the timeout, or move long-running work to an asynchronous job. |
| 403 Forbidden | Request blocked before routing | An AWS WAF web ACL associated with the ALB blocked it. |
Route 53 health checks: gating DNS answers
Route 53 health checks decide whether DNS gives out an answer at all: when the health check associated with a record fails, Route 53 stops returning that record and answers with the next-best healthy record instead. There are three types:
- Endpoint health checks probe an IP address or domain name over HTTP, HTTPS or TCP from Route 53 health checkers in several locations around the world. Route 53 combines their reports into one status: the endpoint is healthy if more than 18% of the checkers report it healthy. HTTP and HTTPS checks can add string matching: Route 53 searches the first 5,120 bytes of the response body for a string you specify, which catches an application that returns 200 with an error page. Choose a phrase that appears only in good responses.
- Calculated health checks combine other health checks: the parent check is healthy while at least a threshold number of its child checks are healthy, which expresses rules such as "the application is up if at least two of three endpoints are up."
- CloudWatch alarm health checks take their state from a CloudWatch alarm. Use them for private resources: Route 53 health checkers run outside your VPC and can probe only publicly reachable endpoints, so a private instance is monitored through its metrics and an alarm instead.
Failover routing is the active-passive pattern: a PRIMARY record with a health check, and a SECONDARY record (often a static site or a standby stack) that Route 53 serves only while the primary is unhealthy. How the primary gets its health depends on the record type:
| Alias record | Non-alias record (A, CNAME…) | |
|---|---|---|
| Points at | An AWS resource such as an ELB, CloudFront distribution or another record in the zone | A value you type, such as an EC2 instance's IP address |
| Health | Evaluate Target Health inherits the resource's health (an ALB is unhealthy when it has no healthy targets), with no separate health check | Needs an associated Route 53 health check; there is no target health to evaluate |
| TTL | You can't set one; Route 53 uses the target resource's TTL | You set it |
| Zone apex (example.com) | Allowed | A CNAME isn't allowed at the apex |
Because a CNAME can't sit at the zone apex, failover for example.com itself uses alias records with Evaluate Target Health (or an attached health check). A failover record that "never fails over" usually has neither a health check nor Evaluate Target Health on the primary.
Two layers of health checking: in-Region and cross-Region
Resilient environments use two layers of health checking, and each layer handles a different failure. Inside a Region, ELB is the layer. The standard highly available web tier is an Auto Scaling group (from a launch template, minimum of two instances) spanning two or more Availability Zones, registered with a load balancer whose nodes span the same AZs, with the group's health check type set to ELB. An instance fails → the load balancer stops routing to it after a few failed probes → the Auto Scaling group terminates and replaces it. An AZ fails → load balancer nodes in the surviving AZs keep serving, and the group launches capacity in the remaining zones. No DNS change is involved.
Two Auto Scaling timers interact with health checks. The health check grace period delays the group's first health evaluation of a new instance; if the application takes longer to bootstrap than the grace period, the group marks the instance unhealthy and replaces it before it is ready, over and over. Set the grace period longer than the real bootstrap time. The default instance warmup is different: it controls when a new instance's metrics start counting toward scaling decisions, and has nothing to do with health.
Across Regions, Route 53 is the layer. Failover records that alias each Region's load balancer, with Evaluate Target Health or a health check on each, move users to the secondary Region when the primary stops answering. DNS failover is slower: resolvers and clients keep using a cached answer until its TTL expires, so some users keep reaching the failed Region for a while after Route 53 switches. Keep TTLs low on failover records.
Each layer needs a different depth of health check:
| Shallow check | Deep check | |
|---|---|---|
| Tests | Only the local process on the instance | The instance plus its dependencies (database, cache, third-party APIs) |
| Use it for | The load balancer target group — removes crashed or hung instances | The Route 53 check on the Region — moves users away when the whole Region's stack is broken |
| Risk if misplaced | — | On a target group, one shared dependency's outage marks every target unhealthy at once |
Deliberate failover: ARC, Global Accelerator and Resilience Hub
Some failovers should be started by an operator, or should move traffic away from a zone that health checks still consider healthy. Amazon Application Recovery Controller (ARC) covers both cases:
| ARC feature | What it does | When to use it |
|---|---|---|
| Zonal shift | Moves an ALB's or NLB's traffic away from one Availability Zone for a period you set; the shift expires automatically unless you extend or cancel it. Targets in the shifted zone show an administrative override, separate from their health state. | Gray failures: latency or errors confined to one AZ while targets still pass health checks |
| Zonal autoshift | Authorizes AWS to start a zonal shift for the resource when AWS detects an AZ impairment | Recovery from AZ events without waiting for an operator |
| Region switch | A plan of ordered steps — for example scale up standby compute, promote a standby database, shift DNS — that an operator starts and ARC runs | Deliberate, rehearsed multi-Region failover |
| Routing controls | On/off switches that drive Route 53 health checks, so failover records follow the switch rather than an endpoint probe | Manually moving traffic between cells or Regions through DNS |
Zonal shift is off by default on ALBs and NLBs: you enable the zonal shift integration (a load balancer attribute) before you can start a shift. Plan for the capacity: the remaining zones must absorb the shifted traffic. ARC's older readiness check feature is no longer open to new customers, so new designs use the features in the table.
Two related services are easy to confuse with ARC:
- AWS Global Accelerator gives an application two static anycast IP addresses (global, not per AZ) and routes users over the AWS network to the nearest healthy Regional endpoint group. A traffic dial per endpoint group sets the percentage of traffic that group receives, so you can drain a Region without waiting for DNS caches to expire. ALB endpoints receive TCP only; UDP needs NLB or EC2 endpoints.
- AWS Resilience Hub assesses an application against the RTO and RPO you define and recommends improvements, alarms and recovery procedures. It does not perform failover.
Multi-AZ databases: RDS Multi-AZ, readable standbys, and read replicas
An RDS Multi-AZ DB instance deployment keeps a standby in a different Availability Zone, updated by synchronous replication: the primary doesn't acknowledge a write until the standby has it. When the primary or its AZ fails (or during some maintenance), RDS fails over automatically, typically in 60–120 seconds: it promotes the standby and points the DB endpoint's DNS name at it. The standby is never readable — it serves no queries and adds no capacity.
| Multi-AZ DB instance | Multi-AZ DB cluster | Read replica | |
|---|---|---|---|
| Purpose | Availability | Availability plus read capacity | Read scaling (and a DR copy) |
| Standbys / copies | One standby, not readable | Two readable standbys in separate AZs | Readable copies, same or other AZ or Region |
| Replication | Synchronous | Semisynchronous (a write is acknowledged once one standby has it) | Asynchronous |
| Failover | Automatic, same endpoint, typically 60–120 s | Automatic, typically under 35 s | None — promotion is a manual operator action |
| Read endpoint | — | Reader endpoint spreads reads across the standbys | Each replica's own endpoint |
Two corrections to common assumptions. A read replica in another AZ does not make an instance Multi-AZ: replication is asynchronous and nothing promotes it automatically. To offload reporting from a Multi-AZ DB instance without changing its deployment type, add a read replica and point the reports at the replica's endpoint. And RDS Proxy read-only endpoints route only to reader instances of an Aurora cluster or an RDS Multi-AZ DB cluster, so they can't make a Multi-AZ DB instance deployment's standby readable. Multi-AZ DB clusters are available for RDS for MySQL and RDS for PostgreSQL.
The client side of a failover. Failover changes the IP address behind the endpoint name, so applications must connect by endpoint name (never a stored IP address) and must not cache DNS for long. RDS recommends a DNS cache TTL of less than 30 seconds for clients that cache. Java is the usual problem: the JVM caches lookups according to networkaddress.cache.ttl. Current JDKs default to about 30 seconds, but older JVMs running with a security manager cached successful lookups forever, and some applications set a long or infinite value explicitly; either way the application keeps connecting to the old primary until it restarts. Set that property to a short value.
Cache-tier failover: ElastiCache endpoints and engines
The cache tier needs failover too, because losing a cache sends its full read load to the database. For Valkey or Redis OSS, a replication group with replicas in other AZs and Multi-AZ enabled promotes a replica automatically when the primary node fails. The application recovers only if it connects through the right endpoint:
| Endpoint (cluster mode disabled) | Behaviour | Use it for |
|---|---|---|
| Primary endpoint | Always resolves to the current primary, following failover | Writes |
| Reader endpoint | Spreads connections across the replicas | Reads |
| Node endpoints | Fixed to one node; don't move on failover | Not for application writes — after failover the old primary is a read-only replica, so writes fail with READONLY errors |
A configuration endpoint exists only for cluster-mode-enabled (sharded) clusters. Memcached behaves differently: a node-based Memcached cluster has no replication and no failover, so losing a node loses that node's data. ElastiCache Serverless for Memcached does replicate data across AZs. When a cache must survive node or AZ loss, use a Valkey or Redis OSS replication group with Multi-AZ, or a serverless cache.
Static stability: automatic failover vs ops action, and single-AZ traps
Static stability means an environment survives an Availability Zone failure without changing anything or launching anything at the moment of failure: the surviving capacity and network paths are already in place. Start by knowing what recovers by itself. Automatic: a load balancer stops routing to failed targets and AZs; an Auto Scaling group replaces failed instances; RDS Multi-AZ promotes its standby; a Valkey or Redis OSS replication group with Multi-AZ promotes a replica; zonal autoshift moves load balancer traffic. Operator action required: promoting an RDS read replica; repointing a DNS record that has no health check; launching capacity that wasn't pre-provisioned. If the recovery path includes a human step, the design isn't fault tolerant as described.
Capacity math. If launching instances during an AZ event can't be relied on, pre-provision enough that the surviving zones carry peak load alone: with N zones, run peak ÷ (N − 1) in each. For example, a tier that needs 8 instances at peak across three AZs runs 4 per AZ (12 in total), so losing one zone still leaves 8.
Then look for single-AZ dependencies, because one shared component can undo an otherwise Multi-AZ design. The classic trap is a single zonal NAT gateway: a standard (zonal) NAT gateway lives in one AZ, so if every private subnet routes through it and that AZ fails, healthy instances in the other AZs lose outbound internet access. There are two statically stable fixes:
| Zonal NAT gateway per AZ | Regional NAT gateway (2025) | |
|---|---|---|
| Layout | One gateway in each AZ's public subnet; each AZ's private route table points at its local gateway | One gateway ID that expands automatically into each AZ where you have workloads; no public subnet needed |
| Operations | Add a gateway and route for every new AZ | Same route for subnets in every AZ; expanding into a new AZ can take up to about an hour, and traffic is served from another zone meanwhile |
| Limit | Supports private NAT | No private NAT; use zonal gateways for that |
The same logic applies to VPC interface endpoints: place an endpoint network interface in each AZ your workload uses. Deeper subnet and routing mechanics belong to the networking domain; here, the skill is finding the shared single-AZ component and removing it.
Tip. Task 2.2 questions describe a failure symptom or a resilience requirement and ask for the cause or the design that meets it. Read the symptom carefully: every target unhealthy at once points at health-check configuration, security groups or an application-wide fault, while one zone misbehaving behind passing health checks is a zonal problem; the status code and whether requests reach the targets locate the fault. Expect to distinguish what recovers automatically (ELB routing, Auto Scaling replacement, RDS Multi-AZ, ElastiCache Multi-AZ, zonal autoshift) from what needs an operator (promoting a read replica, starting a Region switch plan). Expect near-twin comparisons — Multi-AZ DB instance vs DB cluster vs read replica, alias vs CNAME, grace period vs instance warmup, primary vs reader vs node endpoints — and at least one architecture hiding a single-AZ dependency or a capacity shortfall.
- UDP, a static IP per AZ or PrivateLink → NLB; path, host or header routing → ALB; transparent appliance insertion → Gateway Load Balancer. An NLB can front an ALB through an ALB-type target group.
- ALB listener rules run from the lowest priority number, first match wins; one HTTPS listener serves many domains with SNI certificates and host-header rules.
- Use traffic-port for the health-check port; an explicit port keeps probing the old port after the application moves. Health checks don't follow redirects — widen the matcher (e.g. 200-399) if needed.
- When every target is unhealthy, the ALB fails open to all of them; once targets recover, only the healthy ones get traffic, as set by the unhealthy state routing threshold.
- 502 = bad response or closed connection (check keep-alive vs idle timeout); 503 = no registered targets; 504 = target exceeded the idle timeout (60 s default); 403 = AWS WAF block.
- Route 53 health checkers live outside your VPC — use CloudWatch alarm health checks for private resources; Evaluate Target Health works only on alias records, which also serve the zone apex.
- Shallow health checks for the load balancer, deep dependency-aware checks for Route 53 Regional failover; ARC zonal shift handles gray failures in one AZ.
- RDS Multi-AZ standby: synchronous, never readable, automatic failover; Multi-AZ DB cluster: two readable standbys and a reader endpoint; read replicas: asynchronous, promoted manually.
- Connect to databases and caches by endpoint name and keep DNS caching short; write to the ElastiCache primary endpoint, read from the reader endpoint.
- Static stability: peak ÷ (N − 1) instances per AZ, and no single zonal NAT gateway — use one per AZ or a regional NAT gateway.
Frequently asked questions
Why are all my ALB targets showing unhealthy?
When every target fails at once, the cause is systemic, not instance-level. Check the health-check path (does it still exist and return a success code on the new version?), the health-check port (is it an explicit port the application no longer uses instead of traffic-port?) and protocol (is the application redirecting?), the instance security group (does it allow inbound traffic from the load balancer's security group on the check port?), and the application itself (is it returning 500 everywhere after a bad deploy?). While every target is unhealthy, the ALB fails open and still sends them traffic.
What is the difference between an ALB and an NLB?
An Application Load Balancer works at layer 7: it understands HTTP and routes by path, host, headers or query string to different target groups, and it serves several domains on one listener using SNI. A Network Load Balancer works at layer 4: it forwards TCP, UDP and TLS flows with very high performance, offers a static IP per AZ with Elastic IP support, preserves the client source IP, and can back a PrivateLink endpoint service. An NLB can also forward to an ALB to combine static IPs with layer-7 routing.
Can I read from the standby in an RDS Multi-AZ deployment?
Not in a Multi-AZ DB instance deployment: its standby is synchronously replicated but serves no traffic. A Multi-AZ DB cluster deployment has two readable standbys behind a reader endpoint and typically fails over in under 35 seconds. To offload reads from a Multi-AZ DB instance without changing its deployment type, create a read replica, which is asynchronous and must be promoted manually.
How do Route 53 health checks work with private resources?
Route 53 endpoint health checkers probe from locations outside your VPC, so they can only reach publicly accessible endpoints. To gate DNS on the health of a private resource, monitor it with CloudWatch metrics, create an alarm on the failure condition, and create a Route 53 health check that takes its state from that alarm.
What is Evaluate Target Health on a Route 53 alias record?
It's an alias-record setting that makes the record inherit the health of the AWS resource it points at, without a separate Route 53 health check. An alias to an ALB with Evaluate Target Health on is unhealthy when the load balancer has no healthy targets, so a failover record set switches to the secondary. Non-alias records, such as an A record holding an instance IP, need an attached health check instead. Alias records are also the only way to point the zone apex at a load balancer, because a CNAME isn't allowed there.
What happens when a load balancer target fails its health check?
After the unhealthy threshold of consecutive failures, the load balancer marks the target unhealthy and stops sending it new requests, but keeps probing it; after the healthy threshold of consecutive successes, traffic resumes. The load balancer never replaces a target. Replacement happens only if an Auto Scaling group manages the instance and its health check type includes ELB.
Why does my ALB return intermittent 502 errors when every target is healthy?
A common cause is a target keep-alive timeout shorter than the ALB's connection idle timeout (60 seconds by default). The target closes an idle connection just as the ALB reuses it, and the ALB returns 502 for that request. Set the application server's keep-alive timeout higher than the ALB idle timeout. Consistent 504s, by contrast, mean requests take longer than the idle timeout.
How do I move traffic away from one impaired Availability Zone?
Start an Amazon Application Recovery Controller (ARC) zonal shift on the ALB or NLB. It stops new traffic to that zone for a period you set and expires automatically unless extended or cancelled. Zonal shift must first be enabled on the ALB or NLB, and zonal autoshift lets AWS start the shift for you when it detects an AZ impairment. It is the tool for gray failures that health checks don't catch.
Source
This lesson covers the "Reliability and Business Continuity" domain of the official SOA-C03 exam guide. Vendors revise their guides — check the source for the current version.
- AWS Certified CloudOps Engineer – Associate (SOA-C03) exam guide — Amazon Web Services
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.