How-to Get [Query] AWS EC2 Instance Metadata
Posted on March 11, 2021 (Last modified on July 14, 2022) • 8 min read • 1,666 wordsIn this tutorial we will learn how to get EC2 Instance Metadata from an AWS EC2 instance. We will get the metadata using ec2-metadata and ec2 metadata. This is not typo. The tools name is really similar but one of them using dash on its name.
In this tutorial, we will learn how to get EC2 Instance Metadata from an AWS EC2 instance. We will get the metadata using ec2-metadata and ec2 metadata. This is not a typo. The tool’s name is really similar but one of them using dash on its name.
First of all let’s install ec2-metadata tool.
Download the script using the command below.
wget http:<span class="hljs-regexp">//</span>s3.amazonaws.com<span class="hljs-regexp">/ec2metadata/</span>ec2-metadata
```bash
Move the script to the `/usr/local/bin/` directory.
```bash
sudo mv ec2-metadata /usr/<span class="hljs-keyword">local</span>/bin
Change the permission of the script so we can use the script.
chmod u+x <span class="hljs-regexp">/usr/</span>local<span class="hljs-regexp">/bin/</span>ec2-metadata
```bash
### Using EC2 Instance Metadata Query Tool Outside EC2 Instance {#using-ec2-instance-metadata-query-tool-outside-ec2-instance}
If you run ec2-metadata outside EC2 instance you will get the error message below.
```bash
[ERROR] Command <span class="hljs-keyword">not</span> valid outside EC2 <span class="hljs-keyword">instance</span>. Please run <span class="hljs-keyword">this</span> command <span class="hljs-keyword">within</span> a running EC2 <span class="hljs-keyword">instance</span>.
When we run ec2-metadata
from an EC2 instance without any option, the help page will be printed.
$ ec2-metadata v0.1.1
Use to retrieve EC2<span class="hljs-built_in"> instance </span>metadata from within a running EC2 instance.
e.g. to retrieve<span class="hljs-built_in"> instance </span>id: ec2-metadata -i
to retrieve ami id: ec2-metadata -a
to get help: ec2-metadata --help
For more information on Amazon EC2<span class="hljs-built_in"> instance </span>meta-data, refer to the documentation at
http://docs.amazonwebservices.com/AWSEC2/2008-05-05/DeveloperGuide/AESDG-chapter-instancedata.html
Usage: ec2-metadata <option>
Options:
--all Show all metadata information for this host (also default).
-a/--ami-id The AMI ID used to launch this<span class="hljs-built_in"> instance
</span>-l/--ami-launch-index The index of this<span class="hljs-built_in"> instance </span>in the reservation (per AMI).
-m/--ami-manifest-path The manifest path of the AMI with which the<span class="hljs-built_in"> instance </span>was launched.
-n/--ancestor-ami-ids The AMI IDs of any instances that were rebundled to create this AMI.
-b/--block-device-mapping Defines native device names to use when exposing virtual devices.
-i/--instance-id The ID of this<span class="hljs-built_in"> instance
</span>-t/--instance-type The type of<span class="hljs-built_in"> instance </span>to launch. For more information, see Instance Types.
-h/--local-hostname The local hostname of the instance.
-o/--local-ipv4 Public IP address<span class="hljs-built_in"> if </span>launched with direct addressing;<span class="hljs-keyword"> private</span> IP address<span class="hljs-built_in"> if </span>launched with<span class="hljs-keyword"> public</span> addressing.
-k/--kernel-id The ID of the kernel launched with this instance,<span class="hljs-built_in"> if </span>applicable.
-z/--availability-zone The availability zone in which the<span class="hljs-built_in"> instance </span>launched. Same as placement
-c/--product-codes Product codes associated with this instance.
-p/--public-hostname The<span class="hljs-keyword"> public</span> hostname of the instance.
-v/--public-ipv4 NATted<span class="hljs-keyword"> public</span> IP Address
-u/--public-keys Public keys. Only available<span class="hljs-built_in"> if </span>supplied at<span class="hljs-built_in"> instance </span>launch time
-r/--ramdisk-id The ID of the RAM disk launched with this instance,<span class="hljs-built_in"> if </span>applicable.
-e/--reservation-id ID of the reservation.
-s/--security-groups Names of the security groups the<span class="hljs-built_in"> instance </span>is launched in. Only available<span class="hljs-built_in"> if </span>supplied at<span class="hljs-built_in"> instance </span>launch time
-d/--user-data User-supplied data.Only available<span class="hljs-built_in"> if </span>supplied at<span class="hljs-built_in"> instance </span>launch time.
```bash
### Get The AMI ID used to launch this instance using ec2-metadata {#get-the-ami-id-used-to-launch-this-instance-using-ec2-metadata}
```bash
$ ec2-metadata -a
ami-<span class="hljs-attribute">id:</span><span class="hljs-string"> ami</span><span class="hljs-number">-002</span>fe7e709bf81e3a
$ ec2-metadata -l
ami-<span class="hljs-built_in">launch</span>-index: <span class="hljs-number">0</span>
```bash
### Get The manifest path of the AMI with which the instance was launched. {#get-the-manifest-path-of-the-ami-with-which-the-instance-was-launched-}
```bash
$ ec2-metadata -m
ami-manifest-<span class="hljs-built_in">path</span>: (unknown)
<span class="hljs-variable">$ </span>ec2-metadata -n
ancestor-ami-<span class="hljs-symbol">ids:</span> <span class="hljs-keyword">not</span> available
```bash
### Get Defines native device names to use when exposing virtual devices. {#get-defines-native-device-names-to-use-when-exposing-virtual-devices-}
```bash
$ ec2-metadata -b
block-device-mapping:
<span class="hljs-symbol"> ami:</span> <span class="hljs-meta-keyword">/dev/</span>sda1
<span class="hljs-symbol"> root:</span> <span class="hljs-meta-keyword">/dev/</span>sda1
$ ec2-metadata -<span class="hljs-built_in">i</span>
instance-id: <span class="hljs-built_in">i</span><span class="hljs-number">-043</span>c348f4bc24b818
```bash
### Get Instance Type using ec2-metadata {#get-instance-type-using-ec2-metadata}
```bash
$ ec2-metadata -t
<span class="hljs-title">instance</span>-<span class="hljs-keyword">type</span>: t2.nano
$ ec2-metadata -h
local-hostname: ip<span class="hljs-string">-172</span><span class="hljs-string">-31</span><span class="hljs-string">-16</span><span class="hljs-string">-47</span>.ap-southeast<span class="hljs-string">-1</span>.compute.internal
```bash
### Get Private / Local IP of EC2 Instance {#get-private-local-ip-of-ec2-instance}
```bash
$ ec2-metadata -o
local-ipv4: <span class="hljs-number">172.31</span><span class="hljs-meta">.16</span><span class="hljs-meta">.47</span>
$ ec2-metadata -k
kernel-<span class="hljs-built_in">id</span>: <span class="hljs-keyword">not</span> available
```bash
### Get Availability Zone Of the EC2 Instance {#get-availability-zone-of-the-ec2-instance}
```bash
$ ec2-metadata -<span class="hljs-built_in">z</span>
<span class="hljs-symbol">placement:</span> ap-southeast<span class="hljs-number">-1</span>a
<span class="hljs-variable">$ </span>ec2-metadata -c
product-<span class="hljs-symbol">codes:</span> <span class="hljs-keyword">not</span> available
```bash
### Get Public Hostname of the EC2 Instance {#get-public-hostname-of-the-ec2-instance}
```bash
$ ec2-metadata -<span class="hljs-selector-tag">p</span>
public-hostname: ec2-<span class="hljs-number">13</span>-<span class="hljs-number">229</span>-<span class="hljs-number">225</span>-<span class="hljs-number">234</span><span class="hljs-selector-class">.ap-southeast-1</span><span class="hljs-selector-class">.compute</span><span class="hljs-selector-class">.amazonaws</span><span class="hljs-selector-class">.com</span>
$ ec2-metadata -v
<span class="hljs-meta">public</span>-ipv4: <span class="hljs-number">13.229</span><span class="hljs-meta">.225</span><span class="hljs-meta">.234</span>
```bash
### Get Public Key of the EC2 Instance {#get-public-key-of-the-ec2-instance}
```bash
$ ec2-metadata -u
<span class="hljs-keyword">public</span>-<span class="hljs-string">keys:</span>
<span class="hljs-string">keyname:</span>testing
<span class="hljs-string">index:</span><span class="hljs-number">0</span>
<span class="hljs-string">format:</span>openssh-key
<span class="hljs-string">key:</span>(begins from next line)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCV03OY7jrv<span class="hljs-regexp">/6rQyPL3ffsQcw7ENGixKFUpxaCXjIV1pD23rD9lb+mgX7OCBUsO4eXUUIPdr1ygh3o3AosM2CUv/</span>pUexb4L2Mg2NkNyHQdfcGPQod0OFiw<span class="hljs-regexp">/bOd02FOD/</span>oBxXQIl5UOuiXhfxEwZ5P3Hn1XaTwIMnT37e3gyfhif4XW9WKemCwCmSkPMvhEDYa0ymZElXvQ8YfkGWANktHj52de0b68D0Iwg6IVJbv9rqRcHVXk2Wp9V2X0cMLs8v9UYd4N0GmDB8FBC<span class="hljs-regexp">/ZAttWi6ESF0EKWv4jy/</span><span class="hljs-number">94</span>EDP1nw9jD8tZnWiGV69vk/wKAoYI3BpZ6tAOTd82NdtFCWngrt testing
$ ec2-metadata -r
ramdisk-<span class="hljs-built_in">id</span>: <span class="hljs-keyword">not</span> available
```bash
### Get Reservation ID using ec2-metadata {#get-reservation-id-using-ec2-metadata}
```bash
$ ec2-metadata <span class="hljs-_">-e</span>
reservation-id: r-0589<span class="hljs-built_in">fc</span>9d835e37094
$ ec2-metadata -<span class="hljs-built_in">s</span>
security-groups: <span class="hljs-keyword">test</span>-<span class="hljs-keyword">cluster</span>
```bash
### Get User-supplied data. Only available if supplied at instance launch time. {#get-user-supplied-data-only-available-if-supplied-at-instance-launch-time-}
```bash
<span class="hljs-variable">$ </span>ec2-metadata -d
user-<span class="hljs-symbol">data:</span> <span class="hljs-keyword">not</span> available
$ ec2-metadata --all
ami-<span class="hljs-string">id:</span> ami<span class="hljs-number">-002</span>fe7e709bf81e3a
ami-launch-<span class="hljs-string">index:</span> <span class="hljs-number">0</span>
ami-manifest-<span class="hljs-string">path:</span> (unknown)
ancestor-ami-<span class="hljs-string">ids:</span> not available
block-device-<span class="hljs-string">mapping:</span>
<span class="hljs-symbol"> ami:</span> <span class="hljs-regexp">/dev/</span>sda1
<span class="hljs-symbol"> root:</span> <span class="hljs-regexp">/dev/</span>sda1
instance-<span class="hljs-string">id:</span> i<span class="hljs-number">-043</span>c348f4bc24b818
instance-<span class="hljs-string">type:</span> t2.nano
local-<span class="hljs-string">hostname:</span> ip<span class="hljs-number">-172</span><span class="hljs-number">-31</span><span class="hljs-number">-16</span><span class="hljs-number">-47.</span>ap-southeast<span class="hljs-number">-1.</span>compute.internal
local-<span class="hljs-string">ipv4:</span> <span class="hljs-number">172.31</span><span class="hljs-number">.16</span><span class="hljs-number">.47</span>
kernel-<span class="hljs-string">id:</span> not available
<span class="hljs-string">placement:</span> ap-southeast<span class="hljs-number">-1</span>a
product-<span class="hljs-string">codes:</span> not available
<span class="hljs-keyword">public</span>-<span class="hljs-string">hostname:</span> ec2<span class="hljs-number">-13</span><span class="hljs-number">-229</span><span class="hljs-number">-225</span><span class="hljs-number">-234.</span>ap-southeast<span class="hljs-number">-1.</span>compute.amazonaws.com
<span class="hljs-keyword">public</span>-<span class="hljs-string">ipv4:</span> <span class="hljs-number">13.229</span><span class="hljs-number">.225</span><span class="hljs-number">.234</span>
<span class="hljs-keyword">public</span>-<span class="hljs-string">keys:</span>
<span class="hljs-string">keyname:</span>testing
<span class="hljs-string">index:</span><span class="hljs-number">0</span>
<span class="hljs-string">format:</span>openssh-key
<span class="hljs-string">key:</span>(begins from next line)
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCV03OY7jrv<span class="hljs-regexp">/6rQyPL3ffsQcw7ENGixKFUpxaCXjIV1pD23rD9lb+mgX7OCBUsO4eXUUIPdr1ygh3o3AosM2CUv/</span>pUexb4L2Mg2NkNyHQdfcGPQod0OFiw<span class="hljs-regexp">/bOd02FOD/</span>oBxXQIl5UOuiXhfxEwZ5P3Hn1XaTwIMnT37e3gyfhif4XW9WKemCwCmSkPMvhEDYa0ymZElXvQ8YfkGWANktHj52de0b68D0Iwg6IVJbv9rqRcHVXk2Wp9V2X0cMLs8v9UYd4N0GmDB8FBC<span class="hljs-regexp">/ZAttWi6ESF0EKWv4jy/</span><span class="hljs-number">94</span>EDP1nw9jD8tZnWiGV69vk/wKAoYI3BpZ6tAOTd82NdtFCWngrt testing
ramdisk-<span class="hljs-string">id:</span> not available
reservation-<span class="hljs-string">id:</span> r<span class="hljs-number">-0589</span>fc9d835e37094
security-<span class="hljs-string">groups:</span> test-cluster
user-<span class="hljs-string">data:</span> not available
```bash
## Using ec2metadata
`ec2metadata` (without dash) should already installed on Ubuntu / Amazon Linux based instance.
To test whether this command already exist or not we can use the `--help` option.
```bash
$ ec2metadata --help
Syntax: /usr/bin/ec2metadata [options]
Query<span class="hljs-built_in"> and </span>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<span class="hljs-built_in"> instance </span>id
--instance-type display the<span class="hljs-built_in"> instance </span>type
--local-hostname display the local hostname
--public-hostname display the<span class="hljs-keyword"> public</span> hostname
--local-ipv4 display the local ipv4 ip address
--public-ipv4 display the<span class="hljs-keyword"> public</span> ipv4 ip address
--block-device-mapping display the block device id
--security-groups display the security groups
--mac display the<span class="hljs-built_in"> instance </span>mac address
--profile display the<span class="hljs-built_in"> instance </span>profile
--instance-action display the<span class="hljs-built_in"> instance-action
</span>
--public-keys display the openssh<span class="hljs-keyword"> public</span> keys
--user-data display the user data (not actually metadata)
-u | --url URL use URL (default: http://169.254.169.254/2009-04-04)
The the next sections we will learn to use each option of ec2metadata
command to see the output sample.
$ ec2metadata <span class="hljs-comment">--kernel-id</span>
unavailable
```bash
### Get Ramdisk ID of an EC2 Instance {#get-ramdisk-id-of-an-ec2-instance}
```bash
$ ec2metadata <span class="hljs-comment">--ramdisk-id</span>
unavailable
$ ec2metadata <span class="hljs-comment">--reservation-id</span>
r-<span class="hljs-number">0589</span>fc9d835e37094
```bash
### Get AMI ID of an EC2 Instance {#get-ami-id-of-an-ec2-instance}
```bash
$ ec2metadata <span class="hljs-comment">--ami-id</span>
ami-<span class="hljs-number">002</span>fe7e709bf81e3a
$ ec2metadata <span class="hljs-comment">--ami-launch-index</span>
<span class="hljs-number">0</span>
```bash
### Get AMI Manifest Path of an EC2 Instance {#get-ami-manifest-path-of-an-ec2-instance}
```bash
$ ec2metadata <span class="hljs-comment">--ami-manifest-path</span>
(unknown)
$ ec2metadata <span class="hljs-comment">--ancestor-ami-ids</span>
unavailable
```bash
### Get Product Codes of an EC2 Instance {#get-product-codes-of-an-ec2-instance}
```bash
$ ec2metadata <span class="hljs-comment">--product-codes</span>
unavailable
$ ec2metadata <span class="hljs-comment">--availability-zone</span>
ap-southeast<span class="hljs-number">-1</span><span class="hljs-keyword">a</span>
```bash
### Get Instance ID of an EC2 Instance {#get-instance-id-of-an-ec2-instance}
```bash
$ ec2metadata <span class="hljs-comment">--instance-id</span>
i-<span class="hljs-number">043</span>c348f4bc24b818
$ ec2metadata --instance-<span class="hljs-class"><span class="hljs-keyword">type</span></span>
t2.nano
```bash
### Get Local Hostname of an EC2 Instance {#get-local-hostname-of-an-ec2-instance}
```bash
$ ec2metadata --local-hostname
ip<span class="hljs-number">-172</span><span class="hljs-number">-31</span><span class="hljs-number">-16</span><span class="hljs-number">-47.</span>ap-southeast<span class="hljs-number">-1.</span>compute.internal
$ ec2metadata --public-hostname
ec2<span class="hljs-number">-13</span><span class="hljs-number">-229</span><span class="hljs-number">-225</span><span class="hljs-number">-234.</span>ap-southeast<span class="hljs-number">-1.</span>compute.amazonaws.com
```bash
### Get Private IPv4 / Local IPv4 of an EC2 Instance {#get-private-ipv4-local-ipv4-of-an-ec2-instance}
```bash
$ ec2metadata --local-ipv4
<span class="hljs-number">172.31</span><span class="hljs-number">.16</span><span class="hljs-number">.47</span>
$ ec2metadata --public-ipv4
<span class="hljs-number">13.229</span><span class="hljs-number">.225</span><span class="hljs-number">.234</span>
```bash
### Get Block Device Mapping Info of an EC2 Instance {#get-block-device-mapping-info-of-an-ec2-instance}
```bash
$ ec2metadata <span class="hljs-comment">--block-device-mapping</span>
ami
root
$ ec2metadata --security-groups
<span class="hljs-keyword">test</span>-<span class="hljs-keyword">cluster</span>
```bash
### Get Mac Address of an EC2 Instance {#get-mac-address-of-an-ec2-instance}
```bash
$ ec2metadata <span class="hljs-comment">--mac</span>
unavailable
$ ec2metadata <span class="hljs-comment">--profile</span>
<span class="hljs-keyword">default</span>-hvm
```bash
### Get Instance Action of an EC2 Instance {#get-instance-action-of-an-ec2-instance}
```bash
$ ec2metadata --instance-<span class="hljs-keyword">action</span>
<span class="hljs-keyword">none</span>
$ ec2metadata --public-keys
['ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCV03OY7jrv/6rQyPL3ffsQcw7ENGixKFUpxaCXjIV1pD23rD9lb+mgX7OCBUsO4eXUUIPdr1ygh3o3AosM2CUv/pUexb4L2Mg2NkNyHQdfcGPQod0OFiw/bOd02FOD/oBxXQIl5UOuiXhfxEwZ5P3Hn1XaTwIMnT37e3gyfhif4XW9WKemCwCmSkPMvhEDYa0ymZElXvQ8YfkGWANktHj52de0b68D0Iwg6IVJbv9rqRcHVXk2Wp9V2X0cMLs8v9UYd4N0GmDB8FBC/ZAttWi6ESF0EKWv4jy/94EDP1nw9jD8tZnWiGV69vk/wKAoYI3BpZ6tAOTd82NdtFCWngrt testing']
```bash
### Get User Data of an EC2 Instance {#get-user-data-of-an-ec2-instance}
```bash
ec2metadata <span class="hljs-comment">--user-data</span>
If you’re wondering which package providing the ec2metadata
tool in Ubuntu, you can use the command below.
dpkg -S <span class="hljs-regexp">/usr/</span>bin<span class="hljs-regexp">/ec2metadata</span>
```bash
cloud-guest-utils: /usr/bin/ec2metadata
To see the `cloud-guest-utils` package installed we can use the command below
```bash
$ dpkg -l | grep cloud-guest-utils
ii cloud-guest-utils <span class="hljs-number">0.31</span><span class="hljs-number">-7</span>-gd99b2d76<span class="hljs-number">-0</span>ubuntu1 all cloud guest utilities
We can also see the list of files in the cloud-guest-utils
package using the command below.
$ dpkg -L cloud-guest-utils
/.
/usr
<span class="hljs-meta-keyword">/usr/</span>bin
<span class="hljs-meta-keyword">/usr/</span>bin/ec2metadata
<span class="hljs-meta-keyword">/usr/</span>bin/growpart
<span class="hljs-meta-keyword">/usr/</span>bin/vcs-run
<span class="hljs-meta-keyword">/usr/</span>share
<span class="hljs-meta-keyword">/usr/</span>share/doc
<span class="hljs-meta-keyword">/usr/</span>share<span class="hljs-meta-keyword">/doc/</span>cloud-guest-utils
<span class="hljs-meta-keyword">/usr/</span>share<span class="hljs-meta-keyword">/doc/</span>cloud-guest-utils/changelog.Debian.gz
<span class="hljs-meta-keyword">/usr/</span>share<span class="hljs-meta-keyword">/doc/</span>cloud-guest-utils/copyright
<span class="hljs-meta-keyword">/usr/</span>share/man
<span class="hljs-meta-keyword">/usr/</span>share<span class="hljs-meta-keyword">/man/</span>man1
<span class="hljs-meta-keyword">/usr/</span>share<span class="hljs-meta-keyword">/man/</span>man1/growpart<span class="hljs-number">.1</span>.gz
```bash
## References {#references}
* [EC2 Instance Metadata Query Tool][1]
[1]: https://aws.amazon.com/code/ec2-instance-metadata-query-tool/