AWS Cross-AZ Data Transfer Cost Calculator
Cross-AZ traffic is charged $0.01/GB in each direction — a round trip is $0.02/GB. The 10K-rps three-tier app below burns ~$5,260/month on east-west traffic alone. Model your boundary, then measure what AZ-affinity routing saves.
💡 Payload = request + response bytes crossing the AZ boundary. Chatty microservices often move 5-20 KB per call even for tiny payloads.
The east-west bill nobody budgets for
Compute and internet egress get all the attention, but cross-AZ data transfer is a billable boundary inside your own region. AWS charges $0.01/GB in each direction between Availability Zones for EC2, RDS, Redshift, ElastiCache, DAX and Elastic Network Interfaces. Every request that crosses an AZ boundary is a metered event.
At production scale this is not noise. A three-tier application at 10,000 req/s with a 10 KB average payload moves about 100 MB/s across the boundary — roughly 263 TB/month, or ~$5,260/month at $0.01/GB per direction (round-trip $0.02/GB). That is a real line item that architecture choices control.
The fix: AZ-affinity routing
For stateless workloads, the single fastest reduction is disabling cross-zone load balancing on Application and Network Load Balancers — AWS now lets you do this independently per load balancer, routing each request to instances in the AZ it arrived from. Stateful pairs should co-locate: put RDS read replicas and ElastiCache nodes in the same AZ as the consumers that query them. Traffic between S3, DynamoDB, SQS, SNS and EC2 in the same region stays free — the billable boundary is between EC2-class services across AZs.
What $0.02/GB looks like at gRPC scale
The per-GB price is small enough to be dismissed and large enough to matter. Take a service mesh where a frontend calls a backend with 16 KB protobuf payloads at 1,000 req/s. That is 16 MB/s of east-west traffic. If the two services land in different AZs — and round-robin scheduling guarantees that happens two-thirds of the time in a three-AZ deployment — the round trip is billed at $0.02/GB:
16 MB/s × 86,400 s = 1,382 GB/day. At $0.02/GB that is $27.65/day, or roughly $830/month — for one service pair, moving 16 KB at a time. Multiply across every internal dependency in the call graph and the line item stops being rounding error.
The arithmetic has one counterintuitive property: cost scales with request count, not with payload size. Shrinking payloads from 16 KB to 4 KB cuts the bill by 75%, but the call still crosses the boundary. Making the call not cross the boundary cuts it by 100%.
Where the billable boundary actually is
The metered surface is narrower than most people assume, and knowing its edges prevents over-engineering:
Free: traffic within a single AZ; traffic between EC2-class services and S3, DynamoDB, SQS, SNS or CloudFront inside the same region; ingress from the internet gateway.
$0.01/GB per direction: EC2↔EC2, EC2↔RDS, EC2↔ElastiCache, EC2↔Redshift and EC2↔ENI across AZ boundaries.
$0.02/GB per direction: cross-region traffic — double the cross-AZ rate, and a separate line item on the invoice.
NAT Gateway processing rates: traffic that leaves through a NAT gateway in a different AZ from the sender. This is the trap that hides in plain sight — a NAT gateway is AZ-scoped, so a cross-AZ route through it pays both the $0.01/GB transfer and the $0.045/GB processing charge.
Two failure modes worth memorising
The high-availability trap. Spreading an ElastiCache primary and its replica across two AZs looks like textbook resilience. It is also a metered write path: every write replicates across the boundary at $0.01/GB out and, if the replica serves reads, $0.01/GB back. A 500 GB/day write volume becomes about $300/month before the replica answers a single query. Replicas should co-locate with their primary; only the stateless application tier needs AZ spread.
The disabled-load-balancing trap. Cross-zone load balancing is on by default for ALB and NLB, and turning it off is the single largest lever on this line item — it keeps traffic inside the AZ where the load balancer node received it. But it also changes your failure domain: with cross-zone balancing off, an AZ with spare capacity cannot absorb traffic from an AZ that is short. The cost saving and the availability model move together, so the decision belongs in the architecture review, not the cost review.
See also: AWS ALB vs NLB Cost Calculator · AWS Egress Bandwidth Cost Estimator · Concurrent Users → Bandwidth · Network Economics · 📰 The AZ Tax (Full Briefing)