You should decouple the data transfer charge question from the Elastic IP address charge one, insofar they are completely independent from each other:
Elastic IP addresses
Allocating and using one Elastic IP addresses per instance is basically free, except if the Elastic IP address is not currently associated with an instance, see section Elastic IP Addresses on page Amazon EC2 Pricing:
The rationale behind this approach is explained in the respective FAQ Why am I charged when my Elastic IP address is not associated with an instance?:
In order to help ensure our customers are efficiently using the Elastic IP addresses, we impose a small hourly charge for each address when it is not associated to a running instance.
Data Transfer
Again, the key aspect is explained in section Data Transfer on page Amazon EC2 Pricing (and detailed by some FAQs):
You primarily pay for Internet Data Transfer, i.e. data transferred "in" and "out" of Amazon EC2, which specifically excludes the following:
There is no Data Transfer charge between Amazon EC2 and other Amazon
Web Services within the same region (i.e. between Amazon EC2 US West
and Amazon S3 in US West). Data transferred between Amazon EC2
instances located in different Availability Zones in the same Region
will be charged Regional Data Transfer. Data transferred between AWS
services in different regions will be charged as Internet Data
Transfer on both sides of the transfer.
Caveat
The important caveat to be aware of indeed follows below that statement though:
Public and Elastic IP and Elastic Load Balancing Data Transfer
- $0.01 per GB in/out – If you choose to communicate using your Public or Elastic IP address or Elastic Load Balancer inside of the Amazon
EC2 network, you’ll pay Regional Data Transfer rates even if the
instances are in the same Availability Zone. For data transfer within
the same Availability Zone, you can easily avoid this charge (and get
better network performance) by using your private IP whenever
possible.
Remedy
Not mentioned in the aforementioned paragraph is an important and quite helpful feature of the AWS DNS infrastructure though, see Public IP Addresses and External DNS Hostnames:
We provide each instance that has a public IP address with an external
DNS hostname. We resolve an external DNS hostname to the public IP
address of the instance outside the network of the instance, and to
the private IP address of the instance from within the network of the
instance.
That is, it's resolving the public DNS (e.g. ec2-xxx-xxx-xxx-xxx.compute-1.amazonaws.com
) to the Private IP address when you are using it inside the Amazon EC2 network, and to the Public or Elastic IP address when using it outside the Amazon EC2 network. Like so you get the free Availability Zone Data Transfer and reduced charge Regional Data Transfer automatically, e.g. they are actively applying their advise to Always use the internal address when you are communicating between Amazon EC2 instances [which] ensures that your network traffic follows the highest bandwidth, lowest cost, and lowest latency path through our network.
This obviously doesn't work, if you are using the IP addresses directly (i.e. without DNS), which is thus usually best avoided for this and other reasons in the context of EC2.