如何instance id
从ec2实例中找出ec2实例?
请参阅有关该主题的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]*\)[a-z]*\$:\\1:'`"
您也可以使用,curl
而不是wget
根据平台上安装的内容.
在Amazon Linux AMI上,您可以:
$ ec2-metadata -i instance-id: i-1234567890abcdef0
或者,在Ubuntu和其他一些Linux风格上,ec2metadata --instance-id
(默认情况下,这个命令可能不会安装在ubuntu上,但你可以添加它sudo apt-get install cloud-utils
)
顾名思义,您也可以使用该命令获取其他有用的元数据.
在Ubuntu上你可以:
sudo apt-get install cloud-utils
然后你可以:
EC2_INSTANCE_ID=$(ec2metadata --instance-id)
您可以通过以下方式获取与实例关联的大多数元数据:
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)
/dynamic/instance-identity/document
如果您还需要查询的不仅仅是实例ID,请使用URL.
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();
在AWS Linux上:
ec2-metadata --instance-id | cut -d " " -f 2
输出:
i-33400429
在变量中使用:
ec2InstanceId=$(ec2-metadata --instance-id | cut -d " " -f 2); ls "log/${ec2InstanceId}/";
对于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]"
您也可以使用public_hostname,而不是local_hostname,而不是:
boto.utils.get_instance_metadata()['placement']['availability-zone'][:-1]
对于powershell人:
(New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/instance-id")
请参阅此帖子 - 请注意,给定URL中的IP地址是常量(最初使我感到困惑),但返回的数据特定于您的实例.
对于所有ec2机器,可以在文件中找到instance-id:
/var/lib/cloud/data/instance-id
您还可以通过运行以下命令来获取实例ID:
ec2metadata --instance-id
对于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]
更现代的解决方案.
在Amazon Linux中,已经安装了ec2-metadata命令.
从终端
ec2-metadata -help
将为您提供可用的选项
ec2-metadata -i
将返回
instance-id: yourid
只需输入:
ec2metadata --instance-id
你可以试试这个:
#!/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]\)"`
我为http api编写的EC2元数据的c#.net类.我将根据需要使用功能构建它.如果你喜欢它,你可以运行它.
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); } ////// 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 /// /// The service we are seeking (such as ec2, rds etc) ///Each AWS service has a different endpoint url for each region ///True if the operation was succesful, otherwise false 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[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; } /// /// Downloads instance metadata /// ///True if the operation was successful, false otherwise ///The operation will be unsuccessful if the machine running this code is not an AWS EC2 machine. 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();
在斯卡拉:
import com.amazonaws.util.EC2MetadataUtils val myid = EC2MetadataUtils.getInstanceId