Comment obtenir l’ID d’instance dans une instance ec2?

Comment puis-je trouver l’ instance id d’une instance ec2 depuis l’instance ec2?

    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 access par programme à 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: $?\"`" 

    Un exemple d’utilisation plus avancée (récupérer l’ID d’instance, la zone de disponibilité et 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]*\)[az]*\$:\\1:'`" 

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

    Sur les AMI Amazon Linux, vous pouvez faire:

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

    Ou, sur Ubuntu et d’autres ec2metadata --instance-id Linux, ec2metadata --instance-id (cette commande peut ne pas être installée par défaut sur ubuntu, mais vous pouvez l’append 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.

    Sur Ubuntu, vous pouvez:

     sudo apt-get install cloud-utils 

    Et puis vous pouvez:

     EC2_INSTANCE_ID=$(ec2metadata --instance-id) 

    Vous pouvez obtenir la plupart des métadonnées associées à l’instance de cette manière:

     ec2metadata --help
     Syntaxe: / usr / bin / ec2metadata [options]
    
     Interroger et afficher les métadonnées EC2.
    
     Si aucune option n'est fournie, toutes les options seront affichées
    
     Options:
         -h --help montre cette aide
    
         --kernel-id affiche l'id du kernel
         --ramdisk-id affiche l'identifiant du disque virtuel
         --reservation-id affiche l'identifiant de réservation
    
         --ami-id affiche l'id ami
         --ami-launch-index affiche l'index de lancement ami
         --ami-manifest-path affiche le chemin d'access manifeste
         --ancestor-ami-ids affiche l'id ancêtre ami
         --product-codes affiche les codes de produit associés
         --availability-zone affiche la zone de placement 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 ipv4 locale
         --public-ipv4 affiche l'adresse IP publique ipv4
    
         --block-device-mapping affiche l'ID de périphérique de bloc
         --security-groups affiche les groupes de sécurité
    
         --mac affiche l'adresse mac d'instance
         --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 les métadonnées)
    

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

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

    Cela vous permettra d’obtenir des données JSON telles que celles-ci – avec une seule requête .

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

    Pour .NET personnes .NET :

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

    Pour Python:

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

    qui se résume à la monoplace:

     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] 

    sur AWS Linux:

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

    Sortie:

    i-33400429

    En utilisant dans les variables:

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

    Pour les gens de PowerShell:

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

    Voir ce post – notez que l’adresse IP dans l’URL indiquée est constante (ce qui m’a confondu au début), mais les données renvoyées sont spécifiques à votre instance.

    Il suffit de taper:

     ec2metadata --instance-id 

    Une solution plus contemporaine

    À partir d’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 

    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[az]\)"` 

    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] 

    Une classe c # .net que j’ai écrite pour les métadonnées EC2 du http api. Je vais le construire avec des fonctionnalités si nécessaire. Vous pouvez courir avec elle si vous l’aimez.

     using Amazon; using System.Net; namespace AT.AWS { public static class HttpMetaDataAPI { public static bool TryGetPublicIP(out ssortingng publicIP) { return TryGetMetaData("public-ipv4", out publicIP); } public static bool TryGetPrivateIP(out ssortingng privateIP) { return TryGetMetaData("local-ipv4", out privateIP); } public static bool TryGetAvailabilityZone(out ssortingng availabilityZone) { return TryGetMetaData("placement/availability-zone", out availabilityZone); } ///  /// 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 ///  /// The service we are seeking (such as ec2, rds etc) /// Each AWS service has a different endpoint url for each region /// True if the operation was succesful, otherwise false public static bool TryGetServiceEndpointUrl(ssortingng serviceName, out ssortingng serviceEndpointSsortingngUrl) { // 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); serviceEndpointSsortingngUrl = (details.HTTPS ? "https://" : "http://") + details.Hostname; return true; } // satisfy the comstackr by assigning a value to serviceEndpointSsortingngUrl serviceEndpointSsortingngUrl = 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: ssortingng availabilityZone; if (TryGetAvailabilityZone(out availabilityZone)) { // name of the availability zone is [a|b|c etc] // so just take the name of the availability zone and chop off the last letter var nameOfRegionEndpoint = availabilityZone.Subssortingng(0, availabilityZone.Length - 1); endpoint = RegionEndpoint.GetBySystemName(nameOfRegionEndpoint); return true; } // satisfy the comstackr by assigning a value to endpoint endpoint = RegionEndpoint.USWest2; return false; } ///  /// Downloads instance metadata ///  /// True if the operation was successful, false otherwise /// The operation will be unsuccessful if the machine running this code is not an AWS EC2 machine. static bool TryGetMetaData(ssortingng name, out ssortingng result) { result = null; try { result = new WebClient().DownloadSsortingng("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 mesortingcs/ network/ placement/ profile public-hostname public-ipv4 public-keys/ reservation-id security-groups *************************************************************/ } } 

    Le dernier SDK Java a EC2MetadataUtils :

    En Java:

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

    En Scala:

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

    Pour toutes les machines ec2, l’identifiant d’instance se trouve 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 

    Pour C ++ (en utilisant cURL):

      #include  //// cURL to ssortingng size_t curl_to_str(void *contents, size_t size, size_t nmemb, void *userp) { ((std::ssortingng*)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 ssortingng 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 

    FWIW J’ai écrit un système de fichiers FUSE pour donner access au service de métadonnées EC2: https://bitbucket.org/dgc/ec2mdfs . Je l’exécute sur toutes les AMI personnalisées; cela me permet d’utiliser cet idiome: cat / ec2 / meta-data / ami-id

    Dans Go, vous pouvez utiliser le package goamz .

     import ( "github.com/mitchellh/goamz/aws" "log" ) func getId() (id ssortingng) { idBytes, err := aws.GetMetaData("instance-id") if err != nil { log.Fatalf("Error getting instance-id: %v.", err) } id = ssortingng(idBytes) return id } 

    Voici la source GetMetaData.

    Vérifiez simplement le lien symbolique var/lib/cloud/instance , il doit pointer sur /var/lib/cloud/instances/{instance-id}{instance_id} est votre identifiant d’instance.

    Si vous souhaitez obtenir l’ID d’instance 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']) 

    Vous pouvez simplement faire une requête HTTP pour obtenir des métadonnées en passant vos parameters 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 

    Vous ne serez pas facturé pour les requêtes HTTP pour obtenir des métadonnées et des données utilisateur.

    Autre

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

    Téléchargez l’outil:

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

    Exécutez maintenant la commande pour obtenir les données requirejses.

     $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.. 🙂

    Dans la question que vous avez mentionnée en tant qu’utilisateur root, une chose que je devrais mentionner est que l’ID d’instance ne dépend pas de l’utilisateur.

    Pour les développeurs de nœuds ,

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

    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, bien emballées dans un tableau, sans dépendance externe. Comme il s’agit d’une demande qui n’a jamais échoué ou qui a été retardée pour moi, cela devrait être sûr de le faire de cette façon, sinon je ferais une curl ()

    Pour PHP:

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

    Modifier par @John