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

时间:2009-03-09 10:08:06

标签: amazon-ec2 amazon-web-services

如何在ec2实例中找到ec2实例的instance id

33 个答案:

答案 0 :(得分:486)

请参阅the EC2 documentation on the subject

执行命令

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,具体取决于您平台上安装的内容。

答案 1 :(得分:118)

在Amazon Linux AMI上,你可以这样做:

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

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

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

答案 2 :(得分:56)

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

答案 3 :(得分:43)

如果您还需要查询的不仅仅是实例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"
}

答案 4 :(得分:24)

对于.NET人:

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

答案 5 :(得分: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}/";

答案 6 :(得分:18)

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

答案 7 :(得分:17)

对于powershell人:

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

答案 8 :(得分:12)

请参阅this post - 请注意,指定URL中的IP地址是常量(最初让我感到困惑),但返回的数据特定于您的实例。

答案 9 :(得分:8)

只需输入:

ec2metadata --instance-id

答案 10 :(得分:8)

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

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

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

    ec2metadata --instance-id

答案 11 :(得分:8)

更现代的解决方案。

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

从终端

ec2-metadata -help

会为您提供可用的选项

ec2-metadata -i

将返回

instance-id: yourid

答案 12 :(得分: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]\)"`

答案 13 :(得分:7)

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

答案 14 :(得分: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
*************************************************************/
    }
}

答案 15 :(得分:6)

最新的Java SDK有EC2MetadataUtils

在Java中:

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

在Scala中:

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

答案 16 :(得分:4)

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

答案 17 :(得分:2)

如果您希望使用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'])

答案 18 :(得分:1)

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

答案 19 :(得分:1)

在Go中,您可以使用goamz package

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
}

Here's GetMetaData来源。

答案 20 :(得分:1)

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

答案 21 :(得分:0)

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

对于节点开发人员,

var meta  = new AWS.MetadataService();

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

答案 22 :(得分:0)

对于PHP:

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

按@John编辑

答案 23 :(得分: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);

这将提供大量关于实例的数据,所有数据都很好地打包在一个数组中,没有外部依赖关系。 因为这是一个永远不会失败或延迟的请求,所以这样做应该是安全的,否则我会去卷曲()

答案 24 :(得分:0)

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

乐意帮助.. :)

答案 25 :(得分:0)

运行此:

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

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

Use this link to view more

答案 26 :(得分:0)

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

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

答案 27 :(得分:0)

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

CURL:

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

对于您的情况:“ 请求元数据”应为实例ID ,“ api版本”通常为最新可以使用。

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

ami-id, ami-launch-index, ami-manifest-path, 块设备映射/, 主机名, 我是/, 实例动作 实例编号 实例类型 本地主机名, 本地IPV4, 苹果电脑, 指标/, 网络/, 放置/, 轮廓, 公共主机名, public-ipv4, 公钥/, 预订编号, 安全组, 服务/,

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

答案 28 :(得分: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

答案 29 :(得分:0)

对于AWS Elastic beantalk eb cli运行eb tags --list

答案 30 :(得分:0)

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

解决方案: IP地址169.254.169.254是本地链接地址(仅对实例有效)aws为我们提供了专用的Restful API 链接,用于检索运行实例的元数据(请注意,不为用于检索实例元数据和用户数据的HTTP请求计费。为Additional Documentation

示例

//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. iam
  10. 身份凭证
  11. 实例动作
  12. 实例ID
  13. 实例类型
  14. 本地主机名
  15. local-ipv4
  16. mac
  17. 指标
  18. 网络
  19. 展示位置
  20. 个人资料
  21. 预订编号
  22. 安全组
  23. 服务

答案 31 :(得分:0)

对于 .NET 代码,它非常简单: var instanceId=Amazon.Util.EC2InstanceMetadata.InstanceId

答案 32 :(得分:-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