Cloud Cost Analyzer flags idle NAT Gateways using bidirectional traffic and connection metrics (not just a single counter), estimates the monthly waste for each, and points out traffic that a gateway endpoint could carry for free.
$ cca scan --provider awsRead-only, runs in about 5 minutes. Free tier, no credit card.
Read the deep dive: Idle NAT Gateways: the quiet line item →
A NAT Gateway is billed at about $0.045 per hour, which is roughly $32 per month per gateway, plus a per-gigabyte data-processing charge (about $0.045/GB) on all traffic that passes through it. Running one per Availability Zone multiplies the hourly cost.
Add free S3 and DynamoDB gateway VPC endpoints so that traffic to those services bypasses the NAT Gateway entirely. For other traffic, consolidate gateways and remove any that are idle.
If no instances in the private subnets need outbound internet, deleting the gateway only removes the charge. Confirm there is no active outbound traffic first. Cloud Cost Analyzer identifies gateways with no meaningful traffic so you can verify before removing them.
Over-provisioned classes, non-Graviton, and Multi-AZ on non-prod.
Orphaned volumes, old snapshots, and gp2 you never moved to gp3.
ALBs and NLBs with no targets or near-zero traffic, still billing.
Cold data sitting in Standard with no lifecycle policy.
Idle and oversized instances, previous-gen types, 24/7 dev boxes.
Oversized instances, Serverless v1, and I/O-Optimized breakevens.
Idle cache clusters and oversized, non-Graviton nodes.
Idle distributions and price classes wider than your audience.
On-demand billing on steady workloads, and unused indexes.
Over-provisioned memory and x86 functions that could be arm64.