it-swarm.com.de

Wie bekomme ich die Instanz-ID aus einer ec2-Instanz?

Wie kann ich den instance id einer ec2-Instanz aus der ec2-Instanz herausfinden?

324
flybywire

Siehe die EC2-Dokumentation zum Thema .

Lauf:

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

Wenn Sie programmgesteuerten Zugriff auf die Instanz-ID aus einem Skript benötigen,

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

Ein Beispiel für eine erweiterte Verwendung (Abrufen der Instanz-ID sowie Verfügbarkeitszone und -region usw.):

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

Sie können auch curl anstelle von wget verwenden, je nachdem, was auf Ihrer Plattform installiert ist.

468
vladr

Bei Amazon Linux AMIs können Sie Folgendes tun:

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

Oder auf Ubuntu und einigen anderen Linux-Varianten: ec2metadata --instance-id (Dieser Befehl ist unter Ubuntu möglicherweise nicht standardmäßig installiert. Sie können ihn jedoch mit Sudo apt-get install cloud-utils hinzufügen.)

Wie der Name schon sagt, können Sie den Befehl auch verwenden, um andere nützliche Metadaten abzurufen.

111
James

Auf Ubuntu können Sie:

Sudo apt-get install cloud-utils

Und dann kannst du:

EC2_INSTANCE_ID=$(ec2metadata --instance-id)

Sie können die meisten mit der Instanz verknüpften Metadaten auf folgende Weise abrufen:

 ec2metadata --help 
 Syntax:/usr/bin/ec2metadata [Optionen] 

 EC2-Metadaten abfragen und anzeigen .

 Wenn keine Optionen angegeben sind, werden alle Optionen angezeigt 

Optionen:
 -h --help Diese Hilfe anzeigen 

 --kernel-id Anzeige der Kernel-ID 
 --ramdisk-id Anzeige der Ramdisk-ID 
 --reservierungs-id zeigt die Reservierungs-ID an 

 --AMI-id Anzeige der AMI-ID 
 --AMI-Launch-Index zeigt den AMI-Launch-Index an 
 --AMI-Manifestpfad Zeigt den AMI-Manifestpfad an 
 --ancestor-AMI-ids zeigen die AMI-Vorfahren-ID an 
 --Produktcodes zeigen die mit AMI verbundenen Produktcodes an 
 --availability-zone zeigt die AMI-Placement-Zone an 

 --instance-id zeigt die Instanz-ID an 
 - Instanztyp zeigt den Instanztyp an 

 --local-hostname zeigt den lokalen Hostnamen an 
 --public-hostname zeigt den öffentlichen Hostnamen an 

 --local-ipv4 Zeigt die lokale IPv4-IP-Adresse an 
 --public-ipv4 Anzeige der öffentlichen IPv4-IP-Adresse 

 - Block-Device-Mapping zeigt die Blockgeräte-ID an 
 --security-groups zeigen die Sicherheitsgruppen an 

 --mac zeigt die Instanz-MAC-Adresse an 
 --profile zeigt das Instanzprofil an 
 --instance-action zeigt die Instanz-Aktion an 

 --public-keys zeigt die öffentlichen openssh-Schlüssel an 
 --user-data zeigt die Benutzerdaten an (keine Metadaten) 
55
rhunwicks

Verwenden Sie die /dynamic/instance-identity/document-URL, wenn Sie auch mehr als nur Ihre Instanz-ID abfragen möchten.

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

Dadurch erhalten SieJSON- Daten wie diese - mit nur einer Einzelanfrage .

{
    "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"
}
41
Konrad Kiss

Für .NET Leute: 

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

unter AWS Linux: 

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

Ausgabe:

i-33400429

Verwendung in Variablen:

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

Für Python:

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

was auf den Einliner hinausläuft:

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

Anstelle von local_hostname können Sie auch public_hostname verwenden oder:

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

Für Powershell-Leute:

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

In diesem Beitrag - beachten Sie, dass die IP-Adresse in der angegebenen URL konstant ist (was mich zunächst verwirrt hat), die zurückgegebenen Daten jedoch für Ihre Instanz spezifisch sind.

11
gareth_bowles

Schreib einfach:

ec2metadata --instance-id
8
Akash Arya

Eine zeitgemäßere Lösung.

Unter Amazon Linux ist der Befehl ec2-metadata bereits installiert.

Vom Terminal aus

ec2-metadata -help

Gibt Ihnen die verfügbaren Optionen

ec2-metadata -i

wird zurückkehren

instance-id: yourid
8
DetDev

