AWS Security Hub · ELB
ELB.13: A single-AZ load balancer is a data-plane single point of failure
Written and reviewed by Emnode · Last reviewed
What does AWS Security Hub ELB.13 check?
ELB.13 fails when an Application, Network or Gateway Load Balancer (ELBv2) is configured with subnets in fewer than two Availability Zones. Classic Load Balancers are out of scope here; they are covered by the separate ELB.10 control. The control checks the load balancer's own AZ footprint, not that of its targets.
Why does ELB.13 matter?
Multi-AZ compute is meaningless if every request first passes through a load balancer pinned to one zone. When that AZ has a network or power event, the entire data plane goes dark regardless of how healthy your targets in other zones are. The December 2021 us-east-1 single-AZ failure took down major services for exactly this reason: resilient fleets behind single-AZ hops.
How do I fix ELB.13?
- Audit each load balancer's enabled AZs with describe-load-balancers.
- Add subnets in additional AZs online with set-subnets (ALB/NLB/GWLB); the change adds nodes without dropping existing connections.
- Confirm each new AZ has healthy registered targets so the added node can serve traffic.
- Enforce a minimum of two AZs in your IaC and with a Config rule so the finding does not recur.
Remediation script · bash
# Fix the highest-impact data stores first: enable Multi-AZ on production databases.
for db in $(aws rds describe-db-instances \
--query 'DBInstances[?MultiAZ==`false` && DBClusterIdentifier==null].DBInstanceIdentifier' --output text); do
aws rds modify-db-instance --db-instance-identifier "$db" \
--multi-az --apply-immediately
echo "$db: standby being provisioned in a second AZ"
done
# Span a stateless compute fleet across three AZs, then mirror the set on its load balancer.
aws autoscaling update-auto-scaling-group --auto-scaling-group-name web-tier-asg \
--vpc-zone-identifier "subnet-0aaa1,subnet-0bbb2,subnet-0ccc3"
aws elbv2 set-subnets --load-balancer-arn "$ALB_ARN" \
--subnets subnet-0aaa1 subnet-0bbb2 subnet-0ccc3 Full walkthrough (console steps, edge cases and verification) in the lesson Deploy across multiple Availability Zones.
Is ELB.13 a false positive?
ELB.13 checks for registered targets in at least minAvailabilityZones zones (default two), not just enabled subnets, so a load balancer can be wired into two AZs and still fail simply because every healthy target currently happens to live in one zone, for example during a scale-in, a deploy that drained one AZ, or an Auto Scaling group that has not yet placed instances in the second zone. That is often a transient state that self-heals as capacity rebalances. A truly intentional single-AZ ELBv2 also exists: an internal load balancer fronting a zonal service, or a dev environment deliberately kept to one AZ for cost. For the deliberate cases, document the exception and set the finding to SUPPRESSED rather than padding the fleet; for the transient ones, confirm targets have rebalanced before treating the finding as real.
More ELB controls
- ELB.1 ALB serves HTTP without redirecting to HTTPS
- ELB.2 CLB SSL/HTTPS listeners should use ACM certs
- ELB.3 CLB listeners should use HTTPS/TLS termination
- ELB.4 ALB accepts malformed HTTP headers
- ELB.5 Load balancers are not writing access logs
- ELB.6 Load balancers can be deleted by accident
- ELB.7 CLBs should have connection draining
- ELB.8 CLB SSL listeners should use strong policy
- ELB.9 CLBs should have cross-zone balancing
- ELB.10 CLBs should span multiple AZs
- ELB.12 ALB desync mitigation mode
- ELB.14 CLB desync mitigation mode