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

StackOverflow https://stackoverflow.com/questions/625644

  •  05-07-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

Видишь документация 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
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)

Используйте URL-адрес / 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"
}

Для .NET Люди:

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

в AWS Linux:

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

Выходной сигнал:

i-33400429

Использование в переменных:

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

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

Для людей PowerShell:

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

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

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

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

Из терминала

ec2-metadata -help

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

ec2-metadata -i

вернет

instance-id: yourid

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

ec2metadata --instance-id

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

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

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

    ec2metadata --instance-id

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

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

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

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

В последнем Java SDK есть EC2MetadataUtils :

В Java:

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

В Scala:

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

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

Если вы хотите получить список всех доступных экземпляров экземпляра, используя 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'])

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.

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

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

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

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

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

var meta  = new AWS.MetadataService();

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

Альтернативный подход для 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 ()

Для PHP:

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

Изменить на @John

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

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

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

Используйте эту ссылку, чтобы узнать больше

Все метаданные, относящиеся к ресурсу EC2, могут быть доступны самому экземпляру EC2 с помощью выполняемой следующей команды:

ЗАВИТОК :

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

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

Дополнительное примечание:Вы также можете получить информацию, связанную с приведенными ниже атрибутами EC2, используя приведенную выше команду.

ami-идентификатор, ami-индекс запуска, ami-путь к манифесту, блок-сопоставление устройств/, имя хоста, iam/, действие экземпляра, идентификатор экземпляра, тип экземпляра, локальное -имя хоста, локальный-ipv4, mac, показатели /, сеть/, размещение/, профиль, общедоступное-имя хоста, общедоступный-ipv4, открытые ключи/, резервирование-id, группы безопасности, сервисы/,

Для получения более подробной информации, пожалуйста, перейдите по этой ссылке : https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

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

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

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

Для AWS эластичного бобового стебля eb cli запустите eb tags --list

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top