421

如何instance id从 ec2 实例中找出 ec2 实例?

4

33 回答 33

582

请参阅有关该主题的 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,具体取决于您的平台上安装的内容。

于 2009-03-09T21:04:30.233 回答
162

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

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

或者,在 Ubuntu 和其他一些 linux 风格上,ec2metadata --instance-id(在 ubuntu 上默认情况下可能不会安装此命令,但您可以添加它sudo apt-get install cloud-utils

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

于 2013-05-13T17:35:47.320 回答
75

在 Ubuntu 上,您可以:

sudo apt-get install cloud-utils

然后你可以:

EC2_INSTANCE_ID=$(ec2metadata --instance-id)

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

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

查询和显示 EC2 元数据。

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

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

    --kernel-id 显示内核ID
    --ramdisk-id 显示 ramdisk id
    --reservation-id 显示预订ID

    --ami-id 显示ami id
    --ami-launch-index 显示 ami 启动索引
    --ami-manifest-path 显示 ami 清单路径
    --ancestor-ami-ids 显示 ami 祖先 id
    --product-codes 显示 ami 关联的产品代码
    --availability-zone 显示 ami 放置区域

    --instance-id 显示实例id
    --instance-type 显示实例类型

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

    --local-ipv4 显示本地ipv4 ip地址
    --public-ipv4 显示公共 ipv4 ip 地址

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

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

    --public-keys 显示 openssh 公钥
    --user-data 显示用户数据(实际上不是元数据)
于 2012-05-15T12:26:16.913 回答
59

/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"
}
于 2014-02-21T20:09:24.717 回答
37

在 AWS Linux 上:

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

输出:

i-33400429

在变量中使用:

ec2InstanceId=$(ec2-metadata --instance-id | cut -d " " -f 2);
ls "log/${ec2InstanceId}/";
于 2013-11-11T18:02:07.123 回答
37

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

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

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

    ec2metadata --instance-id
于 2017-11-01T09:52:39.493 回答
27

对于.NET人:

string instanceId = new StreamReader(
      HttpWebRequest.Create("http://169.254.169.254/latest/meta-data/instance-id")
      .GetResponse().GetResponseStream())
    .ReadToEnd();
于 2012-03-10T16:52:52.247 回答
24

对于 powershell 人:

(New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/instance-id")
于 2012-07-13T15:36:30.457 回答
23

对于 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]
于 2013-06-20T03:48:02.670 回答
14

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

于 2009-03-09T21:04:19.673 回答
11

只需键入:

ec2metadata --instance-id
于 2015-10-21T10:32:43.040 回答
10

对于红宝石:

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]
于 2013-02-14T23:40:18.330 回答
10

更现代的解决方案。

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

从航站楼

ec2-metadata -help

将为您提供可用的选项

ec2-metadata -i

将返回

instance-id: yourid
于 2014-08-26T22:23:36.540 回答
10

最新的 Java SDK 具有EC2MetadataUtils

在 Java 中:

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

在斯卡拉:

import com.amazonaws.util.EC2MetadataUtils
val myid = EC2MetadataUtils.getInstanceId
于 2016-06-01T18:01:14.937 回答
9

你可以试试这个:

#!/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]\)"`
于 2011-08-11T16:24:16.990 回答
8

我为来自 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
*************************************************************/
    }
}
于 2013-12-04T03:07:08.763 回答
5

对于 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
于 2014-09-03T19:13:24.933 回答
5

只需检查var/lib/cloud/instance符号链接,它应该指向您的实例 ID/var/lib/cloud/instances/{instance-id}所在的位置。{instance_id}

于 2017-03-09T15:50:10.037 回答
4

如果您希望在 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'])
于 2018-03-15T07:11:34.477 回答
3

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

于 2013-07-29T22:15:05.173 回答
3

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

于 2013-12-23T22:29:15.140 回答
3

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

很高兴能帮助你.. :)

于 2016-12-24T06:28:40.640 回答
1

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

对于Node开发人员,

var meta  = new AWS.MetadataService();

meta.request("/latest/meta-data/instance-id", function(err, data){
    console.log(data);
});
于 2017-07-16T09:45:07.820 回答
1

要获取实例元数据,请使用

wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
于 2018-12-28T06:48:00.833 回答
1

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

解决方案: IP 地址169.254.169.254是链接本地地址(仅对实例有效)aws 为我们提供了与专用 Restful API 的链接,用于检索我们正在运行的实例的元数据(请注意,您无需为用于检索实例元数据的 HTTP 请求付费和用户数据)。附加文件

示例

//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. 酰胺
  2. ami-launch-index
  3. ami-manifest-path
  4. 块设备
  5. 映射
  6. 事件
  7. 冬眠
  8. 主机名
  9. 我是
  10. 身份凭证
  11. 实例动作
  12. 实例 ID
  13. 实例类型
  14. 本地主机名
  15. 本地 IPv4
  16. 苹果电脑
  17. 指标
  18. 网络
  19. 放置
  20. 轮廓
  21. 预订编号
  22. 安全组
  23. 服务
于 2020-06-22T09:34:17.557 回答
0

对于 PHP:

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

根据@John 编辑

于 2017-01-25T20:38:52.183 回答
0

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

于 2017-12-06T01:44:53.363 回答
0

运行这个:

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

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

使用此链接查看更多

于 2018-12-18T11:46:45.520 回答
0

EC2 实例本身可以在执行以下命令的帮助下访问与 EC2 资源相关的所有元数据:

卷曲:

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

对于您的情况:“ metadata-requested ”应该是instance-id,“ api-version ”通常是可以使用的最新版本。

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

ami-id、ami-launch-index、ami-manifest-path、block-device-mapping/、主机名、iam/、instance-action、instance-id、instance-type、local-hostname、local-ipv4、mac、指标/,网络/,放置/,配置文件,公共主机名,公共ipv4,公共密钥/,预留ID,安全组,服务/,

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

于 2019-01-31T10:51:08.263 回答
0

对于 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
于 2019-05-29T07:54:04.237 回答
0

对于 AWS 弹性 beanstalk eb cli 运行eb tags --list

于 2019-06-01T18:20:02.760 回答
-1

您还可以安装awscli并使用它来获取您想要的所有信息:

AWS_DEFAULT_REGION=your-region aws ec2 describe-instances

您将获得大量输出,因此请务必使用 ip 等标识符进行 grep 并打印更多行:

AWS_DEFAULT_REGION=your-region aws ec2 describe-instances | grep your-ip -A 10 | grep InstanceId
于 2019-01-04T10:27:25.580 回答
-1

For .NET code it is very simple: var instanceId=Amazon.Util.EC2InstanceMetadata.InstanceId

于 2021-08-11T10:01:57.150 回答