Skip to main content
emnode
Compliance Medium severity

AWS Security Hub · Redshift

Redshift.16: Redshift subnet groups should span multiple AZs

Written and reviewed by Emnode · Last reviewed

What does AWS Security Hub Redshift.16 check?

Redshift.16 evaluates the cluster subnet group and fails when its subnets all live in a single Availability Zone. A cluster draws its node placement from this named subnet group, so a single-AZ group pins the whole warehouse to one zone.

Why does Redshift.16 matter?

A single-AZ subnet group is a latent resilience gap nobody notices until an AZ has a bad day, when a power event or network partition then leaves no in-region path to keep serving queries. It also blocks the features that depend on multiple zones: you cannot stand up a meaningful Multi-AZ deployment (Redshift.18) on a single-AZ subnet group.

How do I fix Redshift.16?

  1. Add subnets from at least two Availability Zones to the cluster subnet group.
  2. Ensure those subnets have the routing and capacity the cluster needs.
  3. Use the multi-AZ subnet group when building new clusters, and plan migration for existing ones.
  4. Default subnet groups to span multiple AZs in your IaC so the gap doesn't 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 Redshift.16 a false positive?

A subnet group can be deliberately pinned to a single Availability Zone for legitimate reasons (a dev or analytics cluster kept in one AZ to avoid cross-AZ data-transfer charges, or a workload co-located in a specific zone for latency or data-residency reasons) and it will fail this resilience control even though that placement is the intended trade-off. The control evaluates the cluster subnet group, not the cluster's criticality, so it can't tell a throwaway warehouse from a production one. Where single-AZ is a conscious decision, capture it as a documented exception (a Security Hub suppression rule scoped by tag, with the owner and review date) rather than adding subnets you don't actually want; reserve real remediation for any production warehouse where a single-AZ subnet group is an oversight, since it also blocks a meaningful Multi-AZ deployment (Redshift.18).

Part of the learning path Tighten your databases
  • Redshift.1 A Redshift cluster is publicly accessible
  • Redshift.2 Connections to Redshift should be encrypted in transit
  • Redshift.3 Redshift clusters should have automatic snapshots
  • Redshift.4 Redshift clusters should have audit logging
  • Redshift.6 Redshift should auto-upgrade major versions
  • Redshift.7 Redshift clusters should use enhanced VPC routing
  • Redshift.8 Redshift should not use the default admin username
  • Redshift.10 Redshift clusters should be encrypted at rest
  • Redshift.15 Redshift accepts cluster-port traffic from anywhere
  • Redshift.18 Redshift clusters should have Multi-AZ enabled