Як отримати ідентифікатор екземпляра з екземпляру ec2?


Відповіді:


534

Див . Документацію 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, що встановлено на вашій платформі.


@Leopd, ти, очевидно, знаєш краще, ніж люди в Amazon, які впровадили EC2 та написали документи. До речі, ніхто не заважає вам від створення псевдоніма 169.254.169.254в /etc/hostsразі , що змушує вас почувати себе більш безпечно, ви повинні ... догляд.
владр

2
А як щодо Java SDK? Чи є спосіб отримати це, не роблячи GET на цій URL-адресі? Здається дивним, якщо його немає в SDK
Kevin M

1
Дуже корисно, дякую. Для інших, хто намагається з'ясувати регулярний вираз в останньому рядку, ось що я придумав: В кінці рядка ( $) знайдіть одну чи більше цифр, що слідують за однією або кількома малими літерами. Замініть лише цифри. (Зворотні коси + круглі дужки говорять sed, щоб запам'ятати підрядку, яку відкликали \1.) Я вважав це трохи легше для читання - єдині зворотні риски - це ті, які вимагає sed : EC2_REGION="$(echo "$EC2_AVAIL_ZONE" | sed -e 's:\([0-9][0-9]*\)[a-z]*$:\1:')".
Марк Беррі

66
Ви можете усунути магічні числа, скориставшись http://instance-data/замість169.254.169.254
Джей П.

20
Я перевірив це 02.02.2016. Я виявив, що ім'я хоста "data-data" (а) не вказано в цій документації, і (b) не працює (для мене) на новому EC2 хості. Документація - docs.aws.amazon.com/AWSEC2/latest/UserGuide/… - лише згадує адресу 169.254 і не згадує ім'я хоста "data-data". тобто використовуйте 169.254.169.254/latest/meta-data/instance-id
JDS

138

На AMI Amazon Linux ви можете:

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

Або на Ubuntu та деяких інших ароматах Linux ec2metadata --instance-id(Ця команда може бути не встановлена ​​за замовчуванням на ubuntu, але ви можете додати її за допомогою sudo apt-get install cloud-utils)

Як випливає з назви, ви можете використовувати команду і для отримання інших корисних метаданих.


3
Якщо ви думаєте про те, щоб скористатись цим, цю статтю варто прочитати (tldr: інструменти командного рядка - це java, а у java тривалий час запуску)
James

Найкраща відповідь
Чак Ле Бутт

@Marc Nope. Ні -після ec2. Цеec2metadata --instance-id
Dawny33

5
Команда різна в різних Linux: в Amazon Linux це ec2-metadata, в Ubuntu, здається, є ec2metadata.
Джеймс

Право Джеймс, я знайшов ті самі ec2metaдані, які працювали над Ubuntu.
pyAddict

69

У Ubuntu ви можете:

sudo apt-get install cloud-utils

І тоді ви можете:

EC2_INSTANCE_ID=$(ec2metadata --instance-id)

Ви можете отримати більшість метаданих, пов’язаних із екземпляром таким чином:

ec2metaдані - допомогти
Синтаксис: / usr / bin / ec2metadata [параметри]

Запит та відображення метаданих EC2.

Якщо опції не передбачено, будуть показані всі параметри

Параметри:
    -h - допомогти показати цю допомогу

    --kernel-id відобразить ідентифікатор ядра
    --ramdisk-id відобразить ідентифікатор ramdisk
    - ідентифікатор резервування, ідентифікатор резервування

    --ami-id відобразить ami id
    --ami-start-index відображає індекс запуску ami
    --ami-manifest-path відображає шлях маніфесту ami
    --ancestor-ami-id відображає ідентифікатор предка ami
    --продукти-коди відображають пов'язані з ami коди товарів
    - зона доступності відображення зони розміщення ami

    --instan-id відобразить ідентифікатор ідентифікатора
    - відображення типу речовини - тип екземпляра

    - місцеве ім'я хоста відображає локальне ім'я хоста
    - ім'я публічного хоста і відображення загального імені хоста

    --local-ipv4 відображає локальну ipv4 адресу ipv4
    --public-ipv4 відображає загальнодоступну ipv4 ip адресу

    - відображення відображення ідентифікатора блокового пристрою
    - групи безпеки відображають групи безпеки

    --mac відобразити адресу екземпляра mac
    --профіль відображення профілю екземпляра
    - речовина-дія відображає екземпляр-дію

    - публічні ключі відображають відкриті відкриті ключі
    --користувацькі дані відображають дані користувача (фактично не метадані)

