Consider the data transfer charges and Elastic IP charges separately.
Elastic IP addresses
Allocating and using one Elastic IP addresses per instance is normally free, except if the Elastic IP address is not currently associated with an instance, see section Elastic IP Addresses on page Amazon EC2 Pricing:
- $0.00 for one Elastic IP address related to a running instance
- $0.005 per additional Elastic IP address related to a running instance per hour on a pro rata basis
- $0.005 per Elastic science address not related to a running instance per hour on a pro rata basis
- $0.00 per Elastic IP address remap for the first one hundred remaps per month
- $0.10 per Elastic IP address remap for extra remaps over 100 per month
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 assist guarantee our customers are efficiently using the Elastic IP addresses, we impose a small hourly charge for each address when it is not associated with a running instance.
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 alternative Amazon Web Services among the same region (i.e. between Amazon EC2 us west and Amazon S3 in us west). Data transferred between Amazon EC2 instances located in several Availability Zones within the same Region are going to be charged Regional data Transfer. Data transferred between AWS services in several regions are going to be charged as internet data Transfer on each side of the transfer.
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 opt on to communicate using your Public or Elastic IP address or Elastic Load Balancer within the Amazon EC2 network, you’ll pay Regional Data Transfer rates even if the instances are within the same Availability Zone. For data transfer among the same Availability Zone, you can easily avoid this charge (and get better network performance) by using your private IP whenever possible.
Not mentioned within the aforementioned paragraph is an important and quite useful feature of the AWS DNS infrastructure though, see Public IP Addresses and External DNS Hostnames:
We provide every instance that contains 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 while you are using it within the Amazon EC2 network, and to the public or Elastic IP address while using it outside the Amazon EC2 network. Like this you get the free availability Zone data Transfer and reduced charge Regional data Transfer mechanically, e.g. they are actively applying their advice 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 price, 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.