Frage

Wie kann ich die instance id einer EC2-Instanz aus der EC2-Instanz herausfinden?

War es hilfreich?

Lösung

Siehe die EC2-Dokumentation zum Thema .

Ausführen:

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

Wenn Sie programatic Zugriff auf die Instanz-ID müssen aus einem Skript,

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 einer fortgeschritteneren Anwendung (Instanz-ID sowie der Verfügbarkeit Zone und die Region, etc. abrufen.):

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 statt wget, je nach Verwendung, was auf Ihrer Plattform installiert ist.

Andere Tipps

Auf Amazon Linux Ami können Sie tun:

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

Oder auf Ubuntu und einigen anderen Linux-Varianten, ec2metadata --instance-id (Dieser Befehl ist nicht standardmäßig auf Ubuntu installiert werden kann, aber man kann es mit sudo apt-get install cloud-utils hinzufügen)

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

Auf Ubuntu können Sie:

sudo apt-get install cloud-utils

Und dann können Sie:

EC2_INSTANCE_ID=$(ec2metadata --instance-id)

Sie können mit der Instanz auf diese Weise verbunden sind die meisten der Metadaten erhalten:

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)

Mit der /dynamic/instance-identity/document URL, wenn Sie auch brauchen, um abzufragen, als nur die Instanz-ID.

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

Diese erhalten Sie auf JSON Daten wie das. - mit nur einem einzelne Anfrage

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

Für .NET Menschen:

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

auf AWS Linux:

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

Ausgabe:

i-33400429

Unter Verwendung des in Variablen:

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

Für Python:

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

, welche auf die Einzeiler läuft darauf hinaus:

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

Statt lokaler_Host_Name könnten Sie auch public_hostname, oder:

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

Für Powershell Personen:

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

Siehe diesen Beitrag -. beachten Sie, dass die IP-Adresse in der angegebenen URL konstant ist (was mich anfangs verwirrt), aber die zurückgegebenen Daten ist spezifisch für die Instanz

Eine modernere Lösung.

Von Amazon Linux der EC2-Metadaten Befehl bereits installiert ist.

Vom Terminal

ec2-metadata -help

Wollen Sie die verfügbaren Optionen geben

ec2-metadata -i

wird wieder

instance-id: yourid

Just Typ:

ec2metadata --instance-id

Für alle EC2 Maschinen, die Instanz-ID kann in der Datei gefunden werden:

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

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

    ec2metadata --instance-id

Sie können versuchen, diese:

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

Für Rubin:

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]

A c # .net-Klasse-I für EC2 Metadaten aus dem http api schrieb. Ich werde es mit Funktionalität aufbauen je nach Bedarf. Sie können mit ihm 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
*************************************************************/
    }
}

Die 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

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

Wenn Sie alle verfügbaren Instanz-ID-Liste erhalten möchten hier mit Python ist der 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'])

FWIW ich ein FUSE-Dateisystem geschrieben Zugriff auf den EC2-Metadaten-Service zur Verfügung zu stellen: https://bitbucket.org/dgc / ec2mdfs . Ich laufe dies auf allen benutzerdefinierten Ami; es erlaubt mir dieses Idiom zu verwenden: cat / EC2 / meta-data / ami-ID

In Go können Sie die Verwendung goamz Paket .

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 der GetMetadata Quelle.

Sie einfach die var/lib/cloud/instance Symlink überprüfen, sollte es zeigen, wo /var/lib/cloud/instances/{instance-id} {instance_id} Instanz-ID ist.

Sie können nur eine HTTP-Anforderung machen alle Metadaten zu erhalten, indem die Metadaten Parameter.

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

Sie werden nicht für HTTP-Anforderungen in Rechnung gestellt werden Metadaten und Benutzerdaten zu erhalten.

Else

Sie können EC2 Instanz Metadaten Abfrage-Tool verwenden, die ein einfacher Bash-Skript, das das EC2-Instanz Metadaten in einer laufenden EC2-Instanz abzufragen curl verwendet als in der Dokumentation erwähnt.

Laden Sie das Tool:

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

Jetzt Befehl ausführen, um erforderlichen Daten zu erhalten.

$ec2metadata -i

Siehe:

http: //docs.aws.amazon .com / AWSEC2 / latest / Userguide / EC2-Instanz-metadata.html

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

Happy To Help ..:)

In der Frage, die Sie den Benutzer als root erwähnt haben, eine Sache, die ich erwähnen sollte, ist, dass die Instanz-ID für den Benutzer nicht abhängig ist.

node Entwickler,

var meta  = new AWS.MetadataService();

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

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 eine Menge Daten über die Instanz zur Verfügung stellen wird, die alle schön in einem Array gepackt, ohne externe Abhängigkeiten. Da es eine Anforderung ist, die für mich nie im Stich gelassen oder verzögert sollte es sicher sein, dass es so zu tun, sonst ich für curl gehen würde ()

Für PHP:

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

Bearbeiten pro @John

Führen Sie diese:

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

können Sie verschiedene Arten von Attributen, um zu sehen, die durch aws vorgesehen sind.

Nutze diesen Link um mehr

Alle Meta-Daten zu EC2 Ressource im Zusammenhang können durch die EC2-Instanz selbst mit Hilfe des folgenden Befehls zugegriffen werden ausgeführt werden:

Curl:

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

Für Ihren Fall: " Metadaten-requested " sollte Instanz-ID " api-Version " ist in der Regel neueste , das verwendet werden kann.

Weiteres. Hinweis: Sie können auch Informationen im Zusammenhang erhalten unter EC2-Attribute des obigen Befehl mit

ami-id, ami-Launch-Index, ami-manifest-Pfad, Block-device-Kartierungs- /, Hostname, ich bin/, instanz Aktion, Instanz-ID, instance-Typ, local-Hostname, local-ipv4, Mac, Metriken /, Netzwerk/, Platzierung/, Profil, öffentlich-Hostname, öffentlich-ipv4, öffentlich-Tasten /, Reservierung-id, Sicherheitsgruppen, Dienstleistungen /,

Weitere Informationen finden Sie unter folgendem Link: https : //docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

die Instanz Metadaten benutzen Sie

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

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

Für AWS Elastic Bohnenstengel eb cli laufen eb tags --list

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top