Skip to main content
idle · aws

NAT Gateways passing no traffic

resource types
1
rule IDs covered
1
severity
medium

What does ZopNight detect here?

A NAT Gateway costs roughly $32 a month before a single byte crosses it. ZopNight checks four byte-counter metrics plus ActiveConnectionCount over 30 days, and reports the full cost as recoverable when all of them are flat. An unused gateway has no partial value.

Signal and threshold

How ZopNight evaluates NAT Gateways passing no traffic.
Field Value
Rule IDsRC-011
Categoryidle
Severitymedium
Metricnone — pure configuration read
Sourceidle_nat.go

The hourly charge is the point

NAT Gateway pricing has two parts: about $0.045 per hour just to exist, plus a per-GB data processing charge on top. The hourly part is roughly $32 a month and accrues whether or not anything routes through it. That is what makes an unused gateway worth finding: a fixed cost with zero utilisation, not a variable one that scales down on its own.

Why five metrics

Traffic can flow in four directions and the rule checks all of them, using the byte counters a NAT Gateway publishes to CloudWatch: BytesInFromSource, BytesOutToDestination, BytesInFromDestination and BytesOutToSource. A gateway serving a one-way workload would look idle on two of those and busy on the others.

ActiveConnectionCount is the fifth axis, and it catches a gateway holding open connections that are transferring almost nothing. Such a gateway is present, but not moving bytes.

All five flat across 30 days is the bar.

Where these come from

Almost always a multi-AZ VPC built from a template. The pattern puts one NAT Gateway per availability zone for resilience, which is correct for production and expensive in a development VPC where nothing routes through two of the three.

The other common source is a private subnet that was given a NAT route for an outbound dependency that later moved to a VPC endpoint. The endpoint is cheaper and the gateway stays.

Reading BytesOutToDestination for the gateway

Terminal window
aws cloudwatch get-metric-statistics \
--namespace AWS/NATGateway --metric-name BytesOutToDestination \
--dimensions Name=NatGatewayId,Value=nat-0123456789abcdef0 \
--start-time "$(date -u -v-30d +%Y-%m-%dT%H:%M:%SZ)" \
--end-time "$(date -u +%Y-%m-%dT%H:%M:%SZ)" \
--period 86400 --statistics Sum

Before deleting

Check the route tables that point at it. Deleting a NAT Gateway with a live route leaves a blackhole route behind, and instances in that subnet lose outbound access with no obvious cause. Remove the route first, confirm nothing breaks, then delete the gateway and release its Elastic IP, which otherwise keeps billing on its own.

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·