web-dev-qa-db-fra.com

Comment obtenir l'ID d'instance depuis une instance ec2?

Comment trouver le instance id d'une instance ec2 dans l'instance ec2?

324
flybywire

Voir la documentation EC2 sur le sujet .

Courir:

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

Si vous avez besoin d’un accès programmatique à l’ID d’instance à partir d’un script,

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

Exemple d'utilisation plus avancée (récupération de l'ID d'instance, de la zone de disponibilité et de la région, etc.):

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

Vous pouvez également utiliser curl au lieu de wget, selon ce qui est installé sur votre plate-forme.

468
vladr

Sur les AMI Amazon Linux, vous pouvez effectuer les tâches suivantes:

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

Ou, sur Ubuntu et d'autres versions de Linux, ec2metadata --instance-id (cette commande ne peut pas être installée par défaut sur ubuntu, mais vous pouvez l'ajouter avec Sudo apt-get install cloud-utils)

Comme son nom l'indique, vous pouvez également utiliser la commande pour obtenir d'autres métadonnées utiles.

111
James

Sur Ubuntu, vous pouvez:

Sudo apt-get install cloud-utils

Et alors vous pouvez:

EC2_INSTANCE_ID=$(ec2metadata --instance-id)

Vous pouvez obtenir la plupart des métadonnées associées à l'instance de cette façon:

 ec2metadata --help 
 Syntaxe:/usr/bin/ec2metadata [options] 

 Interrogation et affichage des métadonnées EC2 .

 Si aucune option n'est fournie, toutes les options seront affichées. 

 Options: 
 -h --help montrer cette aide 

 --kernel-id affiche l'identifiant du noyau 
 --ramdisk-id affiche l'identifiant du disque virtuel 
 --reservation-id affiche l'identifiant de réservation 

 --AMI-id affiche l'identifiant AMI 
 --AMI-launch-index affiche l'indice de lancement de l'AMI 
 --AMI-manifest-path affiche le chemin du manifeste AMI 
 --ancestor-AMI-ids affiche l'ID ancêtre AMI 
 --product-codes affiche les codes de produit associés à l'AMI 
 --availability-zone affiche la zone de placement de l'AMI 

 --instance-id affiche l'ID d'instance 
 --instance-type affiche le type d'instance 

 --local-hostname affiche le nom d'hôte local 
 --public-hostname affiche le nom d'hôte public 

 --local-ipv4 affiche l'adresse ip locale ipv4 
 --public-ipv4 affiche l'adresse ip publique ipv4 

 --block-device-mapping affiche l'identifiant du périphérique en bloc 
 --security-groups affiche les groupes de sécurité 

 --mac affiche l'adresse de l'instance mac 
 --profile affiche le profil d'instance 
 --instance-action affiche l'instance-action 

 --public-keys affiche les clés publiques openssh 
 --user-data affiche les données de l'utilisateur (pas réellement des métadonnées) 
55
rhunwicks

Utilisez l'URL /dynamic/instance-identity/document si vous devez également interroger davantage que votre ID d'instance.

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

Vous obtiendrez ainsi JSON des données telles que celle-ci - avec uniquement une demande unique .

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

Pour .NET Personnes: 

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

sur AWS Linux: 

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

Sortie:

i-33400429

Utilisation de variables:

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

Pour Python:

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

qui se résume au one-liner:

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

Au lieu de local_hostname, vous pouvez également utiliser public_hostname ou:

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

Pour les gens PowerShell:

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

