
Every EC2 instance has associated metadata, which AWS makes available to all users & applications inside the instance. The instance ID is part of this metadata. Here’s a complete list of everything included in the metadata — Instance metadata categories. Run the following at a Bash prompt to get the instance ID:
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
The same can be captured in a variable for use in shell scripts like so:
EC2_INSTANCE_ID="`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`"
You can get a lot more info about the instance from its metadata, like its availability zone, region, etc.:
EC2_AVAIL_ZONE="`wget -q -O - http://169.254.169.254/latest/meta-data/placement/availability-zone`" EC2_REGION="`echo \"$EC2_AVAIL_ZONE\" | sed -e 's:\([0-9][0-9]*\)[a-z]*\$:\\1:'`"
cURL can also be used instead of wget:
curl http://169.254.169.254/latest/meta-data/
You can also use http://instance-data/
in place of http://169.254.169.254/
but only if you’re using Amazon’s DNS. If you need to fetch various details about the instance, try /dynamic/instance-identity/document
instead of making multiple calls to the metadata URL:
$ wget -q -O - http://169.254.169.254/latest/dynamic/instance-identity/document { "devpayProductCodes" : null, "privateIp" : "10.1.2.3", "region" : "us-east-1", "kernelId" : "aki-12345678", "ramdiskId" : null, "availabilityZone" : "us-east-1a", "accountId" : "123456789012", "version" : "2010-08-31", "instanceId" : "i-12345678", "billingProducts" : null, "architecture" : "x86_64", "imageId" : "ami-12345678", "pendingTime" : "2020-01-01T05:01:23Z", "instanceType" : "t2.small" }
These HTTP calls are not billed. The instance ID is also stored in /var/lib/cloud/data/instance-id
.
ec2-metadata
On Amazon Linux AMIs, you can use:
$ ec2-metadata -i instance-id: i-1234567890abcdef0
To catch it in a variable:
EC2_INSTANCE_ID=$(ec2-metadata --instance-id | cut -d " " -f 2);
Or on Ubuntu & other Linux flavors:
ec2metadata --instance-id
You might need to install this utility first:
sudo apt-get install cloud-utils
A LOT more is available using these utils:
ec2metadata --help Syntax: /usr/bin/ec2metadata [options] Query and display EC2 metadata. If no options are provided, all options will be displayed Options: -h --help show this help --kernel-id display the kernel id --ramdisk-id display the ramdisk id --reservation-id display the reservation id --ami-id display the ami id --ami-launch-index display the ami launch index --ami-manifest-path display the ami manifest path --ancestor-ami-ids display the ami ancestor id --product-codes display the ami associated product codes --availability-zone display the ami placement zone --instance-id display the instance id --instance-type display the instance type --local-hostname display the local hostname --public-hostname display the public hostname --local-ipv4 display the local ipv4 ip address --public-ipv4 display the public ipv4 ip address --block-device-mapping display the block device id --security-groups display the security groups --mac display the instance mac address --profile display the instance profile --instance-action display the instance-action --public-keys display the openssh public keys --user-data display the user data (not actually metadata)
.NET
Hit the same endpoint programmatically to fetch this info:
string instanceId = new StreamReader(HttpWebRequest .Create("http://169.254.169.254/latest/meta-data/instance-id") .GetResponse().GetResponseStream()).ReadToEnd();
Python
import boto.utils region = boto.utils.get_instance_metadata()['local-hostname'].split('.')[1]
Or at the command line as:
python -c "import boto.utils; print boto.utils.get_instance_metadata()['local-hostname'].split('.')[1]"
Another example:
boto.utils.get_instance_metadata()['placement']['availability-zone'][:-1]
JavaScript
new AWS.MetadataService().request('instance-id', (error, data) => instanceID = data)
PowerShell
(New-Object System.Net.WebClient) .DownloadString("http://169.254.169.254/latest/meta-data/instance-id")
Or simply:
$instanceId=(Invoke-WebRequest -Uri 'http://169.254.169.254/latest/meta-data/instance-id').Content
Ruby
require 'rubygems' require 'aws-sdk' require 'net/http' metadata_endpoint = 'http://169.254.169.254/latest/meta-data/' instance_id = Net::HTTP.get( URI.parse( metadata_endpoint + 'instance-id' ) ) ec2 = AWS::EC2.new() instance = ec2.instances[instance_id]
Java
import com.amazonaws.util.EC2MetadataUtils; String myId = EC2MetadataUtils.getInstanceId();
Scala
import com.amazonaws.util.EC2MetadataUtils val myid = EC2MetadataUtils.getInstanceId
Go
import ("github.com/mitchellh/goamz/aws") idBytes, err := aws.GetMetaData("instance-id") id = string(idBytes)
PHP
$instance = json_decode(file_get_contents( 'http://169.254.169.254/latest/dynamic/instance-identity/document'),true); $id = $instance['instanceId']; print_r($instance);