如何从EC2实例中获得AWS EC2实例ID ?

如何从ec2实例中找到ec2实例的instance id ?

280005 次浏览

请参阅这篇文章 -注意,URL中给定的IP地址是常量(这一开始让我感到困惑),但返回的数据是特定于您的实例的。

看到关于该主题的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,这取决于你的平台上安装了什么。

你可以试试这个:

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

对于.NET人:

string instanceId = new StreamReader(
HttpWebRequest.Create("http://169.254.169.254/latest/meta-data/instance-id")
.GetResponse().GetResponseStream())
.ReadToEnd();

在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)

对于powershell用户:

(New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/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 ami上,你可以做:

$ ec2-metadata -i
instance-id: i-1234567890abcdef0

或者,在Ubuntu和其他一些linux版本上,ec2metadata --instance-id(这个命令可能不会在Ubuntu上默认安装,但你可以用sudo apt-get install cloud-utils添加它)

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

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]
我写了一个FUSE文件系统来提供对EC2元数据服务的访问: 我在所有自定义ami上运行这个;它允许我使用这个习语:cat /ec2/meta-data/ami-id

在AWS Linux上:

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

输出:

i-33400429

在变量中使用:

ec2InstanceId=$(ec2-metadata --instance-id | cut -d " " -f 2);
ls "log/${ec2InstanceId}/";
我从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);
}


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

在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源。

如果你需要查询的不仅仅是你的实例ID,使用/dynamic/instance-identity/document 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"
}

一个更现代的解决方案。

在Amazon Linux中已经安装了ec2-metadata命令。

从终点站

ec2-metadata -help

会给你可用的选项吗

ec2-metadata -i

将返回

instance-id: yourid

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

类型:

ec2metadata --instance-id

最新的Java SDK有EC2MetadataUtils:

在Java中:

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

在Scala中:

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

您可以通过传递元数据参数发出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

乐意帮忙。:)

PHP:

$instance = json_decode(file_get_contents('http://169.254.169.254/latest/dynamic/instance-identity/document));
$id = $instance['instanceId'];

编辑@John

简单地检查var/lib/cloud/instance符号链接,它应该指向/var/lib/cloud/instances/{instance-id},其中{instance_id}是你的实例id。

在你提到用户作为根用户的问题中,我应该提到的一件事是实例ID不依赖于用户。

对于节点开发人员,

var meta  = new AWS.MetadataService();


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

对于所有ec2机器,实例id可以在以下文件中找到:

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

实例id也可以通过如下命令获取:

    ec2metadata --instance-id

PHP的替代方法:

$instance = json_decode(file_get_contents('http://169.254.169.254/latest/dynamic/instance-identity/document'),true);
$id = $instance['instanceId'];
print_r($instance);
这将提供关于实例的大量数据,所有数据都被漂亮地打包在一个数组中,没有外部依赖。 因为这是一个请求,从来没有失败或延迟对我来说,这样做应该是安全的,否则我会去curl()

如果你想在python中获取所有实例id列表,下面是代码:

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'])

运行这个:

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

您将能够看到aws提供的不同类型的属性。

使用此链接查看更多

获取实例元数据使用

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

你也可以安装awscli并使用它来获得你想要的所有信息:

AWS_DEFAULT_REGION=your-region aws ec2 describe-instances

你会得到很多输出,所以一定要通过你的标识符grep,如ip,并打印更多的行:

AWS_DEFAULT_REGION=your-region aws ec2 describe-instances | grep your-ip -A 10 | grep InstanceId

所有与EC2资源相关的元数据都可以由EC2实例本身通过执行以下命令来访问:

旋度:

http://169.254.169.254/<api-version>/meta-data/<metadata-requested>

对于你的情况:"metadata-requested"应该是实例id, "api版本"通常是可以使用的最新的

附加注意:您还可以使用上述命令获取与以下EC2属性相关的信息。

< p > ami id, ami-launch-index, ami-manifest-path, block-device-mapping /, 主机名、 我/, instance-action, 实例id, 实例类型, local-hostname, local-ipv4, mac, 指标/, 网络/, 位置/, 配置文件, public-hostname, public-ipv4, 公钥/, 预订标识, 安全组, 服务/ < / p >

欲了解更多详细信息,请点击此链接:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

对于Windows实例:

(wget http://169.254.169.254/latest/meta-data/instance-id).Content

(ConvertFrom-Json (wget http://169.254.169.254/latest/dynamic/instance-identity/document).Content).instanceId

对于AWS elastic beanstalk eb cli,执行eb tags --list

动机:用户想检索aws实例元数据。

<强>解决方案: IP地址169.254.169.254是一个链接本地地址(并且仅对实例有效)aws提供了与专用Restful API 用于检索运行实例的元数据的链接(注意,您不会为用于检索实例元数据和用户数据的HTTP请求收费)。对于附加的文档 < / p >

例子:

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


//Response
ami-123abc

你可以使用这个链接http://169.254.169.254/latest/meta-data/<metadata-field>获得实例的其他元数据标签,只需选择正确的标签:

  1. ami id
  2. ami-launch-index
  3. ami-manifest-path
  4. 块设备
  5. 映射
  6. 事件
  7. 冬眠
  8. 主机名
  9. 身份凭证
  10. instance-action
  11. 实例id
  12. 实例类型
  13. local-hostname
  14. local-ipv4
  15. mac
  16. 指标
  17. 网络
  18. 放置
  19. 配置文件
  20. 预订标识
  21. 安全组
  22. 服务
对于.NET代码,它非常简单: var instanceId=Amazon.Util.EC2InstanceMetadata.InstanceId < / p >

简单的一行

cat /sys/devices/virtual/dmi/id/board_asset_tag

curl_cli -s http://169.254.169.254/latest/meta-data/instance-id

来源:https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html