Cost-Optimized Networking: NAT Gateways, VPC Endpoints, and Data Transfer
Cost-optimized network architecture on AWS means routing, addressing and connecting your workloads so that every byte travels on the cheapest path that still meets the stated security, availability and performance requirements. AWS data transfer costs follow a small set of rules — inbound free, same-AZ private traffic free, cross-AZ and cross-Region charged, internet egress charged — and Task 4.4 is about arranging topology around those rules before traffic starts flowing. This lesson works through NAT gateway cost mechanics (single, per-AZ and regional NAT gateways, and NAT instances), the gateway and interface VPC endpoints that fix the most common NAT bill spike, CloudFront and Global Accelerator, VPN versus Direct Connect and how to size their bandwidth, peering versus Transit Gateway, throttling as a cost control, and the cost-visibility tools you use to review an existing workload. Domain 4 questions usually ask for the most cost-effective design, and network questions add a twist: the cheapest topology often trades away resilience, and the requirements decide which side wins. By the end you will be able to read a traffic path, say which segments are charged, and name the design change that removes the charge without breaking a stated requirement.
On this page11 sections
- The data-transfer cost model: five rules that shape every design
- The transfer-cost rules table
- NAT gateway economics: paying twice, multiplied by AZs
- Gateway VPC endpoints: the most-tested network cost fix
- CloudFront: cutting egress by serving from the edge
- VPN vs Direct Connect: fixed cost versus per-GB at volume
- VPC peering vs Transit Gateway (and where PrivateLink fits)
- Placement, chattiness, and the honest cost-vs-resilience trade
- Throttling strategy: protecting the origin and the bill
- Reviewing an existing workload: finding the network cost driver
- Worked scenarios: reading the traffic path before the options
- Apply the data-transfer charging rules — inbound, same-AZ, cross-AZ, cross-Region, egress — as design inputs, and recognize when a paid transfer tool is not needed
- Choose between a single shared NAT gateway, per-AZ NAT gateways, a regional NAT gateway and a NAT instance by weighing cost against availability and operations
- Remove S3, DynamoDB and other AWS service traffic from NAT with gateway and interface VPC endpoints, and troubleshoot an endpoint that saves less than expected
- Decide when CloudFront and when Global Accelerator fits a content-delivery or latency problem
- Choose between VPN and Direct Connect, and allocate bandwidth with standard tunnels, ECMP, Large Bandwidth Tunnels or Direct Connect port speed
- Compare VPC peering and Transit Gateway costs and pick the right one for the VPC count
- Select a throttling strategy — API Gateway throttles and usage plans, WAF rate-based rules, CloudFront caching — that protects both the origin and the bill
- Find the network cost driver in an existing workload with Cost Explorer, the Cost and Usage Report, cost allocation tags and VPC Flow Logs
The data-transfer cost model: five rules that shape every design
You cannot cost-optimize a network you cannot price, so start with the charging rules the exam assumes you know cold. Rule one: inbound data transfer from the internet is free. Ingesting terabytes into AWS costs nothing in transfer — which is why data-heavy ingestion architectures are viable at all. Rule two: traffic between resources in the same Availability Zone over private IP addresses is free. Two instances chatting within one AZ across private IPs generate no transfer charge, no matter the volume. Rule three: traffic that crosses Availability Zones within a Region is charged per gigabyte — and it is billed in both directions, out of one AZ and into the other, so chatty cross-AZ tiers pay twice per exchange. Rule four: traffic between Regions is charged per gigabyte, at rates that vary by Region pair — cross-Region replication is a recurring line item, not a one-time setup cost. Rule five: egress to the internet is charged per gigabyte, on a tiered schedule, and it is typically the largest transfer line on a consumer-facing bill.
One trap hides inside rule two: it requires private IPs. Traffic between two instances in the same AZ that flows via public or Elastic IP addresses hairpins through public address space and gets charged as if it were regional traffic. Internal communication should always use private addressing — a free fix scenarios plant deliberately.
Rule one has a corollary the exam likes: a paid transfer tool only solves a bandwidth or deadline problem, never a transfer-cost problem. Uploading over the internet into Amazon S3 costs nothing in transfer, so when the connection is fast enough and the schedule is relaxed, a plain (multipart) upload is the cheapest migration. AWS DataSync charges per gigabyte copied and S3 Transfer Acceleration charges per gigabyte accelerated; both are worth paying for only when the network path or the deadline actually needs them. (AWS Snowball Edge is no longer available to new customers since 7 November 2025 — AWS points new customers to DataSync — so it is not a current choice for a new account.)
The design consequence: where you place resources and how you address them is a pricing decision. Co-locating chatty components in one AZ makes their conversation free; spreading them across AZs makes every exchange billable — and also makes the system survive an AZ failure. That tension is examined honestly later in this lesson.
The exam tests these rules indirectly: a scenario describes a traffic path — instance to instance, subnet to S3, Region to Region — and the correct answer is the one that reroutes, relocates, or caches the traffic onto a free or cheaper segment. If you can annotate each hop with charged-or-free, the options rank themselves.
The transfer-cost rules table
This table is the lookup most Task 4.4 questions compile down to. For each path: is it charged, and what is the cost-optimized design response?
| Traffic path | Charged? | Design response |
|---|---|---|
| Internet → AWS (inbound) | No | Ingest freely; never architect around inbound cost |
| Same AZ, private IPs | No | Co-locate chatty tiers; always use private addressing internally |
| Same AZ, public/Elastic IPs | Yes | Switch internal communication to private IPs — free fix |
| Cross-AZ, same Region | Yes — both directions | Make cross-AZ flows deliberate (replication, HA); keep bulk chatter within an AZ where requirements allow |
| Cross-Region | Yes — per GB, varies by pair | Remove the dependency: if the same data is read across Regions repeatedly, replicate it once and read the local copy |
| Private subnet → S3/DynamoDB via NAT gateway | Yes — NAT processing per GB (+ NAT hourly) | Gateway VPC endpoint (same-Region buckets and tables only) — removes the NAT charge, no cost of its own |
| Private subnet → other AWS services via NAT | Yes — NAT processing per GB | Interface VPC endpoint when that service's volume justifies the endpoint's own fees |
| EC2/ALB → internet (egress) | Yes — tiered per GB | Put CloudFront in front of cacheable content; compress responses |
| AWS origin → CloudFront (origin fetch) | No | Offloading egress to CloudFront costs nothing on the origin side |
| VPC ↔ VPC (peering or Transit Gateway) | Yes — transfer per GB; TGW adds attachment-hourly + processing | Peering for few VPCs; Transit Gateway when scale justifies its overhead |
Two reading habits make the table stick. First, notice which rows say No — free paths (inbound, same-AZ private, gateway endpoints, origin-to-CloudFront) are the raw material of cost-optimized designs, and correct answers usually move traffic onto them. Second, notice that NAT and Transit Gateway rows charge twice: an hourly fee for existing plus a per-GB fee for processing. Managed network middleboxes bill for presence and for throughput, which is why removing traffic from them saves so reliably.
On the exam, expect the question to describe two or three hops and ask for the MOST cost-effective change. Annotate each hop against this table; the option that converts a charged row into a free row — without violating a security or availability requirement — is the answer.
NAT gateway economics: paying twice, multiplied by AZs
A NAT gateway lets instances in private subnets reach the internet, and it charges two meters at once: an hourly fee for every hour it exists, and a per-gigabyte processing fee on every byte that flows through it — on top of the ordinary data transfer the traffic would incur anyway. A NAT gateway that moves serious volume can quietly become one of the largest items on a network bill, which is why the exam returns to it constantly.
The architectural decision is how many to run. A single shared NAT gateway in one AZ minimizes the hourly cost — one gateway, one fee — but instances in other AZs must cross an AZ boundary to reach it, adding cross-AZ transfer charges on all of that traffic, and it concentrates risk: if the NAT gateway's AZ fails, every private subnet in the VPC loses internet access. One NAT gateway per AZ multiplies the hourly fees but keeps each AZ's egress local — no cross-AZ charges on the way out, and no cross-AZ dependency: an AZ failure takes down only its own egress. The decision rule: dev, test, and cost-first environments with modest traffic take the single shared NAT; production environments with an availability requirement, or heavy egress from multiple AZs, take per-AZ NATs — where the extra hourly fees are partially offset by the cross-AZ charges they eliminate.
Since 2025 there is a third managed option: the regional NAT gateway. Instead of one gateway per AZ in a public subnet, you create one NAT gateway in regional availability mode for the VPC; it has a single gateway ID that every private route table can target, needs no public subnet, and automatically expands into each AZ where you have workloads (and contracts when they leave), keeping traffic zonal once it has expanded. Expansion into a newly used AZ can take up to an hour, and until it completes that AZ's traffic is processed in another AZ, so it briefly incurs cross-AZ charges. Its billing follows that footprint: an hourly charge for each AZ it is active in, plus the same per-GB processing fee. So it is the operational equivalent of per-AZ gateways — simpler routing and high availability by default — not a cheaper meter. It does not reduce processing charges, and with workloads in three AZs it costs about what three zonal gateways do. (It also supports public NAT only; private NAT still needs zonal gateways.)
| Option | Hourly cost | Per-GB processing | Availability | Operations |
|---|---|---|---|---|
| One shared zonal NAT gateway | One gateway | Yes, plus cross-AZ transfer from other AZs | Single AZ — its AZ failing cuts egress for all | Managed |
| Zonal NAT gateway per AZ | One per AZ | Yes, no cross-AZ hop | Each AZ independent | Managed; one public subnet and route table per AZ |
| Regional NAT gateway | Per AZ where active | Yes, no cross-AZ hop | Expands with workloads | Managed; one ID, no public subnet |
| NAT instance | EC2 instance price | No NAT processing fee | Whatever you build | Self-managed: patching, sizing, failover |
The NAT instance is the legacy do-it-yourself option: an EC2 instance performing NAT. It can be cheaper than a NAT gateway — a small instance has a low hourly cost and no per-GB processing fee — but you manage patching, sizing and failover, and it bottlenecks at the instance's bandwidth. AWS no longer maintains a NAT AMI, so you build one from a current AMI (for example Amazon Linux) and configure it yourself: enable IP forwarding and masquerading in the operating system, place it in a public subnet with a public or Elastic IP (that subnet keeps its route to the internet gateway), turn off the source/destination check (EC2 otherwise drops traffic that is not addressed to or from the instance itself), allow the private subnets in its security group, and point the private subnets' default route at the instance. It is the "lowest possible cost, team accepts operational burden" answer, and a wrong answer whenever the scenario asks for managed or highly available.
When asked to cut a NAT bill, run this list in order: 1) add gateway VPC endpoints for S3 and DynamoDB traffic (next section — usually most of the bill); 2) add interface endpoints for other high-volume AWS service traffic; 3) check what remains with VPC Flow Logs before resizing anything; 4) consolidate to a single NAT if availability requirements and cross-AZ math allow (at low volume, idle hourly fees dominate, so fewer gateways save most); 5) consider a NAT instance only for small, tolerant environments.
The exam tests NAT two ways: the bill-reduction scenario (the list above) and the single-versus-per-AZ design choice, where the availability requirement in the question decides which is "cost-optimized."
Gateway VPC endpoints: the most-tested network cost fix
Here is the pattern SAA-C03 tests more than any other in this task. Instances in private subnets talk to Amazon S3 or DynamoDB. Without an endpoint, that traffic leaves through the NAT gateway — paying the per-gigabyte NAT processing fee on every byte — even though it is going to an AWS service in the same Region. For data-heavy workloads (analytics jobs reading S3, applications streaming objects, backup pipelines), this single path can dominate the NAT bill.
The fix is a gateway VPC endpoint. It is a route-table entry, not a device: you create the endpoint for S3 or DynamoDB, associate it with the private subnets' route tables, and traffic to that service flows directly over the AWS network — never touching the NAT gateway, never traversing the internet. And the part that makes it the exam's favorite answer: gateway endpoints are free. No hourly charge, no per-gigabyte charge. The NAT processing cost for that traffic drops to zero, and as a side benefit the traffic becomes more private, so the answer simultaneously satisfies cost and security framings. Gateway endpoints exist for exactly two services — S3 and DynamoDB — a fact worth memorizing verbatim.
Because a gateway endpoint is a route, two details decide whether it actually saves money. First, it only affects the route tables it is associated with: the endpoint adds a route to the service's prefix list, which is more specific than the default route to the NAT gateway, but only in the associated tables. A VPC with one route table per AZ needs the endpoint associated with every private route table, and each service needs its own endpoint — an S3 endpoint does nothing for DynamoDB traffic. If the NAT bill barely moves after adding an endpoint, check the associations first. Second, it only reaches the service in the VPC's own Region; traffic to a bucket in another Region still leaves through NAT and pays inter-Region transfer. Private DNS is not a gateway-endpoint setting — it belongs to interface endpoints, where it makes the service's default hostname resolve to the endpoint's private IPs.
For every other AWS service reached through a NAT gateway — ECR, CloudWatch, SQS, Secrets Manager, and the rest — the private path is an interface VPC endpoint (powered by PrivateLink). Interface endpoints are not free: they bill per hour per AZ plus per gigabyte processed. The concept-level comparison: their per-gigabyte rate is well below NAT processing, so high-volume service traffic through an interface endpoint costs less than the same traffic through NAT — but each endpoint's standing hourly fees mean that a fleet of endpoints serving trickles of traffic can cost more than the NAT charges they replace. Volume justifies interface endpoints; idleness doesn't.
Some services need both kinds. Pulling images from a private Amazon ECR repository without NAT takes interface endpoints for the ECR API and the Docker registry (with private DNS enabled so the usual hostnames resolve to them) and an S3 gateway endpoint, because ECR serves the image layers from Amazon S3. Leave out the S3 route and the largest part of every pull still flows through NAT.
The exam signature is unmistakable: private subnets, heavy S3 or DynamoDB traffic, and a complaint about NAT gateway or data processing charges. The answer is the gateway endpoint, and the distractors are predictable — an interface endpoint for S3 (functional, but it has fees where the gateway endpoint has none), resizing or adding NAT gateways (doesn't touch per-GB pricing), or moving instances to public subnets (breaks the security posture the scenario implies).
CloudFront: cutting egress by serving from the edge
Internet egress is the transfer charge you cannot route around — users are on the internet, and bytes must reach them. The lever is where the bytes leave from and how often the origin is asked for them, and that is CloudFront's cost story.
Putting CloudFront in front of an origin changes the economics twice. First, edge caching collapses origin fetches: when thousands of users request the same object, the origin serves it once per cache lifetime per edge location instead of once per user. Every cache hit is origin work — and origin data transfer — that never happens, which also means the origin fleet itself can be smaller. Second, the transfer path gets cheaper end to end: data transferred from AWS origins to CloudFront carries no charge, and CloudFront's own egress pricing is designed to be competitive with — and at volume, generally below — serving the same bytes straight from EC2 or S3. You are substituting a cheaper egress channel for a more expensive one, at the same time as you shrink total origin traffic.
CloudFront earns this on cacheable content: static assets, images, video, downloads, and — with sensible TTLs — even semi-dynamic API responses. For fully dynamic, uncacheable traffic the caching benefit disappears, though the free origin-to-CloudFront leg still applies.
Global Accelerator also uses the edge network, but it solves a different problem. It gives you two static anycast IP addresses, accepts TCP and UDP traffic at the nearest edge location and carries it over the AWS backbone to endpoints such as Network Load Balancers, Application Load Balancers, EC2 instances or Elastic IPs. It charges an hourly fee plus a per-gigabyte data transfer premium, and it caches nothing. It is justified when traffic is latency-sensitive and cannot be cached — non-HTTP protocols such as UDP game or voice traffic, or clients that need a few fixed IP addresses to allowlist — and when you want better paths without adding Regions. It is not a cost-reduction tool, and it cannot front an S3 bucket.
| Need | CloudFront | Global Accelerator |
|---|---|---|
| Cut egress for popular, cacheable content | Yes — edge caching, free origin fetch | No — no caching, adds a per-GB premium |
| Protocols | HTTP and HTTPS (including WebSocket) | TCP and UDP |
| Fixed IP addresses for allowlisting | No (DNS name) | Yes — two static anycast IPs |
| Typical fit | Websites, media, downloads, APIs with cacheable responses | Gaming, VoIP, IoT, non-cacheable traffic needing consistent latency or fast failover |
The exam frames this as an egress-bill scenario: an application serving media or static files directly from EC2 or S3, transfer costs climbing with popularity. The MOST cost-effective answer adds CloudFront; the distractors scale the origin (more instance cost, same egress rates), move Regions (marginal), or reach for Global Accelerator (a premium, not a saving).
VPN vs Direct Connect: fixed cost versus per-GB at volume
Hybrid connectivity is a classic fixed-versus-variable cost decision, and the exam expects you to reason about it in exactly those terms.
AWS Site-to-Site VPN is the low-fixed-cost option: a modest hourly charge per connection, running as encrypted tunnels over the public internet, live within hours of deciding you need it. Its variable cost is ordinary internet data transfer, and its constraints are the internet's: variable latency and per-tunnel throughput limits. Each connection provides two tunnels for redundancy — not doubled bandwidth by default.
Allocating VPN bandwidth is its own skill. A standard tunnel carries up to about 1.25 Gbps. Beyond that there are two levers, and both need the VPN on a transit gateway (or AWS Cloud WAN) rather than a virtual private gateway:
- Large Bandwidth Tunnels raise a tunnel to up to 5 Gbps. They are not supported on virtual private gateways, both tunnels of the connection must use the same setting, and the customer gateway device must be able to push that rate through one tunnel.
- Multiple VPN connections with ECMP spread traffic across many tunnels. ECMP needs a transit gateway and dynamic (BGP) routing; static-routed VPNs and virtual private gateways do not load-balance across connections. This is the answer when the on-premises device can only handle about 1.25 Gbps per tunnel, and it also scales past 5 Gbps by combining Large Bandwidth Tunnels.
Accelerated Site-to-Site VPN is a different lever: it uses Global Accelerator so the tunnels enter the AWS network at the nearest edge location instead of crossing the whole internet path, which improves consistency for distant sites. It costs extra (accelerator hourly and data transfer charges), works only with transit-gateway attachments, does not raise per-tunnel bandwidth (and cannot be combined with Large Bandwidth Tunnels), and still uses the internet between the site and the edge — so it is not a substitute for Direct Connect's consistent latency.
AWS Direct Connect inverts the cost structure: a dedicated physical circuit with meaningful fixed costs — port-hours on AWS's side plus whatever the colocation or carrier charges — in exchange for a lower per-gigabyte data transfer out rate than internet egress, plus consistent latency and private connectivity. Dedicated connections come in fixed port speeds (1, 10 and 100 Gbps, with 400 Gbps at selected locations), with hosted connections available at lower increments through partners — pick the port speed from the sustained throughput requirement, and don't buy 10 Gbps for a 200 Mbps workload. The operational catch the exam loves: provisioning takes weeks or longer, because physical circuits are involved.
The selection rule follows directly: low or bursty volume, speed-to-deploy, or budget-first means VPN; large, steady transfer volume means Direct Connect, where the discounted per-GB rate on high volume pays back the fixed circuit costs — the break-even logic, no exact prices required. The two also pair: a common pattern runs Direct Connect as primary with a VPN as the low-cost failover, and a VPN over the internet is the standard stopgap while a Direct Connect circuit is being provisioned.
The exam tests this with volume-and-timeline scenarios: "transfers several terabytes daily to on premises" points to Direct Connect; "needs connectivity next week" or "occasional low-volume sync" points to VPN; "needs it now and long-term at volume" points to VPN-now, Direct-Connect-later; "more VPN bandwidth soon" points to a transit gateway with ECMP or Large Bandwidth Tunnels, chosen by what the customer gateway can handle per tunnel.
VPC peering vs Transit Gateway (and where PrivateLink fits)
Connecting VPCs privately has two mainstream mechanisms, and their cost structures diverge exactly like NAT versus endpoints did.
VPC peering is the lean option: a direct, non-transitive link between two VPCs with no hourly attachment fee and no processing fee — you pay only the data transfer itself, and traffic that stays within the same AZ across a same-Region peering connection is free, with cross-AZ flows billed at the usual regional rates. Its cost is architectural instead: peering is point-to-point and non-transitive, so full connectivity among N VPCs needs a mesh of N×(N−1)/2 connections, each with its own route-table entries. At three or four VPCs that is trivial; at forty it is an operational tar pit.
AWS Transit Gateway is the hub: every VPC (and VPN, and Direct Connect gateway) attaches once, and the hub routes among them, transitively. It charges like the managed middlebox it is — a per-attachment hourly fee plus a per-gigabyte processing fee on traffic through the hub, on top of any applicable transfer charges. For a handful of VPCs, those standing fees buy you nothing peering doesn't already do cheaper. At scale, Transit Gateway pays for itself in eliminated mesh management: one attachment per VPC instead of dozens of peerings, one routing domain, native transitivity, and a clean on-ramp for hybrid connectivity.
The decision rule the exam rewards: few VPCs (roughly a handful) with simple, stable connectivity — peer them and pay only for transfer; many VPCs, growing, or needing transitive routing and shared hybrid connections — Transit Gateway, accepting its fees as the price of manageability.
Complete the picture with AWS PrivateLink at recognition level: when many consumer VPCs need to reach one specific service — not full network connectivity — PrivateLink exposes just that service through interface endpoints in each consumer VPC. It bills like interface endpoints (hourly per endpoint per AZ plus per GB), avoids both meshes and hubs, and eliminates overlapping-CIDR headaches. Service-to-many equals PrivateLink; network-to-network equals peering or Transit Gateway.
Exam scenarios state the VPC count and trajectory for a reason: "three VPCs, no growth expected" is peering on cost grounds; "dozens of VPCs across accounts" is Transit Gateway; "expose an internal API to hundreds of customer VPCs" is PrivateLink. Distractors offer Transit Gateway's convenience where its fees are unjustified, or a peering mesh where its management burden is the disqualifier.
Placement, chattiness, and the honest cost-vs-resilience trade
The rules so far imply an uncomfortable conclusion: the cheapest network is a single-AZ network. Same-AZ private traffic is free, one NAT gateway suffices, and nothing crosses a billable boundary. The reason production architectures don't look like that is availability — and the exam expects you to hold both truths honestly rather than pretend there is a free lunch.
The tension resolves through requirements. Multi-AZ placement of the tiers that provide availability — load-balanced web and application fleets, database replicas — is non-negotiable when the scenario states an availability requirement, and the cross-AZ transfer between them is the accepted price of surviving an AZ failure. What you optimize is the traffic that doesn't buy resilience: batch pipelines shuffling data between components that could sit together, chatty microservices making thousands of cross-AZ calls per second out of placement indifference rather than design, replication traffic that could be compressed or served from a per-AZ cache. Transfer is billed per byte, so the techniques that shrink the bill are the ones that shrink the bytes that cross: compress payloads before they cross a boundary, and cache repeated reads in each AZ (for example a per-AZ cache node or local read replica) so the same data is not fetched across AZs again and again. Batching small messages saves request overhead and API calls, but barely changes the billed gigabytes. AZ-aware routing within load-balanced tiers (keeping a request's hops inside one AZ where the platform supports it) trims the same line item.
The same logic applies across Regions: when a workload rereads the same data from another Region every day, stop paying for the crossing instead of optimizing it. S3 Cross-Region Replication copies the data once and then only the changes, and readers use the local copy. Replication applies only to objects written after the rule exists, so existing objects need a one-time S3 Batch Replication job before readers switch over.
The exam tests this section's judgment call directly: options that consolidate everything into one AZ "to reduce transfer costs" are wrong the moment the scenario mentions high availability, and options that gold-plate resilience are wrong when the scenario is a dev environment asking for minimum cost. The qualifier only ever means: cheapest among the designs that meet the stated requirements.
Throttling strategy: protecting the origin and the bill
Throttling is a cost control because every request you reject or absorb early is compute, database and transfer you do not pay for. The right strategy depends on who you need to limit and where the request should stop.
| Lever | What it limits | Fits when |
|---|---|---|
| API Gateway stage and method throttling | Steady rate and burst for the whole API or one method | Protecting a backend from overload for all callers together |
| API Gateway usage plans with API keys | Rate, burst and a daily, weekly or monthly quota per client key | Different limits per customer or tier (fair use, metered plans) |
| AWS WAF rate-based rule | Requests per client IP (or another aggregation key) over a short rolling window | Blocking floods and scrapers at CloudFront, an ALB or API Gateway before they reach the origin |
| CloudFront caching in front of the origin | Repeat requests never reach the origin | Cacheable responses; cuts origin load and egress together |
| Lambda reserved concurrency | Concurrent executions of one function | Capping a function's spend or protecting a downstream database |
Two distinctions are worth holding. Per-client limits need usage plans: stage throttling and Lambda concurrency limit everyone together, and a WAF rule counts per IP address over minutes, not per customer over a month. And usage-plan throttling and quotas are applied on a best-effort basis: they enforce fair use per tier, but AWS does not present them as a hard cost cap, so pair them with AWS Budgets alerts and backend protections rather than relying on them alone to bound spend. Rejected requests still cost little, but a request stopped at the edge by WAF or served from the CloudFront cache costs least.
Reviewing an existing workload: finding the network cost driver
Reviewing a workload for network optimization starts with evidence: find which charge is growing, who owns it and which traffic causes it, then apply the fixes in this lesson to the biggest line first. Each AWS tool answers one of those questions.
| Tool or feature | Question it answers |
|---|---|
| AWS Cost Explorer | Which charge grew? Group by service and usage type: internet egress, DataTransfer-Regional-Bytes (inter-AZ transfer, and same-AZ traffic over public IPs), NAT gateway hours and bytes. NAT gateway and data transfer charges appear under the EC2-Other line, not EC2-Instances. |
| AWS Cost and Usage Report (delivered through AWS Data Exports) | The most detailed line-item data, per resource and hour, for querying with Athena or loading into a BI tool |
| Cost allocation tags | Who owns the cost? Tags must be activated in the Billing console before they appear in cost data; activation can backfill earlier months. |
| Consolidated billing (AWS Organizations) | One bill across accounts, with volume pricing tiers shared across them and per-account breakdowns |
| AWS Budgets | Alerts (and optional actions) when actual or forecast spend crosses a threshold — prevention, not analysis |
| VPC Flow Logs | Which traffic is it? Source, destination and bytes per flow; the az-id field shows each interface's AZ, so Athena can rank the cross-AZ or NAT-bound instance pairs. Flow logs show traffic, not cost, and only from when they are enabled. |
Two network services change the bill directly and are easy to miss. Route 53 alias records point a name at an AWS resource (a load balancer, CloudFront distribution, S3 website endpoint and others); Route 53 does not charge for alias queries to AWS resources, whereas CNAME queries are billed, and an alias also works at the zone apex where a CNAME is not allowed. DNS routing policies (latency, failover, weighted) remain availability and performance decisions rather than cost levers. And load balancers bill per hour plus capacity units, so several lightly used ALBs can often be consolidated into one ALB with host-based and path-based listener rules (and multiple certificates via SNI), keeping each application's routing separate while paying one standing fee.
Worked scenarios: reading the traffic path before the options
Scenario 1 — the NAT bill and the S3 pipeline. A reporting workload on private-subnet EC2 instances moves terabytes of objects daily between itself and same-Region S3 buckets. The finance team flags a large and growing NAT gateway data-processing charge. Security requires the instances stay in private subnets. What is the MOST cost-effective fix?
Reasoning: Annotate the path: instance → NAT gateway (per-GB processing — the flagged cost) → S3. Eliminate moving instances to public subnets: it would bypass the NAT but violates the stated security requirement. Eliminate adding or resizing NAT gateways: NAT pricing is per gigabyte — more gateways spread the load and add hourly fees without reducing the processing charge at all. An interface endpoint for S3 would work but carries hourly and per-GB fees of its own. The answer is a gateway VPC endpoint for S3: a route-table change that sends the S3 traffic over the AWS network directly, is completely free, keeps the instances private, and zeroes out the NAT processing charge for the dominant traffic. This is the most-tested network cost question in the exam's repertoire — recognize it from the first sentence.
Scenario 2 — one NAT or three? A production web application runs across three AZs, with application servers in private subnets making moderate outbound API calls. The architecture currently uses a single NAT gateway in AZ-a. A new requirement states the application must tolerate the loss of any single AZ. Which change is MOST cost-effective?
Reasoning: The availability requirement is doing the work. Keeping the single NAT is the cheapest configuration — until AZ-a fails and instances in AZ-b and AZ-c lose all egress, violating the stated requirement, so it is disqualified regardless of price. A NAT instance per AZ is cheaper still on paper but reintroduces self-managed availability — the wrong direction when the requirement is resilience. The answer is one NAT gateway per AZ with per-AZ route tables: each AZ's egress survives independently, and the added hourly fees are partly offset by eliminating the cross-AZ transfer that AZ-b and AZ-c traffic was paying to reach AZ-a. Flip the scenario — a dev environment, no availability requirement, cost-first — and the single shared NAT becomes the correct answer. The qualifier didn't change; the requirements did.
Scenario 3 — peering or Transit Gateway? A company runs four VPCs that need full private connectivity with moderate inter-VPC traffic. No growth in VPC count is expected. The team proposes Transit Gateway; is there a cheaper design that meets the requirement?
Reasoning: Four VPCs need six peering connections for a full mesh — entirely manageable — and VPC peering carries no hourly attachment or processing fees, so every gigabyte moves cheaper than through a Transit Gateway hub charging per attachment-hour and per GB processed. With a stable, small VPC count, Transit Gateway's manageability premium buys nothing the requirement asks for. Reverse the facts — dozens of VPCs, multiple accounts, shared VPN and Direct Connect on-ramps — and Transit Gateway wins on operational grounds that the exam accepts as part of cost-effectiveness at scale.
Tip. SAA-C03 tests this task by describing a traffic path and asking for the most cost-effective change that still meets every stated requirement — the requirements sentence usually decides between the cheap option and the resilient one. The banner question is the NAT bill inflated by S3 or DynamoDB traffic from private subnets, answered by a free gateway VPC endpoint (and its follow-ups on route-table association, services whose own endpoint still relies on S3, and Region scope). Close behind are the single, per-AZ or regional NAT decision (the availability and operations constraints flip the answer), NAT instance setup, VPN versus Direct Connect selected on volume, latency and timeline, VPN bandwidth allocation (transit gateway, ECMP with BGP, Large Bandwidth Tunnels), peering versus Transit Gateway selected on VPC count, CloudFront versus Global Accelerator, throttling with usage plans or WAF rate-based rules, and finding a cost driver with Cost Explorer, cost allocation tags and Flow Logs. Trap patterns to expect: multiplying NAT gateways or switching to a regional NAT gateway to cut a per-GB charge, an interface endpoint for S3 where the free gateway endpoint exists, private DNS offered as a gateway-endpoint fix, Global Accelerator offered as a transfer cost saver, paid transfer tools for a migration with ample bandwidth and time, and single-AZ consolidation despite a high-availability requirement. Annotate each hop as charged or free, then pick the option that moves the biggest charged flow onto a free path without breaking a requirement.
- Price the path before the fix: inbound is free, same-AZ private traffic is free, cross-AZ is charged both directions, cross-Region and internet egress are charged — the right answer moves traffic onto a free segment. Paid transfer tools (DataSync, Transfer Acceleration) only buy speed, never lower transfer cost.
- Gateway VPC endpoints for S3 and DynamoDB are free and remove NAT processing for that traffic — but only in the route tables they are associated with, and only for the VPC's own Region; interface endpoints for other services (ECR also needs the S3 gateway endpoint for layers) cost less than NAT only at volume.
- NAT gateways bill hourly plus per GB processed: a single shared NAT for cost-first environments, per-AZ NATs when availability is required. A regional NAT gateway is one ID that expands across AZs and is billed per active AZ plus per GB — simpler, not cheaper.
- A NAT instance is the cheap, self-managed option — built from a current AMI with IP forwarding on, the source/destination check off and the private route pointing at it; wrong whenever managed or highly available is stated.
- CloudFront cuts egress for cacheable content (edge caching, free origin fetch); Global Accelerator is a performance product with a per-GB premium, right for non-cacheable TCP/UDP traffic that needs static IPs or consistent latency.
- VPN is low fixed cost and quick to deploy; standard tunnels carry about 1.25 Gbps, Large Bandwidth Tunnels up to 5 Gbps, and ECMP across BGP VPNs scales further — both levers need a transit gateway. Direct Connect has fixed port costs, a lower per-GB rate at steady volume and weeks of lead time.
- VPC peering has no hourly or processing fees — cheapest for a few stable VPCs; Transit Gateway's per-attachment and per-GB fees buy transitive routing and manageability at scale; PrivateLink exposes one service to many VPCs.
- Throttle where it is cheapest: usage plans for per-client limits (best effort, not a hard cost cap), WAF rate-based rules per IP at the edge, CloudFront caching for repeats. Review existing workloads with Cost Explorer usage types, activated cost allocation tags and VPC Flow Logs before changing anything.
Frequently asked questions
Why is my NAT gateway so expensive?
Because a NAT gateway charges two meters: an hourly fee for every hour it exists and a per-gigabyte processing fee on all traffic through it — and in most inflated NAT bills, the bulk of that traffic is instances in private subnets talking to S3 or DynamoDB. That traffic never needed the NAT gateway: a gateway VPC endpoint routes it directly to the service over the AWS network at no charge, cutting the processing fee for it to zero. Check VPC Flow Logs to confirm where the volume goes, add gateway endpoints first, consider interface endpoints for other high-volume AWS services, and only then revisit how many NAT gateways you run.
Are VPC gateway endpoints really free?
Yes. Gateway VPC endpoints — which exist for exactly two services, Amazon S3 and DynamoDB — carry no hourly charge and no per-gigabyte data processing charge. They are implemented as route-table entries, not billable network devices. That makes them strictly better than routing the same traffic through a NAT gateway, which charges per gigabyte processed: you save money, and the traffic stays on the AWS network rather than traversing the internet. Interface endpoints (used for most other AWS services via PrivateLink) are the ones that bill per hour per AZ plus per gigabyte — a distinction the exam checks directly.
Should I use one NAT gateway or one per Availability Zone?
It is a cost-versus-availability decision, and the scenario's requirements settle it. A single shared NAT gateway minimizes hourly fees but forces instances in other AZs to pay cross-AZ transfer to reach it — and if its AZ fails, every private subnet loses internet access. One NAT gateway per AZ multiplies the hourly fees but eliminates those cross-AZ charges and makes each AZ's egress independent. Choose the single NAT for dev, test, and cost-first environments with modest traffic; choose per-AZ NATs for production with a stated availability requirement or heavy egress from multiple AZs, where the removed cross-AZ charges claw back part of the extra cost. A regional NAT gateway gives the per-AZ behaviour behind one gateway ID with no public subnets, but it is billed hourly for each AZ it is active in, so it simplifies operations rather than cutting cost.
Does AWS charge for data transfer between Availability Zones?
Yes. Traffic between resources in different AZs within a Region is charged per gigabyte, and it is billed in both directions — out of the source AZ and into the destination AZ — so chatty cross-AZ communication pays twice per exchange. Traffic within the same AZ over private IP addresses is free; note that using public or Elastic IPs between instances forfeits that, charging even same-AZ traffic at regional rates. The design implication: multi-AZ placement is the correct price of high availability for the tiers that need it, but bulk or chatty traffic that buys no resilience should be co-located, compressed, or served from a cache in each AZ.
When is Direct Connect cheaper than a VPN?
When transfer volume is large and steady enough that Direct Connect's lower per-gigabyte data transfer rate outweighs its fixed costs — port-hour fees plus the physical circuit — which is the break-even logic the exam wants, no exact prices required. A Site-to-Site VPN has a low fixed hourly cost, deploys in hours, and rides the public internet with about 1.25 Gbps per standard tunnel (more with Large Bandwidth Tunnels or ECMP on a transit gateway), making it right for low or bursty volume and urgent timelines. Direct Connect takes weeks to provision but rewards sustained multi-terabyte transfer with cheaper per-GB rates, consistent latency, and private connectivity. A common pattern uses a VPN immediately while the Direct Connect circuit is provisioned, then keeps the VPN as low-cost failover.
Is Transit Gateway more expensive than VPC peering?
Structurally, yes: Transit Gateway charges a per-attachment hourly fee plus a per-gigabyte processing fee on traffic through the hub, while VPC peering has no hourly or processing charges — you pay only standard inter-VPC data transfer, and same-AZ traffic over a same-Region peering is free. For a small, stable set of VPCs, peering is the cost-optimized answer. Transit Gateway earns its fees at scale: with dozens of VPCs, a peering mesh needs hundreds of point-to-point connections and route-table entries, while Transit Gateway needs one attachment per VPC, routes transitively, and cleanly shares VPN and Direct Connect on-ramps. Few VPCs, peer; many or growing, Transit Gateway.
How does CloudFront reduce data transfer costs?
Two ways at once. First, edge caching means popular objects are served from CloudFront's locations instead of your origin — each cache hit removes an origin request and its data transfer, so origin egress and origin fleet size both shrink. Second, the path itself is cheaper: data transferred from AWS origins (such as S3 or an ALB) to CloudFront carries no charge, and CloudFront's egress pricing is designed to be competitive with, and at volume generally below, serving the same bytes directly from EC2 or S3. The savings concentrate on cacheable content — static assets, media, downloads. Don't confuse it with Global Accelerator, which improves routing performance for a fee premium and caches nothing.
How do I get more bandwidth from a Site-to-Site VPN?
A standard Site-to-Site VPN tunnel carries up to about 1.25 Gbps, and the two tunnels of a connection exist for redundancy. To go further, attach the VPN to a transit gateway (or AWS Cloud WAN): there you can enable Large Bandwidth Tunnels of up to 5 Gbps each, or run several VPN connections with BGP and equal-cost multipath (ECMP) routing to spread traffic across many tunnels. A virtual private gateway supports neither. Accelerated VPN improves the path to AWS but does not raise tunnel bandwidth. For large, steady volume or consistent latency, Direct Connect is the longer-term answer.
Source
This lesson covers the "Design Cost-Optimized Architectures" domain of the official SAA-C03 exam guide. Vendors revise their guides — check the source for the current version.
- AWS Certified Solutions Architect – Associate (SAA-C03) exam guide — Amazon Web Services
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.