When working with Amazon EC2 instances, you've probably experienced the need to change the default hostname to something more meaningful than "ip-10-205-14-33" for instance. While simply issuing a hostname command will do the trick, it requires login into the machine. If you also need to properly define the fqdn (fully qualified domain name) of the machine, it requires a modification of the /etc/hosts file as well or more if you've setup a DNS server.

Setting the desired hostname and fqdn for the instance can be critical if you're automating deployment with Chef and expect to retrieve those values later on. A simple approach is to pass user data when creating the instance and use a script to read it and populate the hostname.

Create a new instance from your favorite AMI. Save this script as /usr/local/ec2/


# Replace this with your domain

USER_DATA=</span>/usr/bin/curl -s<span class="sb"> HOSTNAME=</span><span class="nb">echo</span> <span class="nv">$USER_DATA</span><span class="sb"> IPV4=</span>/usr/bin/curl -s<span class="sb">

# Set the host name hostname $HOSTNAME echo $HOSTNAME > /etc/hostname

# Add fqdn to hosts file cat<<EOF > /etc/hosts

This file is automatically genreated by ec2-hostname script localhost $IPV4 $HOSTNAME.$DOMAIN $HOSTNAME

The following lines are desirable for IPv6 capable hosts

::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts EOF

Mark it as executable

$ chmod o+x

and add the following line to /etc/rc.local so that it runs every time the instance restart


Save this instance as a new AMI (easiest to do from the AWS console).

Next time you want to create a new instance, pass the desired hostname in the user-data option.

ec2-run-instances ami-99f510f1 --user-data "YOUR-HOSTNAME" \
  --instance-type t1.micro --group default --region us-east-1 \
  --key YOUR-KEY 

This technique was adapted from a more comprehensive example published by Marius Ducea.