Back to Checks
ELBv2 load balancer is configured across multiple Availability Zones
elbv2_is_in_multiple_az
Service: elbv2Severity: medium
OfficialBuilt-inVerified
Categories:resilience
Resource Type:AwsElbv2LoadBalancer
ELBv2 load balancers (Application, Network, or Gateway) are assessed for distribution across multiple Availability Zones. The finding indicates whether each load balancer spans at least the configured minimum number of AZs (default 2).
Risk
Limiting a load balancer to one AZ introduces a single point of failure. An AZ outage, zonal degradation, or imbalanced target capacity can cause downtime, dropped connections, and deployment risk, undermining service availability and resiliency.
Run this check with Prowler
Run in Prowler CloudRun
prowler aws --checks elbv2_is_in_multiple_azRecommendation
Operate each load balancer across at least two AZs and ensure every enabled AZ has healthy, scaled targets.
- Distribute capacity per AZ; use autoscaling
- Keep health checks effective
- Consider cross-zone load balancing to absorb bursts
- Regularly test failover
Remediation
CLI
aws elbv2 set-subnets --load-balancer-arn <LOAD_BALANCER_ARN> --subnets <SUBNET_ID_A> <SUBNET_ID_B>Terraform
# Ensure ELBv2 spans at least two Availability Zones
resource "aws_lb" "<example_resource_name>" {
subnets = [
"<subnet_id_a>", # critical: add a second AZ/subnet
"<subnet_id_b>" # critical: ensures the load balancer spans >=2 AZs
]
}NativeIaC
# CloudFormation: ensure the ELBv2 spans at least two AZs by specifying two subnets
Resources:
<example_resource_name>:
Type: AWS::ElasticLoadBalancingV2::LoadBalancer
Properties:
Subnets:
- <subnet_id_a> # critical: add a second AZ/subnet
- <subnet_id_b> # critical: ensures the load balancer spans >=2 AZsOther
1Open AWS Console > EC2 > Load Balancers
2Select the load balancer
3Go to the Network mapping tab and click Edit subnets
4Enable at least two Availability Zones by selecting one subnet in each of two AZs
5Click Save changes
Check Code
from typing import List
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.elbv2.elbv2_client import elbv2_client
class elbv2_is_in_multiple_az(Check):
def execute(self) -> List[Check_Report_AWS]:
findings = []
elbv2_min_azs = elbv2_client.audit_config.get("elbv2_min_azs", 2)
for lb in elbv2_client.loadbalancersv2.values():
report = Check_Report_AWS(metadata=self.metadata(), resource=lb)
report.status = "FAIL"
report.status_extended = f"ELBv2 {lb.name} is not in at least {elbv2_min_azs} AZs. Is only in {', '.join(lb.availability_zones.keys())}."
if len(lb.availability_zones) >= elbv2_min_azs:
report.status = "PASS"
report.status_extended = f"ELBv2 {lb.name} is at least in {elbv2_min_azs} AZs: {', '.join(lb.availability_zones.keys())}."
findings.append(report)
return findingsReferences
- https://docs.aws.amazon.com/elasticloadbalancing/latest/network/availability-zones.html
- https://www.trendmicro.com/trendaivisiononecloudriskmanagement/knowledge-base/aws/ELBv2/enable-multi-az.html
- https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/how-elastic-load-balancing-works.html#availability-zones