How to automatically assign Elastic Ip to AWS EC2 instances


TL;DR

Install aws-ec2-assign-elastic-ip on the target instance – make it part of the AMI.

pip install aws-ec2-assign-elastic-ip

Add the following script in user data section

#!/bin/bash
/usr/local/bin/aws-ec2-assign-elastic-ip --access-key ACCESS_KEY --secret-key SECRET_KEY --valid-ips IP

Details

For those who are interested in how this all works, lets spent some time understanding the different terminologies.

So what is Elastic Ip and why do we need one?

As per Amazon’s documentation – http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html

An Elastic IP address is a static IPv4 address designed for dynamic cloud computing. An Elastic IP address is associated with your AWS account. With an Elastic IP address, you can mask the failure of an instance or software by rapidly remapping the address to another instance in your account.

An Elastic IP address is a public IPv4 address, which is reachable from the Internet. If your instance does not have a public IPv4 address, you can associate an Elastic IP address with your instance to enable communication with the Internet; for example, to connect to your instance from your local computer.

So an Elastic IP is part of the Amazon’s account and can be assigned at will to EC2 instances. One of the use cases where I needed an Elastic Ip was hosting an application on EC2 Spot Instances. As you can imagine there is no guarantee for how long the spot instance will remain alive, a new instance would have a new IP assigned to it making it really difficult to share the connection credentials to customer.

There were two solutions to the problem

  1. Use a service like DynDNS
  2. Use Elastic IP – a static IP that I can assign to the new Spot Instance that comes up when my bid is same or above the current spot instance pricing.

So I configured everything and got stuck at how can I assign the Elastic IP address to my instance automatically (or as soon as the machine is up) After some searching I came across a python module named aws-ec2-assign-elastic-ip, it is a command line idempotent utility that can assign an Elastic IP from the passed in pool of IPs to the machine running the command.

This utility can easily be installed using pip

pip install aws-ec2-assign-elastic-ip

We are going to use the user data field, which is available in advanced configurations of EC2 instance to put in a cloud-init script.

screen-shot-2017-02-06-at-9-39-33-pm

Here is the script that does the trick

#!/bin/bash
/usr/local/bin/aws-ec2-assign-elastic-ip --access-key ACCESS_KEY --secret-key SECRET_KEY --valid-ips IP

Notice the full path to the utility, this makes the script more robust as it doesn’t matter whether it is part of PATH or not.

Advertisements
How to automatically assign Elastic Ip to AWS EC2 instances

2 thoughts on “How to automatically assign Elastic Ip to AWS EC2 instances

  1. bryanus says:

    Nice script. But this will only assign the EIP for this particular instance during the configuration step and not if it is part of an AutoScaling Group, correct? It would be much more beneficial IMO if the instance could obtain a predetermined EIP when part of an ASG. This script doesn’t seem to automate things much more than simply manually assigning the EIP once the new instance is running.

    1. Faisal Feroz says:

      You can put this script in the User Data section of Launch Configurations so that whenever a new instance is launched this configuration gets enabled on that instance and you can get an elastic IP automatically assigned to it. Hope this helps.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s