I have a project wherein I need to update configuration files each time an EC2 instance is booted with the Public DNS address of the current instance. I'll be using Perl or Sed for this, so that's not really the question, but the real question is: is there a way that I can determine the instance's public DNS address? Is there an EC2 api that I can access from the instance to determine it?
Asked
Active
Viewed 2.5k times
4 Answers
32
There is. From inside the instance, you can run:
curl http://169.254.169.254/latest/meta-data/public-ipv4
To get the public DNS hostname, you can change that to:
curl http://169.254.169.254/latest/meta-data/public-hostname
You can get the private IP for the instance, too:
curl http://169.254.169.254/latest/meta-data/local-ipv4
As a side note, you can double-check it against a non-AWS site on the internet, like http://ip4.me
#!/bin/bash
pubip=$( curl http://ip4.me 2>/dev/null | sed -e 's#<[^>]*>##g' | grep '^[0-9]' )
echo $pubip
That will work, generally, to check the "public IP" of any NATed system, or to find your public proxy IP, etc.
And here's a good link to read up on the types of information you can get from Amazon's API: http://www.ducea.com/2009/06/01/howto-update-dns-hostnames-automatically-for-your-amazon-ec2-instances/
njbair
- 103
- 3
Tim Kennedy
- 19,369
- 4
- 38
- 58
-
1`PUBLIC_HOSTNAME="$(curl http://169.254.169.254/latest/meta-data/public-hostname 2>/dev/null)"` :) You, sir, are metal. – Naftuli Kay Nov 11 '11 at 03:26
-
glad to help :) – Tim Kennedy Nov 11 '11 at 03:28
2
I define this function inside my .bashrc to retrieve the public ip and dns:
export PUBLIC_DNS=`curl http://169.254.169.254/latest/meta-data/public-hostname 2>/dev/null`
export PUBLIC_IP=`curl http://169.254.169.254/latest/meta-data/public-ipv4 2>/dev/null`
function get-pub() {
if [ $# -ne 1 ]; then
echo "Invalid number of arguments"
return 1
else
case $1 in
dns)
echo $PUBLIC_DNS
;;
ip)
echo $PUBLIC_IP
;;
*)
echo $"Usage: get-pub {dns|ip}"
return 2
esac;
fi
return 0
}
y0n1
- 29
- 2
0
This will get the dns name by tag.
aws ec2 describe-instances --region us-east-2 --max-items 1 --filters "Name=tag:Name,Values=MyNameTag" --query 'Reservations[].Instances[].PublicDnsName' --output text