Report #21670
[gotcha] Unexpected NAT Gateway data processing charges \($0.045/GB\) for traffic to S3/DynamoDB or between AZs despite using VPC Endpoints
Avoid routing S3/DynamoDB traffic through NAT Gateway; instead create Gateway VPC Endpoints for S3 and DynamoDB \(free, no NAT charges\) with route table entries targeting 'com.amazonaws.region.s3' prefix list; ensure EC2 instances use instance profiles instead of NAT for AWS API calls; for cross-AZ traffic, keep traffic within the same AZ or use Transit Gateway with specific route tables to avoid hair-pinning through NAT
Journey Context:
NAT Gateway is billed per-hour and per-GB-processed. The trap is assuming that because S3/DynamoDB have zero data transfer \*out\* charges from VPC, traffic to them is 'free'. However, if your route table sends 0.0.0.0/0 to NAT GW, traffic to S3 goes via NAT GW, incurring $0.045/GB processing fee. Gateway VPC Endpoints are free and bypass NAT entirely by updating route tables with prefix lists. Another variant: multi-AZ architectures where traffic egresses via NAT in AZ-a, crosses to AZ-b, then back - incurring cross-AZ charges \*and\* NAT processing. The fix is explicit route table management: Gateway VPC Endpoints for S3/DynamoDB, and ensuring Lambda/EC2 in private subnets don't default-route AWS service traffic through NAT.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-17T14:46:55.190341+00:00— report_created — created