AWS NAT Gateway Billing Traps: How Silent Cross-AZ Egress Costs SaaS MVPs $2,500/Month
Why standard AWS VPC configurations trigger massive NAT Gateway data processing bills, how cross-AZ traffic silently doubles transfer fees, and the zero-cost VPC endpoint architecture that eliminates the bleed.
AWS NAT Gateways silently inflate monthly startup cloud invoices by combining an hourly baseline charge with a $0.045 per-gigabyte data processing fee on every packet leaving your private virtual network.
Look, I evaluated an AWS production invoice last month for an early-stage B2B SaaS startup whose runway was unexpectedly shrinking. Their core application was modest: twelve container tasks running on Amazon ECS, a managed PostgreSQL instance on RDS, and roughly 450 daily active enterprise users.
Their compute costs were completely reasonable: around $280 per month for EC2 instances. But their total monthly AWS bill was over $3,400.
When we opened AWS Cost Explorer, a single line item dominated 78% of their cloud spend: Amazon Virtual Private Cloud - NatGateway-Bytes.
The team had followed a standard architectural guide from 2021: “Put all your compute tasks in private subnets and route all outbound traffic through an AWS NAT Gateway for security.”
Nobody calculated what happens when those background containers stream 40 terabytes of database backups to Amazon S3, proxy OpenAI API completions, and fetch third-party webhooks through that single managed gateway.
Here is the exact billing mechanics behind the AWS NAT Gateway trap, the napkin math of runaway data transfer, and how we restructured their VPC routing to eliminate over $2,500 every month without sacrificing network isolation.
The Billing Anatomy of an AWS NAT Gateway
AWS NAT Gateways charge customers across three distinct billing dimensions simultaneously: fixed hourly uptime, per-gigabyte data processing, and cross-AZ transit.
When you provision a standard AWS NAT Gateway in a single region, AWS bills the following baseline fees:
- Fixed Gateway Hourly Uptime: $0.045 per hour per NAT Gateway (~$32.40 per month per Availability Zone). If you deploy across three Availability Zones for high availability, your fixed idle baseline is $97.20 per month before transmitting a single byte.
- NAT Gateway Data Processing Surcharge: $0.045 per gigabyte for all traffic that passes through the gateway. This applies symmetrically: you pay $0.045/GB on data sent out, and $0.045/GB on the response payload received back.
- Cross-AZ Data Transfer Penalty: If an ECS task or Lambda function in Availability Zone
us-east-1asends traffic through a NAT Gateway located inus-east-1b, AWS assesses an additional $0.01 per GB inter-zone transit charge in each direction. - Standard Internet Egress: Standard internet data transfer out ($0.09/GB for the first 10 TB after the initial free tier).
When combined, streaming 10 terabytes of data through a NAT Gateway in another Availability Zone does not cost the standard $0.09/GB internet fee. It costs:
$0.045 (NAT Processing) + $0.01 (Cross-AZ Send) + $0.01 (Cross-AZ Receive) + $0.09 (Internet Egress) = $0.155 per GB
That is a 72% price markup applied silently on top of raw bandwidth charges.
The Napkin Math: The 3 Silent Bandwidth Leaks
Most startups never realize their backend workloads are routing massive internal payloads through their public NAT gateway.
Let us do the napkin math on where that 40 TB of traffic actually originated in our client’s codebase:
1. Internal S3 Database Dumps & Asset Storage
The application ran nightly automated database logical backups and hourly incremental WAL archiving to an Amazon S3 bucket. Because Amazon S3 public endpoints resolve to public IP addresses by default, all backup traffic left the private subnet, passed through the NAT Gateway, and looped right back into S3.
- Monthly S3 Transit Volume: 22 Terabytes.
- NAT Data Processing Fee (22,000 GB * $0.045): $990.00 / month just to upload their own internal database backups to their own AWS account.
2. High-Frequency LLM Streaming Responses
The application ingested legal contracts and streamed real-time completions from OpenAI and Anthropic APIs. Every streaming token passed through the NAT Gateway’s inbound processing pipeline.
- Monthly LLM Streaming Ingress: 11 Terabytes.
- NAT Processing Fee (11,000 GB * $0.045): $495.00 / month.
3. Container Image Pulls from Docker Hub & ECR
Every deployment and horizontal auto-scaling event pulled fresh container layers from container registries over the public internet through the NAT Gateway.
- Monthly Container Layer Ingestion: 7 Terabytes.
- NAT Processing Fee (7,000 GB * $0.045): $315.00 / month.
Add the multi-AZ idle uptime ($97.20) and cross-AZ routing penalties ($680.00), and the company was handing AWS $2,577.20 every month for a virtual networking component that provided zero business differentiation.
Architectural Comparison: Egress Routing Strategies
The following benchmark comparison outlines the financial and operational trade-offs between standard AWS NAT Gateways and modern VPC egress alternatives:
| Routing Architecture | Fixed Monthly Overhead | Per-GB Data Processing | S3 & Internal Transit | Recommended Workload |
|---|---|---|---|---|
| AWS Managed NAT Gateway | ~$32.40 to $97.20 / mo | $0.045 / GB | $0.045 / GB (Full penalty) | Legacy enterprise compliance with rigid static IP egress requirements |
| VPC Gateway Endpoints | $0.00 / mo (Free) | $0.00 / GB (Free) | $0.00 / GB (Direct backbone) | Mandatory for all S3 and DynamoDB traffic in every VPC |
| Self-Hosted NAT (fgt/t4g.nano) | ~$4.20 / mo (t4g.nano spot) | $0.00 / GB (Zero markup) | Requires manual route tables | High-egress staging environments and non-critical worker clusters |
| Direct Public Subnet with SG | $0.00 / mo | $0.00 / GB | Standard egress rates | API frontends with strict security groups blocking all inbound ports |
| Egress-Only Internet Gateway (IPv6) | $0.00 / mo (Free) | $0.00 / GB (Free) | Direct global peering | Modern serverless and containerized microservices supporting dual-stack IPv6 |
How to Eliminate NAT Gateway Bleed in 30 Minutes
Eliminating 80% or more of your NAT Gateway spend does not require rewriting application logic; it requires configuring native AWS route table primitives.
Here is the step-by-step remediation plan we executed:
Step 1: Deploy Free VPC Gateway Endpoints for Amazon S3
AWS provides VPC Gateway Endpoints for Amazon S3 and Amazon DynamoDB completely free of charge. They carry zero hourly costs and zero data processing fees.
When you create a Gateway Endpoint, AWS automatically modifies your private subnet route tables to direct all s3.*.amazonaws.com traffic over private AWS fiber rather than through your NAT Gateway.
# Create an S3 Gateway Endpoint attached to your VPC route tables
aws ec2 create-vpc-endpoint \
--vpc-id vpc-0123456789abcdef0 \
--service-name com.amazonaws.us-east-1.s3 \
--route-table-ids rtb-0123456789abcdef1
Financial Impact: Slashed $990.00 per month immediately.
Step 2: Interface Endpoints for ECR & Secrets Manager
For services like Amazon ECR (container image pulls) and AWS Secrets Manager, deploy AWS PrivateLink Interface Endpoints. While Interface Endpoints cost $0.01 per hour (~$7.20/month), their data processing fee is only $0.01 per GB, compared to $0.045 per GB on NAT Gateways: an immediate 77% cost reduction on large container layer downloads.
Step 3: Align Subnets to Eliminate Cross-AZ Transit
If your application architecture requires a managed NAT Gateway for third-party compliance, ensure that private subnets in us-east-1a strictly route through a NAT Gateway located in us-east-1a.
Routing across Availability Zone boundaries adds $0.02/GB in unnecessary round-trip transit fees. If your traffic does not require multi-AZ redundancy during initial bootstrap stages, consolidate your compute workers into the same Availability Zone as your primary NAT gateway.
What Engineering Leads Should Audit This Week
If your AWS bill contains NatGateway-Bytes, run these three diagnostic checks before the next billing cycle:
- Check S3 Route Table Entries: Inspect your private subnet route tables in the AWS VPC Console. If there is no entry pointing
pl-63a5400a (com.amazonaws.region.s3)tovpce-xxxxxx, your database backups and assets are burning cash through a NAT gateway. - Analyze VPC Flow Logs for Top Talkers: Run an Amazon CloudWatch Insights query over your VPC flow logs filtered by your NAT Gateway’s network interface ID (
eni-xxxxxx). Sort destination IPs by total byte volume to identify which external APIs are driving egress spikes. - Evaluate Direct Public Subnets for Pure Outbound Workers: If a worker task only pulls jobs from an SQS queue and calls external LLM APIs, placing it in a public subnet with a Security Group that denies all inbound traffic provides identical isolation to a private subnet while eliminating the NAT middleman entirely.
Elena Rostova
Product Strategy LeadProduct and operations lead dedicated to helping non-technical founders navigate technical scale and architectural decisions. Advises founders on technical debt triage, cloud unit economics, and rapid pre-launch risk evaluation.
Why is AWS NAT Gateway so expensive for startups and MVPs?
How can teams bypass NAT Gateway fees for Amazon S3 and DynamoDB traffic?
What causes unexpected cross-AZ data transfer fees in AWS VPCs?
Can serverless applications avoid NAT Gateways completely?
Have our team inspect your AI-generated codebase.
48-hour turnaround with direct pull requests fixing security and scale bottlenecks.