Home › Decoder › DataTransfer-Regional-Bytes: the AWS line that charges you for talking to yourself

DataTransfer-Regional-Bytes: the AWS line that charges you for talking to yourself

Some of the traffic on your AWS bill never leaves AWS and never leaves your region, and you still pay for it. It appears as DataTransfer-Regional-Bytes, and it is the line behind a lot of "my bill went up but my traffic did not" threads.

Prices here are US East (N. Virginia) list prices, checked on 2026-11-04 against AWS's public price list and the EC2 on-demand pricing page. Other regions differ. The example numbers are made up to show the arithmetic, not taken from a real account.

What the line is

AWS documents the rate as $0.01 per GB in each direction for data moving between availability zones in the same region. Because the sender and the receiver each pay one side, a gigabyte that crosses an AZ boundary costs $0.02 in total. The same page documents that traffic to or from a public or Elastic IPv4 address in the same region is charged at the same rate, even if both ends are in one AZ.

The line is easy to miss because the unit price is small and the quantity is huge, and nothing about it says "something is crossing zones".

A made-up month

DataTransfer-Regional-Bytes   25,000 GB x $0.01 = $250.00

Now imagine one pair of chatty services where each side sends 3,000 GB a month to the other across zones: 6,000 GB crossing, and 6,000 x $0.02 = $120.00 a month. The line shows it as 12,000 GB, because each crossing is counted on the sending side and again on the receiving side. That is $120.00 from two services that look idle on a dashboard.

Where it comes from

The pattern is usually not one big mistake but good practice applied everywhere:

  • Multi-AZ everything. Calls between your own services that land on a target or node in a different zone (a client reaching a network load balancer node, service to service by IP, a cross-zone NLB) pay on both sides. At high call volume, that share is billed. Check how your load balancer type is billed before you blame it.
  • Replicas in another AZ. Databases and caches replicate across zones for availability (worth keeping), and clients that read from a replica in a different zone than the app pay on every read.
  • Message and log pipelines. Kafka/MSK, OpenSearch and log shippers replicate or forward between zones.
  • One NAT gateway shared across zones. Private subnets in other AZs reach the single gateway across a zone boundary, so each byte pays regional transfer on top of the $0.045 per GB NAT processing charge.
  • Public or Elastic IPs used inside the region. Services calling each other by public address pay both sides even in the same AZ. Private IPs avoid that.

How to find which pair is responsible

You cannot fix this by looking at the bill alone, so do not change topology blind. Things to try, in order of cost:

  1. In Cost Explorer, daily granularity, usage type DataTransfer-Regional-Bytes. A line that steps on a deploy day points at a new call pattern; a slope that follows traffic points at general chatter.
  2. If you have the Cost and Usage Report with resource IDs, group by resource to see which instance, load balancer or NAT gateway is on the line.
  3. VPC Flow Logs for a day on the suspect subnets, with the AZ and the addresses, show which pairs talk the most across zones. They cost money themselves, so keep the window short.

What to change, and what to leave alone

Cross-AZ traffic is often the price of availability, so the goal is to remove the accidental share, not to put everything in one zone.

  • Use private IPs for in-region calls between your own services instead of public or Elastic ones.
  • Where your load balancer or client library supports zone-aware routing, keeping calls in the caller's zone removes most of the crossing for stateless services. Check how your stack does this and test it, because it changes load distribution.
  • Give each AZ its own NAT gateway route (one per zone) so private subnets do not cross a zone to reach it. That adds hourly charges ($0.045 per gateway-hour, $32.85 a month), so compare the two with your own numbers.
  • Keep read replicas in the same zone as the readers only if you accept the availability trade-off.

Make one change, watch the daily line for three days, then do the next.

The short version

DataTransfer-Regional-Bytes is $0.01 per GB each direction, so $0.02 per GB crossing a zone. Find the pair of services responsible with the daily view and flow logs, remove the accidental crossings (public IPs, a shared NAT, unaware load balancing), and keep the crossings that buy you availability.

The page for this line has the sources and the steps: DataTransfer-Regional-Bytes explained. It also has an upload box that reads your own Cost Explorer or CUR CSV in the browser and shows this line with the dollars for your account.

Find this line in your own bill

Drop in a Cost Explorer or CUR CSV. Billtrim reads it in your browser and shows the dollars and the steps for your numbers.

See a sample result

Paste your export: how to export a Cost Explorer CSV or CUR file in two minutes.