Під Ubuntu apt-get installlucid отримує версію 0.11-0ubuntu1, яка не містить цієї утиліти. Це було додано в пакет відразу після цього .
Арі Лейб Таурог

7
Пакет хмарних утиліт за замовчуванням включений в AMI Ubuntu 12.04.1 LTS Cluster Compute.
Андрій

2
Хмарні утилі, здається, є і в RHEL / CentOS
Крейг Рінгер

50

Використовуйте /dynamic/instance-identity/documentURL-адресу, якщо вам також потрібно буде запитувати більше, ніж просто ідентифікатор вашого примірника.

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"
}

1
+1 для показу всіх подробиць, включаючи instanceType, в одному простому дзвінку
Luksurious

1
+1 за наявність досить стандартної (лише wget) та робочої лінії (URL-адреса екземплярів не працювала для мене на Amazon linux), не встановлюючи додаткових пакетів лише для цього простого завдання.
tishma

27

Для .NETлюдей:

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

24

на AWS Linux:

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

Вихід:

i-33400429

Використання змінних:

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

Чистий і стислий спосіб. Розробка коробки для екземпляра з Ubuntu 14.
berbt

22

Для людей, що захищаються:

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

4
просто інший командет:$instanceId=(Invoke-WebRequest -Uri 'http://169.254.169.254/latest/meta-data/instance-id').Content
Суміт Мурарі

Invoke-WebRequest не завжди працює під час запуску скрипта на вказаному екземплярі EC2 за допомогою команди ssm send-command (або Send-SSMCommand). Насправді це не написано в документах . Можливо, це не асинхроніка ... що було б дивно. Але на сьогоднішній день варіант stefancaunter працює без проблем.
J-Roel

22

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

Усі новіші версії boto, які я бачу, дозволяють вам безпосередньо викликати ключ "instance_id". Я зробив відповідні запропоновані зміни.
сахарин

8
inst_id = boto.utils.get_instan_metadata () ['prime-id']
atisman

Ви розумієте, що це отримує регіон, в якому знаходиться екземпляр, а не ідентифікатор ідентифікатора, як задається питанням, правда?
LukeGT

2
Для всіх, хто цікавиться, це в boto, але ще не в boto3. Див. Stackoverflow.com/a/33733852 для вирішення способу використання urllib. На сайті github.com/boto/boto3/isissue/313 FWIW є запит на відкриту функцію , JS SDK також має таке: docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/… Використанняnew AWS.MetadataService().request('instance-id',function(error,data) { myInstanceId = data; })
Armadillo Jim

20

Для всіх машин ec2 ідентифікатор екземпляра можна знайти у файлі:

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

Ви також можете отримати ідентифікатор екземпляра, виконавши таку команду:

    ec2metadata --instance-id

2
Це дуже чисте рішення, не вимагає HTTP-запиту.
Юрій

Найкраща можлива відповідь насправді
Шлублу

1
Чудова відповідь, але я не зміг знайти посилання на це в документації. Чи можу я запитати, яка ваша довідка? Турбота полягає в тому, що якщо ми будемо запускати цей код у виробництві, як ми можемо знати, що він не зміниться в майбутньому?
shaya ajzner

Все Linux EC2 машина, може бути, але безумовно не всі EC2 машина. У Windows немає такого файлу. C:\ProgramData\Amazon\EC2-Windows\Launch\Log\Ec2Launch.logмістить ідентифікатор екземпляра, але також має ще безліч інших мотлохів.
Джеймс

14

