从ec2机器中找出实例ID

如何从ec2机器(用户root)中find我的实例ID是什么?

请参阅有关该主题的EC2文档 。

跑:

wget -q -O - http://169.254.169.254/latest/meta-data/instance-id 

如果您需要从脚本内部编程访问实例ID,

 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: $?\"`" 

更高级用法的示例(检索实例ID以及可用区域和区域等):

 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]*\)[az]*\$:\\1:'`" 

您也可以使用curl而不是wget ,具体取决于平台上安装的内容。

在Amazon Linux AMI上,您可以执行以下操作:

 $ ec2-metadata -i instance-id: i-abcdef01 

顾名思义,您可以使用该命令获取其他有用的元数据。

在Ubuntu上,您可以:

 sudo apt-get install cloud-utils 

然后你可以:

 EC2_INSTANCE_ID=$(ec2metadata --instance-id) 

您可以通过这种方式获取与实例关联的大部分元数据:

 ec2metadata  - 帮助
语法:/ usr / bin / ec2metadata [选项]

查询和显示EC2元数据。

如果没有提供选项,将显示所有选项

选项:
     -h --help显示此帮助

     --kernel-id显示内核标识
     --ramdisk-id显示虚拟磁盘ID
     --reservation-id显示保留ID

     --ami-id显示ami id
     --ami-launch-index显示ami启动索引
     --ami-manifest-path显示ami清单path
     --ancestor-ami-id显示ami祖先的id
     - 产品代码显示ami相关的产品代码
     - 可用区显示ami放置区

     --instance-id显示实例ID
     --instance-type显示实例types

     --local-hostname显示本地主机名
     --public-hostname显示公共主机名

     --local-ipv4显示本地ipv4的ip地址
     --public-ipv4显示公网ipv4的ip地址

     --block-device-mapping显示块设备ID
     --security-groups显示安全组

     --mac显示实例mac地址
     --profile显示实例configuration文件
     --instance-action显示实例操作

     - 公共密钥显示openssh公钥
     --user-data显示用户数据(实际上不是元数据)

如果您还需要查询的不仅仅是您的实例ID,请使用/ dynamic / instance-identity / document

wget -q -O - http://169.254.169.254/latest/dynamic/instance-identity/document

这将使您得到像这样的JSON数据 – 只有一个请求

 { "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" } 

对于.NET人员:

 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] 

归结为一行:

 python -c "import boto.utils; print boto.utils.get_instance_metadata()['local-hostname'].split('.')[1]" 

而不是local_hostname,你也可以使用public_hostname,或者:

 boto.utils.get_instance_metadata()['placement']['availability-zone'][:-1] 

在AWS Linux上:

ec2-metadata --instance-id | cut -d " " -f 2

输出:

i-33400429

在variables中使用:

 ec2InstanceId=$(ec2-metadata --instance-id | cut -d " " -f 2); ls "log/${ec2InstanceId}/"; 

对于PowerShell人员:

 (New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/instance-id") 

看到这个post – 请注意,给定的URL中的IP地址是恒定的(起初让我困惑),但返回的数据是特定于您的实例的。

只要input:

 ec2metadata --instance-id 

更现代的解决scheme。

从Amazon Linux上已经安装了ec2-metadata命令。

从terminal

 ec2-metadata -help 

会给你可用的选项

 ec2-metadata -i 

将返回

 instance-id: yourid 

你可以试试这个:

 #!/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[az]\)"` 

对于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] 

一个c#.net类,我从http api为EC2元数据写的。 我将根据需要使用function进行构build。 如果你喜欢它,你可以运行它。

 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 *************************************************************/ } } 

最新的Java SDK有EC2MetadataUtils

在Java中:

 import com.amazonaws.util.EC2MetadataUtils; String myId = EC2MetadataUtils.getInstanceId(); 

在Scala中:

 import com.amazonaws.util.EC2MetadataUtils val myid = EC2MetadataUtils.getInstanceId 

对于C ++ (使用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 

FWIW我写了一个FUSE文件系统来提供对EC2元数据服务的访问: https : //bitbucket.org/dgc/ec2mdfs 。 我在所有定制的AMI上运行这个; 它允许我使用这个成语:cat / ec2 / meta-data / ami-id

在Go中,您可以使用goamz软件包 。

 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 } 

这里是 GetMetaData源代码。

只需检查var/lib/cloud/instance符号链接,它应指向/var/lib/cloud/instances/{instance-id}其中{instance_id}是您的实例标识。

对于PHP:

 $client = new GuzzleHttp\Client(); $res = $client->request('GET', 'http://169.254.169.254/latest/meta-data/instance-id'); $EC2_INSTANCE_ID = $res->getBody(); 

这需要你加载GuzzleHttp。 如果您使用的是composer,则可以运行以下命令来安装GuzzleHttp:

 composer require guzzlehttp/guzzle 

您可以通过传递元数据参数来发出HTTP请求来获取任何元数据。

 curl http://169.254.169.254/latest/meta-data/instance-id 

要么

 wget -q -O - http://169.254.169.254/latest/meta-data/instance-id 

您将不会收到HTTP请求来获取元数据和用户数据。

其他

您可以使用EC2实例元数据查询工具,该工具是一个简单的bash脚本,它使用curl从正在运行的EC2实例中查询EC2实例元数据,如文档中所述。

下载工具:

 $ wget http://s3.amazonaws.com/ec2metadata/ec2-metadata 

现在运行命令来获取所需的数据。

 $ec2metadata -i 

参考:

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

https://aws.amazon.com/items/1825?externalID=1825

乐于帮助.. :)

在这个问题中,您提到了root用户,我应该提到的一点是,实例ID不依赖于用户。

对于Node开发者,

 var meta = new AWS.MetadataService(); meta.request("/latest/meta-data/instance-id", function(err, data){ console.log(data); }); 

对于所有的ec2机器,instance-id可以在文件中find:

  /var/lib/cloud/data/instance-id 

您也可以通过运行以下命令来获取实例ID:

  ec2metadata --instance-id 

对于PowerShell:

 $secretKeyID="[Secret Key ID]" $secretAccessKeyID="[Secret Access Key ID]" Set-AWSCredentials -AccessKey $secretKeyID -SecretKey $secretAccessKeyID Set-DefaultAWSRegion -Region us-west-2 Get-EC2InstanceStatus 

使用它从实例本身执行。