Bir ec2 örneğinden örnek kimliği nasıl alınır?


Yanıtlar:


534

Konuyla ilgili EC2 belgelerine bakın .

Çalıştırmak:

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

Bir komut dosyasından örnek kimliğine programlı erişime ihtiyacınız varsa,

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: $?\"`"

Daha gelişmiş bir kullanım örneği (örnek kimliğinin yanı sıra kullanılabilirlik bölgesi ve bölgesi vb. Alın):

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:'`"

Ayrıca kullanabilir curlyerine wgetsizin platformda yüklü ne bağlı.


@Leopd, Amazon'da EC2 uygulayan ve belgeleri yazan insanlardan daha iyi biliyorsunuz. Bu arada, hiç kimse için bir takma ad yaratma alıkoyar 169.254.169.254içinde /etc/hostssen, o yaparsa daha güvenli hissetmeniz gerekir ... bakımı.
vladr

2
Java SDK'sında ne var? Bu URL'de bir GET yapmak zorunda kalmadan bunu almanın herhangi bir yolu var mı? SDK'da değilse garip görünüyor
Kevin M

1
Çok faydalı, teşekkürler. Son satırdaki normal ifadeyi anlamaya çalışan diğerleri için, işte şunu buldum: Satırın sonunda ( $), bir veya daha fazla küçük harf izleyen bir veya daha fazla rakam bulun. Yalnızca rakamlarla değiştirin. (Backslash + parantez ile hatırlatılmaktadır bir alt, hatırlamak sed \1.) Ben okumak için bu biraz daha kolay buldum - sadece ters eğik çizgiler tarafından gerekli olanlar sed şunlardır: EC2_REGION="$(echo "$EC2_AVAIL_ZONE" | sed -e 's:\([0-9][0-9]*\)[a-z]*$:\1:')".
Mark Berry

66
Sihirli sayıları http://instance-data/yerine kullanarak ortadan kaldırabilirsiniz169.254.169.254
Jay P.

20
Bunu 2016-02-04'te kontrol ettim. "Örnek veri" ana bilgisayar adının (a) bu belgede listelenmediğini ve (b) yeni bir EC2 ana bilgisayarında (benim için) çalışmadığını gördüm. Dokümanlar - docs.aws.amazon.com/AWSEC2/latest/UserGuide/… - yalnızca 169.254 adresinden bahseder ve "örnek veri" ana bilgisayar adından bahsetmez. yani 169.254.169.254/latest/meta-data/instance-id
JDS

138

Amazon Linux AMI'lerde şunları yapabilirsiniz:

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

