如何从ec2实例中获取实例ID?

fly*_*ire 358 amazon-ec2 amazon-web-services

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

vla*_*adr 506

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

跑:

wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Run Code Online (Sandbox Code Playgroud)

如果您需要从脚本中以编程方式访问实例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: $?\"`"
Run Code Online (Sandbox Code Playgroud)

更高级用法的示例(检索实例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:'`"
Run Code Online (Sandbox Code Playgroud)

您也可以使用,curl而不是wget根据平台上安装的内容.

  • 您可以使用`http:// instance-data /`而不是`169.254.169.254`来消除幻数 (61认同)
  • 我在2016-02-04检查了这个.我发现"instance-data"主机名是(a)未在该文档中列出,并且(b)在新的EC2主机上不起作用(对我而言).文档 - http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html - 仅提及169.254地址,并未提及"instance-data"主机名.即使用http://169.254.169.254/latest/meta-data/instance-id (17认同)
  • instance-data hostname对我不起作用. (4认同)
  • 仅当您使用 Amazon DNS 解析器时,“instance-data”才可用 - 如果不使用,它将不可用。它解析为 169.254.169.254。 (3认同)
  • 在Java SDK中怎么样?有没有办法得到这个而不必在该网址上进行GET?如果它不在SDK中,似乎很奇怪 (2认同)

Jam*_*mes 123

在Amazon Linux AMI上,您可以:

$ ec2-metadata -i
instance-id: i-1234567890abcdef0
Run Code Online (Sandbox Code Playgroud)

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

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

  • 在ubuntu上,命令是`ec2metadata --instance-id` (34认同)
  • 如果你正在考虑使用它,[本文](http://www.spinellis.gr/blog/20120601/)值得一读(tldr:是命令行工具是java,java的启动时间很长) (3认同)
  • 我认为您的意思是ec2-metadata --instance-id (2认同)
  • 该命令在不同的Linux上是不同的:在Amazon Linux上是`ec2-metadata`,在Ubuntu上似乎是`ec2metadata`。 (2认同)
  • 自从 @James 发表评论(8 年前)以来,事情已经发生了变化;`ec2-metadata` 命令是一个 shell 脚本,而不是 Java 程序。由于虚拟机管理程序的 IMDS 功能已得到相当程度的增强,因此幕后所需的唯一工具是“wget”或“curl”或类似工具。 (2认同)

rhu*_*cks 60

在Ubuntu上你可以:

sudo apt-get install cloud-utils
Run Code Online (Sandbox Code Playgroud)

然后你可以:

EC2_INSTANCE_ID=$(ec2metadata --instance-id)
Run Code Online (Sandbox Code Playgroud)

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

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)

  • 默认情况下,cloud-utils软件包包含在Ubuntu 12.04.1 LTS Cluster Compute AMI中. (6认同)
  • cloud-utils 似乎也在 RHEL/CentOS 中 (2认同)

Kon*_*iss 46

/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"
}
Run Code Online (Sandbox Code Playgroud)

  • +1 用于在一个简单的调用中显示所有详细信息,包括 instanceType (2认同)

Meh*_*ANI 24

对于.NET人民:

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


gpu*_*upo 21

在AWS Linux上:

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

输出:

i-33400429

在变量中使用:

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


小智 19

对于Python:

import boto.utils
region=boto.utils.get_instance_metadata()['local-hostname'].split('.')[1]
Run Code Online (Sandbox Code Playgroud)

归结为单线:

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

您也可以使用public_hostname,而不是local_hostname,而不是:

boto.utils.get_instance_metadata()['placement']['availability-zone'][:-1]
Run Code Online (Sandbox Code Playgroud)

  • inst_id = boto.utils.get_instance_metadata()['instance-id'] (8认同)
  • 对于任何想知道的人,这是在博托但尚未在boto3.有关使用urllib的变通方法,请参见http://stackoverflow.com/a/33733852.在https://github.com/boto/boto3/issues/313 FWIW上有一个开放的功能请求,JS SDK也有这个:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/MetadataService. html使用`new AWS.MetadataService().request('instance-id',function(error,data){myInstanceId = data;})` (2认同)

小智 18

对于powershell人:

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

  • 只是不同的commandet:`$实例Id =(调用-的WebRequest -uri 'http://169.254.169.254/latest/meta-data/instance-id').Content` (3认同)

gar*_*les 12

请参阅此帖子 - 请注意,给定URL中的IP地址是常量(最初使我感到困惑),但返回的数据特定于您的实例.


小智 11

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

    /var/lib/cloud/data/instance-id
Run Code Online (Sandbox Code Playgroud)

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

    ec2metadata --instance-id
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常干净的解决方案,不需要 HTTP 请求。 (4认同)
  • 很好的答案,但我在文档中找不到这方面的参考。请问你的参考是什么?令人担忧的是,如果我们要在生产中运行此代码,我们怎么知道它将来不会改变? (2认同)
  • 也许是所有*linux* ec2 机器,但绝对不是*所有* ec2 机器。Windows 上没有这样的文件。`C:\ProgramData\Amazon\EC2-Windows\Launch\Log\Ec2Launch.log` 包含实例 Id,但也有大量其他垃圾。 (2认同)

Kev*_*yer 8

对于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]
Run Code Online (Sandbox Code Playgroud)

  • 抱歉.不知道怎么说"这是一个很好的编辑.我是OP.接受这个". (3认同)

Det*_*Dev 8

更现代的解决方案.

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

从终端

ec2-metadata -help
Run Code Online (Sandbox Code Playgroud)

将为您提供可用的选项

ec2-metadata -i
Run Code Online (Sandbox Code Playgroud)

将返回

instance-id: yourid
Run Code Online (Sandbox Code Playgroud)

  • 在Ubuntu映像中,命令是"ec2metadata --instance-id",并且只返回实例id值 (2认同)

小智 8

只需输入:

ec2metadata --instance-id
Run Code Online (Sandbox Code Playgroud)

  • 显然这是亚马逊AMI的命令,你应该更新你的答案 (4认同)

小智 7

你可以试试这个:

#!/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]\)"`
Run Code Online (Sandbox Code Playgroud)


bbo*_*234 6

我为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
*************************************************************/
    }
}
Run Code Online (Sandbox Code Playgroud)


Sco*_*ith 6

最新的Java SDK具有EC2MetadataUtils:

在Java中:

import com.amazonaws.util.EC2MetadataUtils;
String myId = EC2MetadataUtils.getInstanceId();
Run Code Online (Sandbox Code Playgroud)

在斯卡拉:

import com.amazonaws.util.EC2MetadataUtils
val myid = EC2MetadataUtils.getInstanceId
Run Code Online (Sandbox Code Playgroud)


Med*_*ist 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
Run Code Online (Sandbox Code Playgroud)


gre*_*reg 5

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


Ome*_*mer 5

简单的一行

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