Voir cet article - Notez que l'adresse IP dans l'URL donnée est constante (ce qui m'a confondu au début), mais que les données renvoyées sont spécifiques à votre instance.

11
gareth_bowles

Il suffit de taper:

ec2metadata --instance-id
8
Akash Arya

Une solution plus contemporaine.

Sur Amazon Linux, la commande ec2-metadata est déjà installée.

Du terminal

ec2-metadata -help

Vous donnera les options disponibles

ec2-metadata -i

reviendra

instance-id: yourid
8
DetDev

Pour toutes les machines ec2, l'instance-id peut être trouvée dans le fichier:

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

Vous pouvez également obtenir l'ID d'instance en exécutant la commande suivante:

    ec2metadata --instance-id
7
Aman

Pour 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

Vous pouvez essayer ceci:

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

Le dernier SDK Java a EC2MetadataUtils:

En Java:

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

En Scala:

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

Une classe c # .net que j'ai écrite pour les métadonnées EC2 à partir de http api . Je la construirai avec les fonctionnalités nécessaires. Vous pouvez courir avec si vous l'aimez.

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

Pour C++ (en utilisant 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
Medical physicist

Si vous souhaitez obtenir la liste de tous les identificateurs d'instance disponibles en utilisant python, voici le 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

Dans Go, vous pouvez utiliser le paquet 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
}

Voici la source GetMetaData.

1
dmikalova

FWIW J'ai écrit un système de fichiers Fuse pour fournir l'accès au service de métadonnées EC2: https://bitbucket.org/dgc/ec2mdfs . cela me permet d'utiliser cet idiome: cat/ec2/meta-data/AMI-id

1
dgc

Vérifiez simplement le lien symbolique var/lib/cloud/instance, il devrait pointer sur /var/lib/cloud/instances/{instance-id}, où {instance_id} est votre ID d'instance.

1
greg

Dans la question que vous avez mentionnée en tant qu'utilisateur root, il convient de mentionner que l'ID d'instance ne dépend pas de l'utilisateur. 

Pour Node developer,

var meta  = new AWS.MetadataService();

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

Toutes les métadonnées relatives aux ressources EC2 peuvent être consultées par l'instance EC2 elle-même à l'aide de la commande suivante en cours d'exécution:

CURL:

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

Pour votre cas: "métadonnées-demandé" devrait être instance-id, "api-version" est généralement latest pouvant être utilisé.

Remarque supplémentaire: Vous pouvez également obtenir des informations sur les attributs EC2 ci-dessous à l’aide de la commande ci-dessus.

AMI-id, AMI-launch-index, AMI-manifest-path, Block-device-mapping /, Nom_hôte, Iam /, Instance-action, instance-id, type-instance, nom-hôte-local, local-ipv4, mac, métriques /, réseau /, placement/, profile, public-hostname, public-ipv4, public-keys /, reservation-id, security-groups, services /,

Pour plus de détails, suivez ce lien: https://docs.aws.Amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html

0
Vipin Sharma

Pour une instance Windows:

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

ou

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

Approche alternative pour PHP:

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

Cela fournira beaucoup de données sur l'instance, le tout bien emballé dans un tableau, pas de dépendances externes ... C'est une requête qui n'a jamais échoué ou retardée, il devrait être sûr de le faire de cette façon, sinon aller pour curl ()

0
John

Pour PHP:

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

Modifier par @John

0
Beachhouse

Lance ça:

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

Vous pourrez voir différents types d'attributs fournis par aws.

Utilisez ce lien pour voir plus

0
Chinthaka Hasakelum

Pour obtenir les métadonnées d'instance, utilisez

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

Vous pouvez simplement faire une requête HTTP pour obtenir n'importe quelle métadonnée en transmettant vos paramètres de métadonnées.

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

ou 

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

Les requêtes HTTP pour obtenir des métadonnées et des données utilisateur ne seront pas facturées.

Else

Vous pouvez utiliser l'outil de requête de métadonnées d'instance EC2, qui est un simple script bash utilisant curl pour interroger l'instance EC2 à partir d'une instance EC2 en cours d'exécution, comme indiqué dans la documentation.

Télécharger l'outil:

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

maintenant, exécutez la commande pour obtenir les données requises.

$ec2metadata -i

Référer:

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

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

Heureux d'aider.. :)

0
Sarat Chandra

Pour AWS elastic beanstalk eb cli exécuter eb tags --list

0
user2584621