Back to Checks
RDS instance has Multi-AZ enabled
rds_instance_multi_az
Service: rdsSeverity: medium
OfficialBuilt-inVerified
Categories:resilience
Resource Type:AwsRdsDbInstance
RDS DB instances are evaluated for Multi-AZ configuration, either enabled on the instance or inherited from the associated DB cluster.
Risk
Without Multi-AZ, an Availability Zone or instance failure can cause extended downtime and rely on restores, risking loss of recent writes. This degrades availability and may affect integrity, interrupting applications and breaching SLAs.
Run this check with Prowler
Run in Prowler CloudRun
prowler aws --checks rds_instance_multi_azRecommendation
Apply fault-tolerance and redundancy principles: enable Multi-AZ for production RDS workloads. Choose one standby or two readable standbys based on RTO/RPO and performance needs. Regularly test failover, monitor configuration drift, and allow exceptions only with documented, risk-based approval.
Remediation
CLI
aws rds modify-db-instance --db-instance-identifier <db_instance_id> --multi-az --apply-immediatelyTerraform
# Enable Multi-AZ on an RDS DB instance
resource "aws_db_instance" "example" {
multi_az = true # Critical: enables Multi-AZ to pass the check
}NativeIaC
# CloudFormation: enable Multi-AZ on an existing RDS DB instance
Resources:
RDSInstance:
Type: AWS::RDS::DBInstance
Properties:
MultiAZ: true # Critical: enables Multi-AZ to pass the checkOther
1Open the AWS Management Console and go to RDS > Databases
2Select the affected DB instance and click Modify
3Under Availability & durability, set Multi-AZ deployment to Enabled (create a standby)
4Check Apply immediately
5Click Continue, then Modify DB instance
6Wait until status is Available and Multi-AZ shows Yes
Check Code
from prowler.lib.check.models import Check, Check_Report_AWS
from prowler.providers.aws.services.rds.rds_client import rds_client
class rds_instance_multi_az(Check):
def execute(self):
findings = []
for db_instance in rds_client.db_instances.values():
report = Check_Report_AWS(metadata=self.metadata(), resource=db_instance)
# Check if is member of a cluster
if db_instance.cluster_id:
if (
db_instance.cluster_arn in rds_client.db_clusters
and rds_client.db_clusters[db_instance.cluster_arn].multi_az
):
report.status = "PASS"
report.status_extended = f"RDS Instance {db_instance.id} has multi-AZ enabled at cluster {db_instance.cluster_id} level."
else:
report.status = "FAIL"
report.status_extended = f"RDS Instance {db_instance.id} does not have multi-AZ enabled at cluster {db_instance.cluster_id} level."
else:
if db_instance.multi_az:
report.status = "PASS"
report.status_extended = (
f"RDS Instance {db_instance.id} has multi-AZ enabled."
)
else:
report.status = "FAIL"
report.status_extended = (
f"RDS Instance {db_instance.id} does not have multi-AZ enabled."
)
findings.append(report)
return findings