Für alle ec2-Maschinen befindet sich die Instanz-ID in der Datei:

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

Sie können die Instanz-ID auch erhalten, indem Sie den folgenden Befehl ausführen:

    ec2metadata --instance-id
7
Aman

Für 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]
7
Kevin Meyer

Sie können dies versuchen:

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

Das neueste Java SDK hat EC2MetadataUtils:

In Java:

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

In Scala:

import com.amazonaws.util.EC2MetadataUtils
val myid = EC2MetadataUtils.getInstanceId
6
Scott Smith

Eine c # .net-Klasse, die ich für EC2-Metadaten von http api ..__ geschrieben habe. Ich werde sie mit der erforderlichen Funktionalität aufbauen. Sie können damit laufen, wenn es Ihnen gefällt.

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

Für C++ (mit 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
4

Wenn Sie die Liste aller verfügbaren Instanz-IDs mit Python abrufen möchten, finden Sie hier den Code:

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
Vikas Satpute

In Go können Sie das Paket goamz verwenden.

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
}

Hier ist die GetMetaData-Quelle.

1
dmikalova

FWIW Ich habe ein Fuse-Dateisystem geschrieben, um Zugriff auf den EC2-Metadatendienst zu gewähren: https://bitbucket.org/dgc/ec2mdfs .. __ Ich führe dies auf allen benutzerdefinierten AMIs aus; Es erlaubt mir, diesen Ausdruck zu verwenden: cat/ec2/meta-data/AMI-id

1
dgc

Überprüfen Sie einfach den var/lib/cloud/instance-Symlink. Er sollte auf /var/lib/cloud/instances/{instance-id} zeigen, wobei {instance_id} Ihre Instanz-ID ist.

1
greg

In der Frage, die Sie als Benutzer root angegeben haben, sollte ich erwähnen, dass die Instanz-ID nicht vom Benutzer abhängig ist. 

Für Node Entwickler

var meta  = new AWS.MetadataService();

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

Auf alle Metadaten, die sich auf die EC2-Ressource beziehen, kann von der EC2-Instanz selbst mit Hilfe des folgenden Befehls zugegriffen werden:

CURL:

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

Für Ihren Fall: "metadata-demand" sollte instance-id sein, "api-version" ist normalerweise latest, die verwendet werden kann.

Zusätzlicher Hinweis: Mit dem obigen Befehl können Sie auch Informationen zu folgenden EC2-Attributen abrufen.

AMI-ID, AMI-Startindex, AMI-Manifestpfad, Blockgeräteabbildung /, Hostname, Iam /, Instanzaktion, Instanz-ID, Instanztyp, local-hostname, local-ipv4, mac, metrics /, network /, placement/, Profil, public-hostname, public-ipv4, public-keys /, Reservierungs-ID, Sicherheitsgruppen, services /,

Für weitere Informationen folgen Sie diesem Link: https://docs.aws.Amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

0
Vipin Sharma

Für eine Windows-Instanz:

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

oder

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

Alternativer Ansatz für PHP:

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

Das wird eine Menge Daten über die Instanz liefern, alles schön gepackt in einem Array, keine externen Abhängigkeiten. Da es sich um eine Anfrage handelt, die für mich niemals fehlgeschlagen oder verzögert wurde, sollte es sicher sein, es auf diese Weise zu tun zum Locken gehen ()

0
John

Für PHP:

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

Bearbeiten Sie per @John

0
Beachhouse

Führen Sie das aus:

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

Sie können verschiedene Arten von Attributen sehen, die von aws bereitgestellt werden.

Verwenden Sie diesen Link, um mehr anzuzeigen

0

Um die Instanz-Metadaten zu erhalten, verwenden Sie

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

Sie können einfach eine HTTP-Anforderung an GET beliebige Metadaten senden, indem Sie Ihre Metadatenparameter übergeben.

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

oder 

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

HTTP-Anforderungen zum Abrufen von Metadaten und Userdaten werden nicht in Rechnung gestellt.

Else

Sie können das EC2-Instanz-Metadaten-Abfrage-Tool verwenden, ein einfaches Bash-Skript, das curl verwendet, um die EC2-Instanz-Metadaten aus einer laufenden EC2-Instanz abzufragen, wie in der Dokumentation beschrieben.

Laden Sie das Tool herunter:

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

führen Sie jetzt den Befehl aus, um die erforderlichen Daten abzurufen.

$ec2metadata -i

Verweisen:

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

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

Freue mich zu helfen.. :)

0
Sarat Chandra

Führen Sie für AWS elastische Bohnenstange eb cli eb tags --list aus.

0
user2584621