How can I find out the instance id
of an ec2 instance from within the ec2 instance?
问题:
回答1:
See the EC2 documentation on the subject.
Run:
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
If you need programatic access to the instance ID from within a script,
die() { status=$1; shift; echo \"FATAL: $*\"; exit $status; }
EC2_INSTANCE_ID=\"`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id || die \\\"wget instance-id has failed: $?\\\"`\"
An example of a more advanced use (retrieve instance ID as well as availability zone and region, etc.):
EC2_INSTANCE_ID=\"`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id || die \\\"wget instance-id has failed: $?\\\"`\"
test -n \"$EC2_INSTANCE_ID\" || die \'cannot obtain instance-id\'
EC2_AVAIL_ZONE=\"`wget -q -O - http://169.254.169.254/latest/meta-data/placement/availability-zone || die \\\"wget availability-zone has failed: $?\\\"`\"
test -n \"$EC2_AVAIL_ZONE\" || die \'cannot obtain availability-zone\'
EC2_REGION=\"`echo \\\"$EC2_AVAIL_ZONE\\\" | sed -e \'s:\\([0-9][0-9]*\\)[a-z]*\\$:\\\\1:\'`\"
You may also use curl
instead of wget
, depending on what is installed on your platform.
回答2:
On Amazon Linux AMIs you can do:
$ ec2-metadata -i
instance-id: i-1234567890abcdef0
Or, on Ubuntu and some other linux flavours, ec2metadata --instance-id
(This command may not be installed by default on ubuntu, but you can add it with sudo apt-get install cloud-utils
)
As its name suggests, you can use the command to get other useful metadata too.
回答3:
On Ubuntu you can:
sudo apt-get install cloud-utils
And then you can:
EC2_INSTANCE_ID=$(ec2metadata --instance-id)
You can get most of the metadata associated with the instance this way:
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)
回答4:
Use the /dynamic/instance-identity/document
URL if you also need to query more than just your instance ID.
wget -q -O - http://169.254.169.254/latest/dynamic/instance-identity/document
This will get you JSON data such as this - with only a single request.
{
\"devpayProductCodes\" : null,
\"privateIp\" : \"10.1.2.3\",
\"region\" : \"us-east-1\",
\"kernelId\" : \"aki-12345678\",
\"ramdiskId\" : null,
\"availabilityZone\" : \"us-east-1a\",
\"accountId\" : \"123456789abc\",
\"version\" : \"2010-08-31\",
\"instanceId\" : \"i-12345678\",
\"billingProducts\" : null,
\"architecture\" : \"x86_64\",
\"imageId\" : \"ami-12345678\",
\"pendingTime\" : \"2014-01-23T45:01:23Z\",
\"instanceType\" : \"m1.small\"
}
回答5:
For .NET
People :
string instanceId = new StreamReader(
HttpWebRequest.Create(\"http://169.254.169.254/latest/meta-data/instance-id\")
.GetResponse().GetResponseStream())
.ReadToEnd();
回答6:
For Python:
import boto.utils
region=boto.utils.get_instance_metadata()[\'local-hostname\'].split(\'.\')[1]
which boils down to the one-liner:
python -c \"import boto.utils; print boto.utils.get_instance_metadata()[\'local-hostname\'].split(\'.\')[1]\"
Instead of local_hostname you could also use public_hostname, or:
boto.utils.get_instance_metadata()[\'placement\'][\'availability-zone\'][:-1]
回答7:
on AWS Linux:
ec2-metadata --instance-id | cut -d \" \" -f 2
Output:
i-33400429
Using in variables:
ec2InstanceId=$(ec2-metadata --instance-id | cut -d \" \" -f 2);
ls \"log/${ec2InstanceId}/\";
回答8:
For powershell people:
(New-Object System.Net.WebClient).DownloadString(\"http://169.254.169.254/latest/meta-data/instance-id\")
回答9:
See this post - note that the IP address in the URL given is constant (which confused me at first), but the data returned is specific to your instance.
回答10:
A more contemporary solution.
From Amazon Linux the ec2-metadata command is already installed.
From the terminal
ec2-metadata -help
Will give you the available options
ec2-metadata -i
will return
instance-id: yourid
回答11:
Just Type:
ec2metadata --instance-id
回答12:
You can try this:
#!/bin/bash
aws_instance=$(wget -q -O- http://169.254.169.254/latest/meta-data/instance-id)
aws_region=$(wget -q -O- http://169.254.169.254/latest/meta-data/hostname)
aws_region=${aws_region#*.}
aws_region=${aws_region%%.*}
aws_zone=`ec2-describe-instances $aws_instance --region $aws_region`
aws_zone=`expr match \"$aws_zone\" \".*\\($aws_region[a-z]\\)\"`
回答13:
For 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]
回答14:
For all ec2 machines, the instance-id can be found in file:
/var/lib/cloud/data/instance-id
You can also get instance id by running the following command:
ec2metadata --instance-id
回答15:
A c# .net class I wrote for EC2 metadata from the http api. I will build it up with functionality as needed. You can run with it if you like it.
using Amazon;
using System.Net;
namespace AT.AWS
{
public static class HttpMetaDataAPI
{
public static bool TryGetPublicIP(out string publicIP)
{
return TryGetMetaData(\"public-ipv4\", out publicIP);
}
public static bool TryGetPrivateIP(out string privateIP)
{
return TryGetMetaData(\"local-ipv4\", out privateIP);
}
public static bool TryGetAvailabilityZone(out string availabilityZone)
{
return TryGetMetaData(\"placement/availability-zone\", out availabilityZone);
}
/// <summary>
/// Gets the url of a given AWS service, according to the name of the required service and the AWS Region that this machine is in
/// </summary>
/// <param name=\"serviceName\">The service we are seeking (such as ec2, rds etc)</param>
/// <remarks>Each AWS service has a different endpoint url for each region</remarks>
/// <returns>True if the operation was succesful, otherwise false</returns>
public static bool TryGetServiceEndpointUrl(string serviceName, out string serviceEndpointStringUrl)
{
// start by figuring out what region this instance is in.
RegionEndpoint endpoint;
if (TryGetRegionEndpoint(out endpoint))
{
// now that we know the region, we can get details about the requested service in that region
var details = endpoint.GetEndpointForService(serviceName);
serviceEndpointStringUrl = (details.HTTPS ? \"https://\" : \"http://\") + details.Hostname;
return true;
}
// satisfy the compiler by assigning a value to serviceEndpointStringUrl
serviceEndpointStringUrl = null;
return false;
}
public static bool TryGetRegionEndpoint(out RegionEndpoint endpoint)
{
// we can get figure out the region end point from the availability zone
// that this instance is in, so we start by getting the availability zone:
string availabilityZone;
if (TryGetAvailabilityZone(out availabilityZone))
{
// name of the availability zone is <nameOfRegionEndpoint>[a|b|c etc]
// so just take the name of the availability zone and chop off the last letter
var nameOfRegionEndpoint = availabilityZone.Substring(0, availabilityZone.Length - 1);
endpoint = RegionEndpoint.GetBySystemName(nameOfRegionEndpoint);
return true;
}
// satisfy the compiler by assigning a value to endpoint
endpoint = RegionEndpoint.USWest2;
return false;
}
/// <summary>
/// Downloads instance metadata
/// </summary>
/// <returns>True if the operation was successful, false otherwise</returns>
/// <remarks>The operation will be unsuccessful if the machine running this code is not an AWS EC2 machine.</remarks>
static bool TryGetMetaData(string name, out string result)
{
result = null;
try { result = new WebClient().DownloadString(\"http://169.254.169.254/latest/meta-data/\" + name); return true; }
catch { return false; }
}
/************************************************************
* MetaData keys.
* Use these keys to write more functions as you need them
* **********************************************************
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id
instance-type
local-hostname
local-ipv4
mac
metrics/
network/
placement/
profile
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups
*************************************************************/
}
}
回答16:
The latest Java SDK has EC2MetadataUtils
:
In Java:
import com.amazonaws.util.EC2MetadataUtils;
String myId = EC2MetadataUtils.getInstanceId();
In Scala:
import com.amazonaws.util.EC2MetadataUtils
val myid = EC2MetadataUtils.getInstanceId
回答17:
For C++ (using cURL):
#include <curl/curl.h>
//// cURL to string
size_t curl_to_str(void *contents, size_t size, size_t nmemb, void *userp) {
((std::string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
};
//// Read Instance-id
curl_global_init(CURL_GLOBAL_ALL); // Initialize cURL
CURL *curl; // cURL handler
CURLcode res_code; // Result
string response;
curl = curl_easy_init(); // Initialize handler
curl_easy_setopt(curl, CURLOPT_URL, \"http://169.254.169.254/latest/meta-data/instance-id\");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, curl_to_str);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
res_code = curl_easy_perform(curl); // Perform cURL
if (res_code != CURLE_OK) { }; // Error
curl_easy_cleanup(curl); // Cleanup handler
curl_global_cleanup(); // Cleanup cURL
回答18:
If you wish to get the all available instance id list using python here is the code:
import boto3
ec2=boto3.client(\'ec2\')
instance_information = ec2.describe_instances()
for reservation in instance_information[\'Reservations\']:
for instance in reservation[\'Instances\']:
print(instance[\'InstanceId\'])
回答19:
FWIW I wrote a FUSE filesystem to provide access to the EC2 metadata service: https://bitbucket.org/dgc/ec2mdfs . I run this on all custom AMIs; it allows me to use this idiom: cat /ec2/meta-data/ami-id
回答20:
In Go you can use the goamz package.
import (
\"github.com/mitchellh/goamz/aws\"
\"log\"
)
func getId() (id string) {
idBytes, err := aws.GetMetaData(\"instance-id\")
if err != nil {
log.Fatalf(\"Error getting instance-id: %v.\", err)
}
id = string(idBytes)
return id
}
Here\'s the GetMetaData source.
回答21:
Simply check the var/lib/cloud/instance
symlink, it should point to /var/lib/cloud/instances/{instance-id}
where {instance_id}
is your instance-id.
回答22:
You can just make a HTTP request to GET any Metadata by passing the your metadata parameters.
curl http://169.254.169.254/latest/meta-data/instance-id
or
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
You won\'t be billed for HTTP requests to get Metadata and Userdata.
Else
You can use EC2 Instance Metadata Query Tool which is a simple bash script that uses curl to query the EC2 instance Metadata from within a running EC2 instance as mentioned in documentation.
Download the tool:
$ wget http://s3.amazonaws.com/ec2metadata/ec2-metadata
now run command to get required data.
$ec2metadata -i
Refer:
http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
https://aws.amazon.com/items/1825?externalID=1825
Happy To Help.. :)
回答23:
In the question you have mentioned the user as root, one thing I should mention is that the instance ID is not dependent on the user.
For Node developers,
var meta = new AWS.MetadataService();
meta.request(\"/latest/meta-data/instance-id\", function(err, data){
console.log(data);
});
回答24:
Alternative approach for PHP:
$instance = json_decode(file_get_contents(\'http://169.254.169.254/latest/dynamic/instance-identity/document\'),true);
$id = $instance[\'instanceId\'];
print_r($instance);
That will provide a lot of data about the instance, all nicely packed in an array, no external dependencies. As it\'s a request that never failed or delayed for me it should be safe to do it that way, otherwise I\'d go for curl()
回答25:
For PHP:
$instance = json_decode(file_get_contents(\'http://169.254.169.254/latest/dynamic/instance-identity/document));
$id = $instance[\'instanceId\'];
Edit per @John
回答26:
Run this:
curl http://169.254.169.254/latest/meta-data/
You will be able to see different types of attributes which are provided by aws.
Use this link to view more
回答27:
To get the instance metadata use
get -q -O - http://169.254.169.254/latest/meta-data/instance-id