Veya, Ubuntu ve diğer bazı linux tatlarında, ec2metadata --instance-id(Bu komut ubuntu'ya varsayılan olarak yüklenmeyebilir, ancak ile ekleyebilirsiniz sudo apt-get install cloud-utils)

Adından da anlaşılacağı gibi, diğer faydalı meta verileri almak için de komutu kullanabilirsiniz.


3
Bunu kullanmayı düşünüyorsanız, bu makale okunmaya değer (tldr: komut satırı araçları java ve java'nın uzun bir başlangıç ​​zamanı oldu)
James

En iyi cevap
Chuck Le Butt

@Marc Nope. Hayır -sonra ec2. Öyleec2metadata --instance-id
Dawny33

5
Komut farklı Linux'larda farklıdır: Amazon Linux'ta ec2-metadata, Ubuntu'da öyle görünüyor ec2metadata.
James

Doğru James, Ubuntu üzerinde çalışan aynı ec2metadata'yı buldum.
pyAddict

69

Ubuntu'da şunları yapabilirsiniz:

sudo apt-get install cloud-utils

Ve sonra şunları yapabilirsiniz:

EC2_INSTANCE_ID=$(ec2metadata --instance-id)

Örnekle ilişkilendirilen meta verilerin çoğunu şu şekilde alabilirsiniz:

ec2metadata --help
Sözdizimi: / usr / bin / ec2metadata [seçenekler]

EC2 meta verilerini sorgulayın ve görüntüleyin.

Herhangi bir seçenek belirtilmezse, tüm seçenekler görüntülenir

Seçenekler:
    -h --help bu yardımı göster

    --kernel-id çekirdek kimliğini görüntüle
    --ramdisk-id ramdisk kimliğini görüntüle
    --reservasyon-id rezervasyon kimliğini göster

    --ami-id ami kimliğini göster
    --ami-launch-index ami başlatma dizinini görüntüler
    --ami-manifest-path ami manifest yolunu görüntüler
    --ancestor-ami-ids, ami atası kimliğini görüntüler
    --product-code'lar ami ile ilişkili ürün kodlarını görüntüler
    - kullanılabilirlik bölgesi, ami yerleşim bölgesini görüntüler

    --instance-id örnek kimliğini görüntüle
    --instance-type örnek türünü görüntüler

    --local-hostname yerel ana bilgisayar adını görüntüler
    --public-hostname genel ana bilgisayar adını görüntüler

    --local-ipv4 yerel ipv4 ip adresini görüntüler
    --public-ipv4 genel ipv4 ip adresini görüntüler

    --block-device-mapping blok cihaz kimliğini görüntüle
    --güvenlik grupları güvenlik gruplarını görüntüler

    --mac örnek mac adresini görüntüler
    --profile örnek profilini görüntüle
    --instance-action örnek eylemini görüntüle

    --public-keys, opensh genel anahtarlarını gösterir
    --user-data kullanıcı verilerini görüntüler (aslında meta verileri değil)

Ubuntu altında lucid apt-get install, bu yardımcı programı içermeyen 0.11-0ubuntu1 sürümünü alır. Daha sonra pakete eklendi .
Aryeh Leib Taurog

7
Cloud-utils paketi varsayılan olarak Ubuntu 12.04.1 LTS Cluster Compute AMI'de bulunur.
Andrew

2
cloud-utils de RHEL / CentOS'ta görünüyor
Craig Ringer

50

/dynamic/instance-identity/documentAyrıca yalnızca örnek kimliğinizden daha fazlasını sorgulamanız gerekiyorsa URL'yi kullanın .

wget -q -O - http://169.254.169.254/latest/dynamic/instance-identity/document

Bu size böyle bir JSON verisi sağlar - tek bir istekle .

{
    "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
Basit bir çağrıda instanceType dahil tüm ayrıntıları göstermek için +1
Luksurious

1
Sadece bu basit görev için ek paketler yüklemeden, oldukça standart (sadece wget) ve çalışma hattına sahip olmak için +1 (örnek veri URL'si amazon linux'da benim için çalışmadı).
tishma

27

For .NETPeople:

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

24

AWS Linux'ta:

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

Çıktı:

i-33400429

Değişkenlerde kullanma:

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

Temiz ve özlü bir yol. Ubuntu 14 ile bir örnek için kutunun dışında çalışmak
berbt

22

Powershell insanlar için:

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

4
sadece farklı bir komutan:$instanceId=(Invoke-WebRequest -Uri 'http://169.254.169.254/latest/meta-data/instance-id').Content
Sumit Murari

Invoke-WebRequest, söz konusu EC2 örneğinde bir ssm send-komutu (veya Send-SSMCommand) ile bir komut dosyası çalıştırırken her zaman çalışmaz. Belgelerde gerçekten söylemiyor . Muhtemelen bir asenkron değil ... bu garip olurdu. Ancak stefancaunter'ın seçeneği şu ana kadar sorunsuz çalışıyor.
J-Roel

22

Python için:

import boto.utils
region=boto.utils.get_instance_metadata()['local-hostname'].split('.')[1]

hangi tek astar aşağı kaynar:

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

Local_hostname yerine public_hostname kullanabilirsiniz veya:

boto.utils.get_instance_metadata()['placement']['availability-zone'][:-1]

Boto gördüğüm tüm yeni sürümleri doğrudan "instance_id" anahtarını çağırmanıza izin verir. İlgili önerilen düzenlemeleri yaptım.
sakarin

8
inst_id = boto.utils.get_instance_metadata () ['instance-id']
atisman

Bunun, örneğin sorulduğu gibi örnek kimliği değil, örneğin bulunduğu bölgeyi aldığını fark ediyorsunuz, değil mi?
LukeGT

2
Merak eden herkes için bu boto içindedir ancak henüz boto3'te değildir. Bkz stackoverflow.com/a/33733852 urllib kullanarak geçici bir çözüm için. Github.com/boto/boto3/issues/313 FWIW adresinde bir açık özellik isteği var , JS SDK'da da şu var: docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/… Kullanımnew AWS.MetadataService().request('instance-id',function(error,data) { myInstanceId = data; })
Armadillo Jim

20

Tüm ec2 makineleri için örnek kimliği dosyada bulunabilir:

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

Aşağıdaki komutu çalıştırarak örnek kimliği de alabilirsiniz:

    ec2metadata --instance-id

2
Bu, HTTP isteği gerektirmeyen çok temiz bir çözümdür.
Yuri

Mümkün olan en iyi cevap aslında
Shlublu

1
Harika yanıt ama bunun için bir referans bulamadım. referansınızın ne olduğunu sorabilir miyim? Endişe şu ki, bu kodu üretimde kullanacaksak, gelecekte değişmeyeceğini nasıl bileceğiz?
shaya ajzner

Tüm linux ec2 makineleri belki de, ama kesinlikle tüm ec2 makineleri değil . Windows'ta böyle bir dosya yok. C:\ProgramData\Amazon\EC2-Windows\Launch\Log\Ec2Launch.logid örneğini içerir, ancak bir sürü başka önemsiz öğeye de sahiptir.
James

14

Bu gönderiye bakın - verilen URL'deki IP adresinin sabit olduğunu (ilk başta beni karıştırdı), ancak döndürülen verilerin örneğinize özgü olduğunu unutmayın.


Link benim için 404ing
repalviglator

@ DEtDev'in cevabını aşağıdaki kontrol edin; cevabım oldukça eski ve bağlantı kopmuş gibi görünüyor.
gareth_bowles

10

Ruby için:

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 çocuklar ?! Düzenlememi çaldın! stackoverflow.com/review/suggested-edits/4035074
kixorz

3
Afedersiniz. "Bu iyi bir düzenleme. Ben OP. Bunu kabul et" demeyi bilmiyordum.
Kevin Meyer

10

Daha çağdaş bir çözüm.

Amazon Linux'tan ec2-metadata komutu zaten yüklü.

Terminalden

ec2-metadata -help

Size mevcut seçenekleri verecek

ec2-metadata -i

geri dönücek

instance-id: yourid

1
sözde ip bağlı olarak çok daha iyi
Mike D

birleştirmek ec2-metadatasizin ile motdburada, dokümanlar: coderwall.com/p/hr_9pw/motds-on-amazon-amis
Mike D

2
Ubuntu görüntüsünde komut "ec2metadata --instance-id" dir ve yalnızca örnek kimliği değerini döndürür
Alberto Megía


9

Bunu deneyebilirsiniz:

#!/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

Http # API'den EC2 meta verileri için yazdığım bir c # .net sınıfı. Gerektiği gibi işlevsellik ile oluşturacağım. İsterseniz onunla koşabilirsiniz.

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

En son Java SDK'sı EC2MetadataUtils :

Java dilinde:

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

Scala'da:

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

5

C ++ için (cURL kullanarak):

    #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

Basitçe kontrol var/lib/cloud/instanceo işaret etmelidir, sembolik /var/lib/cloud/instances/{instance-id}nerede {instance_id}sizin örnek-kimliğidir.


1
Bunu kullanmam. Meta verileri almak için onaylanmış HTTP isteğini kullanmaktan daha iyidir.
Daisuke Aramaki

3

Python'daki tüm örneklerin kimlik listesini almak istiyorsanız burada kod:

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 EC2 meta veri hizmetine erişim sağlamak için bir FUSE dosya sistemi yazdım: https://bitbucket.org/dgc/ec2mdfs . Bunu tüm özel AMI'lerde çalıştırıyorum; şu deyimi kullanmama izin veriyor: cat / ec2 / meta-data / ami-id


2

Go'da goamz paketini kullanabilirsiniz .

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
}

İşte GetMetaData kaynağı.


1

Kullanıcıdan root olarak bahsettiğiniz soruda, bahsetmem gereken bir şey, örnek kimliğinin kullanıcıya bağlı olmamasıdır.

İçin Düğüm geliştiricileri,

var meta  = new AWS.MetadataService();

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

1

Örnek meta verilerini almak için şunu kullanın:

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

0

Meta veri parametrelerinizi ileterek herhangi bir Meta veriyi GET almak için bir HTTP isteği yapabilirsiniz.

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

veya

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

Meta Veriler ve Kullanıcı Verileri almak için HTTP istekleri için faturalandırılmazsınız.

Başka

EC2 örneği Meta Verilerini belgelerde belirtildiği gibi çalışan bir EC2 örneğinden sorgulamak için curl kullanan basit bir bash betiği olan EC2 Örneği Meta Veri Sorgu Aracı'nı kullanabilirsiniz.

Aracı indirin:

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

şimdi gerekli verileri almak için komutu çalıştırın.

$ec2metadata -i

bakınız:

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

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

Memnuniyetle yardım ettim.. :)


0

PHP için alternatif yaklaşım:

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

Bu, örnekle ilgili bir dizi veri sağlar, hepsi bir dizide güzelce paketlenir, harici bağımlılıklar yoktur. Benim için asla başarısız veya geciktirilmemiş bir istek olduğundan, bu şekilde güvenli olmalı, aksi takdirde curl () için giderdim


0

PHP için:

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

@John başına düzenle


Ama PHP'de kıvrılma ve yerel işlevleriniz varsa GuzzeHttp'yi neden bu amaçla kullanasınız?
John

Bu benim tercihim. Diğer birçok şey için guzzle kullanıyorum, diğer birçok paket için de ortak bir önkoşuldur.
Beachhouse

$ instance = json_decode (file_get_contents (' 169.254.169.254/latest/dynamic/instance-identity/… ); $ id = $ instance [' instanceId ']; Guzzle'ın yaygın olduğunu biliyorum, asla kendime dokunmadım. basit bir görev en hafif yaklaşımı
John


0

EC2 kaynağı ile ilgili tüm meta verilere EC2 örneği tarafından, aşağıdaki komutun çalıştırılmasıyla erişilebilir:

CURL:

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

Sizin durumunuz için: " meta veri istenen " örnek kimliği olmalıdır , " api sürümü " genellikle en yenidir kullanılabilecek .

Ek Not: Yukarıdaki komutu kullanarak aşağıdaki EC2 öznitelikleriyle ilgili bilgi de alabilirsiniz.

ami-id, ami-başlat-endeksi, ami-manifest-yolu, blok-cihaz-haritalama /, ana bilgisayar adı, iam /, örnek-eylem, örnek-kimliği, örnek-tipi, yerel-ana bilgisayar adı, local-ipv4, mac, metrikler /, ağ /, yerleşim /, profil, genel ana bilgisayar adı, genel ipv4, genel anahtarlar /, rezervasyon kimliği, güvenlik grupları, hizmetler /,

Daha fazla ayrıntı için lütfen şu bağlantıyı izleyin: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html


0

Windows örneği için:

(wget http://169.254.169.254/latest/meta-data/instance-id).Content

veya

(ConvertFrom-Json (wget http://169.254.169.254/latest/dynamic/instance-identity/document).Content).instanceId

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.