从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
使用它从实例本身执行。