Как получить идентификатор экземпляра из экземпляра ec2?

Как я могу узнать instance id экземпляра ec2 из экземпляра ec2?

36 ответов

Решение

См. Документацию EC2 по этому вопросу.

Бежать:

wget -q -O - http://169.254.169.254/latest/meta-data/instance-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: $?\"`"

Пример более сложного использования (получение идентификатора экземпляра, а также зоны доступности и региона и т. Д.):

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 Синтаксис: /usr/bin/ec2metadata [параметры] Запрос и отображение метаданных EC2. Если параметры не предоставлены, будут отображены все параметры. Параметры:
    -h --help показать эту справку --kernel-id показать идентификатор ядра --ramdisk-id показать идентификатор ramdisk --reservation-id показать идентификатор резервирования - ami-id отображает ami id
    --ami-launch-index отображает ami launch index
    --ami-manifest-path отображает ami-путь манифеста --ancestor-ami-ids отображает ami-предок идентификатора --product-коды отображают коды продуктов, связанных с ami --availability-zone - отображение зоны размещения ami - id-экземпляра - отображение идентификатора экземпляра - -instance-type - отображение типа экземпляра --local-hostname - отображение локального имени хоста --public-hostname - отображение публичного имени хоста --local-ipv4 отображать локальный IP-адрес ipv4 --public-ipv4 отображать публичный IP-адрес ipv4 --block-device-mapping отображать идентификатор блочного устройства --security-groups отображать группы безопасности --mac отображать экземпляр mac address
    --profile отобразить профиль экземпляра --instance-action показать действие instance --public-keys отобразить открытые ключи openssh --user-data отображают данные пользователя (на самом деле не метаданные)

Использовать /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"
}

Для всех компьютеров ec2 идентификатор экземпляра можно найти в файле:

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

Вы также можете получить идентификатор экземпляра, выполнив следующую команду:

    ec2metadata --instance-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}/";

За .NET Люди:

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

Для пользователей PowerShell:

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

Для 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]

См. Этот пост - обратите внимание, что IP-адрес в указанном URL-адресе является постоянным (что сначала смутило меня), но возвращаемые данные относятся к вашему экземпляру.

Просто введите:

ec2metadata --instance-id

Более современное решение.

Из Amazon Linux команда ec2-метаданных уже установлена.

Из терминала

ec2-metadata -help

Даст вам доступные варианты

ec2-metadata -i

вернусь

instance-id: yourid

Вы можете попробовать это:

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

Для Руби:

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]

Последний Java SDK имеет EC2MetadataUtils:

В Java:

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

В Скала:

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

C# .net класс, который я написал для метаданных EC2 из HTTP API. Я буду строить его с функциональностью по мере необходимости. Вы можете работать с ним, если вам это нравится.

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

Просто проверьте var/lib/cloud/instance символическая ссылка, она должна указывать на /var/lib/cloud/instances/{instance-id} где {instance_id} Ваш идентификатор экземпляра.

Для 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

Простая одна строка

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

Если вы хотите получить список всех доступных экземпляров с помощью python, вот код:

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

Вы можете просто сделать 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

Рад помочь..:)

FWIW Я написал файловую систему FUSE для обеспечения доступа к службе метаданных EC2: https://bitbucket.org/dgc/ec2mdfs. Я запускаю это на всех пользовательских AMI; это позволяет мне использовать эту идиому: cat /ec2/meta-data/ami-id

В 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.

Самый простой подход — использовать aws cli иsts get-caller-identity.

INSTANCE_ID=$(aws sts get-caller-identity --query UserId --output text | cut -d : -f 2)

  • Таким образом, вам не нужно вручную авторизоваться для конечной точки метаданных.
  • Он работает на любом Unix AMI в отличие отec2-metadataкоманда, доступная только для AMI Amazon Linux

Мотивация: Пользователь хотел бы получить метаданные экземпляра 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. ami-id
  2. ami-launch-index
  3. ami-manifest-path
  4. блочное устройство
  5. отображение
  6. События
  7. спячка
  8. имя хоста
  9. я
  10. идентификационные данные
  11. Экземпляр-действие
  12. идентификатор экземпляра
  13. тип экземпляра
  14. локальное имя хоста
  15. локальный ipv4
  16. Mac
  17. метрики
  18. сеть
  19. размещение
  20. профиль
  21. идентификатор бронирования
  22. группы безопасности
  23. Сервисы

Для экземпляра 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

В вопросе, который вы упомянули в качестве пользователя root, я должен упомянуть одну вещь: идентификатор экземпляра не зависит от пользователя.

Для разработчиков Node,

var meta  = new AWS.MetadataService();

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

Для получения метаданных экземпляра используйте

wget -q -O - http://169.254.169.254/latest/meta-data/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()

Запустите это:

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

Вы сможете увидеть различные типы атрибутов, которые предоставляет aws.

Используйте эту ссылку, чтобы увидеть больше

Другие вопросы по тегам