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);