Дивіться цю публікацію - зауважте, що IP-адреса у вказаній URL-адресі є постійною (що спочатку мене бентежило), але повернені дані є специфічними для вашого випадку.


Для мене посилання - 404ing
repalviglator

Перевірте @ DEtDev відповідь нижче; моя відповідь досить стара, і схоже, що посилання було знято.
gareth_bowles

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]

1
Хлопці WTF ?! Ви вкрали мою редакцію! stackoverflow.com/review/suggested-edits/4035074
kixorz

3
Вибачте. Не знав, як сказати "Це добре редагувати. Я ОП. Прийміть це".
Кевін Мейєр

10

Більш сучасне рішення.

З Amazon Linux команда метаданих ec2 вже встановлена.

З терміналу

ec2-metadata -help

Дасть вам доступні варіанти

ec2-metadata -i

повернеться

instance-id: yourid

1
набагато краще, ніж залежно від псевдо ip
Майк Д

поєднуйтесь ec2-metadataзі своїми motdдокументами тут: coderwall.com/p/hr_9pw/motds-on-amazon-amis
Майк Д,

2
У зображенні Ubuntu команда "ec2metadata --instan-id" і поверне лише значення ідентифікатора ідентифікатора екземпляра
Alberto Megía


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

8

Клас 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
*************************************************************/
    }
}

7

Остання Java SDK має EC2MetadataUtils :

На Java:

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

У Scala:

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

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

3

Просто перевірте var/lib/cloud/instanceпосилання, воно повинно вказувати на те, /var/lib/cloud/instances/{instance-id}де {instance_id}ваш ідентифікатор ідентифікатора.


1
Я б цим не користувався. Для отримання метаданих вам краще скористатися затвердженим запитом HTTP.
Дайсуке Арамакі

3

Якщо ви хочете отримати список ідентифікаторів усіх екземплярів у 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'])

2

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


2

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


1

У запитанні, яке ви згадали про користувача як root, одне, що я мушу зазначити, це те, що ідентифікатор екземпляра не залежить від користувача.

Для розробників Node ,

var meta  = new AWS.MetadataService();

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


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 Instance, який є простим скриптом bash, який використовує curl для запиту метаданих екземпляра EC2 зсередини запущеного екземпляра EC2, як зазначено в документації.

Завантажте інструмент:

$ wget http://s3.amazonaws.com/ec2metadata/ec2-metadata

тепер запустіть команду, щоб отримати необхідні дані.

$ec2metadata -i

Посилання:

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instan-metadata.html

https://aws.amazon.com/items/1825?externalID=1825

Раді допомогти .. :)


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


0

Для PHP:

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

Редагувати на @John


Але чому б ви використовували GuzzeHttp для цієї мети, якщо у вас є функції curl та native у PHP?
Іван

Це моє вподобання. Я використовую guzzle для багатьох інших речей, це загальна умова для багатьох інших пакетів.
Beachhouse

$ instance = json_decode (file_get_contents (' 169.254.169.254/latest/dynamic/instance-identity/… ); $ id = $ instance [' instanceId ']; Я знаю, що Guzzle є широко поширеним, я його ніколи не торкався. Для такого Просте завдання я запропонував би найлегший підхід
Іван


0

До всіх метаданих, що відносяться до ресурсу EC2, може бути доступний сам екземпляр EC2 за допомогою наступної команди, що виконується:

CURL:

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

У вашому випадку: " запитані метадані " повинні бути ідентифікаторами ідентифікатора , " api-версія " зазвичай є останньою, яку можна використовувати.

Додаткова примітка: Ви також можете отримати інформацію, що стосується нижче атрибутів EC2, за допомогою наведеної вище команди.

ami-id, ami-start-index, ami-manifest-path, block-device-mapping /, ім'я хоста, iam /, instance-action, instance-id, type-type, local-hostname, local-ipv4, mac, показники /, мережа /, розміщення /, профіль, ім'я публічного хоста, public-ipv4, відкриті ключі /, ідентифікатор резервування, групи безпеки, послуги /,

Для отримання більш детальної інформації перейдіть за цим посиланням: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html


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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.