TL;DR: NAT Gateways are the most expensive "default" choice in AWS VPC design: ~$32/month per gateway per AZ regardless of traffic (a 3-AZ VPC is $96/month before a byte flows), plus $0.045/GB processed on top. There's no "smaller" version — the only knob is exists-or-not. Trusted Advisor lists the ones live 30+ days with near-zero traffic; delete them, release the EIP underneath, and for VPCs whose egress is mostly to AWS services, replace NAT with VPC Endpoints entirely.
The numbers
- ~$32/month per NAT per AZ, traffic-independent — a mature account with 5–10 VPCs easily carries 20–30 NAT Gateways = $600–1,000/month in hourly charges alone.
- Data processing adds $0.045/GB on top — often the dominant cost for ECR- or CloudWatch-Logs-heavy workloads.
- VPC Endpoints: gateway endpoints (S3, DynamoDB) are free; interface endpoints are ~$7.20/month per AZ + $0.01/GB — cheaper than NAT when they let you delete it or slash data processing.
- Typical finding: 5–15 unutilized NAT Gateways = $200–500/month recovered by deletion; endpoint replacement adds $100–500/month more.
- Field examples: a 7-VPC company deleted 11 NATs (abandoned + over-provisioned) for $320/mo ($3,840/yr) and cut VPCs 7→4; an ECR-heavy CI pipeline dropped NAT data from 3 TB to ~200 MB/month with 3 interface endpoints + the free S3 gateway endpoint (~$1,200/yr plus a security-audit win).
Do this
- Confirm the VPC is truly idle — no live EC2/Lambda/ECS/RDS needing egress (
describe-instances --filters Name=vpc-id,...); an empty VPC's NAT has no caller. - Delete the NAT, then release its Elastic IP — the EIP doesn't auto-release and would bill ~$3.65/month as unassociated; clean up dangling route-table entries too.
- Drop non-prod to single-AZ NAT — dev/staging/sandbox tolerate an AZ outage; match NAT AZ-redundancy to the workload's own redundancy (multi-AZ NAT for a single-AZ workload is wasted).
- Replace AWS-service egress with VPC Endpoints — read VPC Flow Logs on the NAT ENI to classify destinations; deploy free gateway endpoints (S3, DynamoDB) and interface endpoints (ECR, CloudWatch Logs, SSM), then delete NAT if no non-AWS egress remains.
- Fix cross-VPC-through-NAT traffic — two same-Org VPCs talking via the internet should use peering or Transit Gateway, not pay NAT egress + ingress.
Gotchas
- The EIP is the forgotten cost — deleting the NAT leaves the Elastic IP billing; always release it.
- Route tables persist after deletion — stale routes to a deleted NAT break traffic on redeploy; clean them up.
- Re-pointing a subnet to a NAT in another AZ adds cross-AZ transfer (~$0.01/GB) — factor it when consolidating.
- NAT Gateways can't be paused (unlike RDS) — delete is full delete, recreate gets a new IP unless you re-assign the EIP.
- Legacy NAT instances aren't flagged — this check covers managed NAT Gateways only.
Skip this if
- The NAT serves genuine ongoing non-AWS egress (a bastion fetching updates, an agent posting to an external SaaS) and $32/month is acceptable for the value — keep it, but still add free gateway endpoints for any S3/DynamoDB traffic.
- It's a production VPC with critical egress-dependent HA needs — keep per-AZ NAT, but only in the AZs you actually deploy to. Structural follow-ups: NAT Gateway Consolidation, VPC Gateway Endpoints (free, S3/DynamoDB), and VPC Endpoints; after deletion, sweep leftover EIPs with Trusted Advisor — Unassociated Elastic IPs. Parent: Trusted Advisor Cost Optimization.