Infra Atlas · Decisions

NAT gateway, NAT instance or no NAT?

How private-subnet workloads reach the internet — or avoid needing to.

Reviewed
The verdict

NAT Gateway is the default for private-subnet egress — AWS recommends it for availability, bandwidth and zero administration. A NAT instance is now a niche, legacy choice: pick it only for a feature the gateway lacks — port forwarding, doubling as a bastion, or very low traffic where its hourly cost wins. You can skip NAT entirely when private workloads only talk to AWS services (a free Gateway endpoint, or Interface endpoints), or when a workload is genuinely public. The deciding factor is cost: the NAT Gateway data-processing charge applies to every GB — including AWS-service traffic a cheaper endpoint could carry.

Head to head
CriterionNAT GatewayNAT instanceNo NAT
Managed?Fully managed by AWSYou manage it — OS and patchesEndpoints and gateways fully managed
AvailabilityRedundant within its AZSingle instance — you script failoverHA, horizontally scaled
Bandwidth5 Gbps, auto-scales to 100 GbpsLimited by the instance typeNo NAT bandwidth limit
Hourly costPer-gateway hourly chargeEC2 instance hourly rateGateway endpoint: none. Interface: ~$0.01/AZ-hr
Data-processing costA per-GB charge on all trafficNone — pay EC2 data transfer onlyGateway endpoint: none. Interface: ~$0.01/GB
Port forwarding / bastionNot supportedSupported — can also serve as a bastionNot applicable
MaintenanceNoneOS patches; build your own NAT AMINone
AWS-service-only egressWorks, but billed per GBWorks, with management overheadBest fit — a free Gateway endpoint
When to pick which

Pick NAT Gateway when

  • Private workloads need general outbound internet — it is the AWS-recommended default.
  • You want zero maintenance and built-in per-AZ redundancy.
  • Traffic is moderate-to-high and the per-GB charge is acceptable.

Pick a NAT instance when

  • You need port forwarding, which a NAT Gateway does not support.
  • You want one instance to also serve as a bastion / jump host.
  • Egress is tiny and infrequent, where a small instance undercuts the gateway.

Skip NAT entirely when

  • Private workloads only reach S3 or DynamoDB — use a free Gateway endpoint.
  • Egress is only to other AWS services — Interface endpoints usually undercut NAT.
  • The workload is genuinely public — put it in a public subnet behind an internet gateway.
Sources
  1. NAT gateway vs NAT instance comparison — https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-comparison.html
  2. NAT gateway basics — bandwidth and limits — https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-basics.html
  3. NAT gateway pricing — https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-pricing.html
  4. Amazon VPC pricing — https://aws.amazon.com/vpc/pricing/
  5. Work with NAT instances — https://docs.aws.amazon.com/vpc/latest/userguide/work-with-nat-instances.html
  6. Gateway endpoints for S3 and DynamoDB — https://docs.aws.amazon.com/vpc/latest/privatelink/gateway-endpoints.html
  7. Egress-only internet gateways — https://docs.aws.amazon.com/vpc/latest/userguide/egress-only-internet-gateway.html