Skip to main content
compliance · aws

Production RDS instances running without Multi-AZ

resource types
1
rule IDs covered
1
severity
high

What does ZopNight detect here?

ZopNight raises this finding only for running, standard-engine RDS instances (MySQL, MariaDB, PostgreSQL, SQL Server, Oracle) whose discovered Multi-AZ flag is false and which look like production. Aurora, DocumentDB and Neptune are excluded because their HA lives at the cluster layer, and dev/test databases are suppressed because Multi-AZ costs roughly 2x.

Signal and threshold

How ZopNight evaluates Production RDS instances running without Multi-AZ.
Field Value
Rule IDsRC-005
Categorycompliance
Severityhigh
Metricnone — pure configuration read
Sourcerds_single_az.go

Engines where the flag means something

The per-instance Multi-AZ setting this rule reads belongs to standard RDS engines: MySQL, MariaDB, PostgreSQL, SQL Server and Oracle. Aurora is deliberately excluded: its availability story lives at the cluster and storage layer, and a per-instance Multi-AZ flag on an Aurora member is meaningless. DocumentDB and Neptune are excluded for the same reason. The engine check fails closed: an absent or unrecognized engine produces no finding, because a resilience recommendation aimed at the wrong engine family is worse than none.

Why dev and test databases are filtered out

Multi-AZ runs a synchronized standby in a second availability zone, which roughly doubles the hourly instance rate. Recommending that for a throwaway database is recommending waste. In one audited fleet, 37 of 50 raw findings from this check were uat, sit or qa instances. The rule now suppresses instances that are dev/test by name or by environment tag, unless a production environment tag explicitly overrides the name. A production tag always wins; a prod-looking name with no contradicting signal still fires.

What actually triggers a finding

A running (available) RDS instance, on a standard engine, whose discovered Multi-AZ flag is false, and which passes the production gate. The flag is provider state captured from the RDS DescribeDBInstances API. When it is present and true, the instance is already protected and the rule is silent. Note the asymmetry: an absent flag fails to suppress (the instance may genuinely be Single-AZ), but the evidence shown with the finding only asserts “Multi-AZ: disabled” when the flag was actually observed as false.

What this finding is worth

Nothing, in dollars. This is a compliance finding, and the fix adds spend rather than removing it. What you buy with the roughly 2x instance cost is surviving an availability-zone failure with an automatic failover instead of an outage, plus maintenance events that become failovers rather than downtime.

Enumerate your Single-AZ estate

Terminal window
aws rds describe-db-instances \
--query "DBInstances[?MultiAZ==\`false\`].[DBInstanceIdentifier,Engine,DBInstanceStatus]" \
--output table

Cross off anything genuinely non-production; what remains is the exposure list.

Enabling it

Modify the instance in the RDS console and enable Multi-AZ deployment, applying during the next maintenance window (or immediately if the exposure justifies it). Budget for the cost delta first. The production gate exists because this control is only worth 2x on databases whose downtime costs more than the standby does.

See it fire on your bill.

Connect an account read-only. The first findings land in minutes.

417 rule families across 353 resource types on 22 platforms. Every threshold, metric, and IAM action is documented on these pages before you grant anything.

417 rule families documented
353 resource types covered
read-only default access level
Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console· Multi-cloud automation· Production-ready in 30 min· SOC 2 · ISO 27001· 20–60% off the bill, first month· 4 platforms · 1 console·