Comment puis-je trouver l' instance id
instance ec2 à partir de l'instance ec2?
Comment puis-je trouver l' instance id
instance ec2 à partir de l'instance ec2?
Réponses:
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: $?\"`"
Un exemple d'une utilisation plus avancée (récupérer l'ID d'instance ainsi que la zone et la région de disponibilité, 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.
$
), trouvez un ou plusieurs chiffres suivis par une ou plusieurs lettres minuscules. Remplacez par les chiffres uniquement. ( Entre parenthèses Backslash + DITES sed de se rappeler une sous - chaîne, qui est rappelée avec \1
.) Je trouve cela un peu plus facile à lire - les seuls antislashs sont celles requises par sed: EC2_REGION="$(echo "$EC2_AVAIL_ZONE" | sed -e 's:\([0-9][0-9]*\)[a-z]*$:\1:')"
.
http://instance-data/
au lieu de169.254.169.254
Sur les AMI Amazon Linux, vous pouvez faire:
$ ec2-metadata -i
instance-id: i-1234567890abcdef0
Ou, sur Ubuntu et quelques autres versions de Linux, ec2metadata --instance-id
(Cette commande peut ne 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.
-
après ec2
. Il estec2metadata --instance-id
ec2-metadata
, sur Ubuntu cela semble être le cas ec2metadata
.
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 façon:
ec2metadata --help Syntaxe: / usr / bin / ec2metadata [options] Recherchez et affichez les métadonnées EC2. Si aucune option n'est fournie, toutes les options seront affichées Options: -h --help afficher cette aide --kernel-id affiche l'id du noyau --ramdisk-id affiche l'id du ramdisk --reservation-id affiche l'id de réservation --ami-id affiche l'identifiant de l'ami --ami-launch-index afficher l'index de lancement ami --ami-manifest-path affiche le chemin du manifeste ami --ancestor-ami-ids affiche l'identifiant de l'ancêtre ami --product-codes afficher les codes de produit associés ami - zone de disponibilité afficher la zone de placement ami --instance-id affiche l'identifiant de l'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'ID de périphérique de bloc --security-groups affiche les groupes de sécurité --mac affiche l'adresse mac de l'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 utilisateur (pas réellement les métadonnées)
apt-get install
récupère la version 0.11-0ubuntu1 qui ne contient pas cet utilitaire. Il a été ajouté au package juste après .
Utilisez l' /dynamic/instance-identity/document
URL 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 donnera des données JSON comme celle-ci - avec une seule demande .
{
"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 les .NET
personnes:
string instanceId = new StreamReader(
HttpWebRequest.Create("http://169.254.169.254/latest/meta-data/instance-id")
.GetResponse().GetResponseStream())
.ReadToEnd();
sur AWS Linux:
ec2-metadata --instance-id | cut -d " " -f 2
Production:
i-33400429
Utilisation de variables:
ec2InstanceId=$(ec2-metadata --instance-id | cut -d " " -f 2);
ls "log/${ec2InstanceId}/";
Pour les personnes PowerShell:
(New-Object System.Net.WebClient).DownloadString("http://169.254.169.254/latest/meta-data/instance-id")
$instanceId=(Invoke-WebRequest -Uri 'http://169.254.169.254/latest/meta-data/instance-id').Content
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]
new AWS.MetadataService().request('instance-id',function(error,data) { myInstanceId = data; })
Pour toutes les machines ec2, l'ID-instance peut être trouvé 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
C:\ProgramData\Amazon\EC2-Windows\Launch\Log\Ec2Launch.log
contient l'ID d'instance, mais a également beaucoup d'autres ordures.
Voir cet article - notez que l'adresse IP dans l'URL donnée est constante (ce qui m'a dérouté au début), mais les données retournées sont spécifiques à votre instance.
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 solution plus contemporaine.
Depuis Amazon Linux, la commande ec2-metadata est déjà installée.
Depuis le terminal
ec2-metadata -help
Vous donnera les options disponibles
ec2-metadata -i
reviendra
instance-id: yourid
Tapez simplement:
ec2metadata --instance-id
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]\)"`
Une classe c # .net que j'ai écrite pour les métadonnées EC2 à partir de l'API http. Je vais le construire avec des fonctionnalités au besoin. 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
*************************************************************/
}
}
Le dernier SDK Java a EC2MetadataUtils
:
En Java:
import com.amazonaws.util.EC2MetadataUtils;
String myId = EC2MetadataUtils.getInstanceId();
À Scala:
import com.amazonaws.util.EC2MetadataUtils
val myid = EC2MetadataUtils.getInstanceId
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
Vérifiez simplement le var/lib/cloud/instance
lien symbolique, il devrait indiquer /var/lib/cloud/instances/{instance-id}
où se {instance_id}
trouve votre ID d'instance.
Si vous souhaitez obtenir la liste des identifiants de toutes les instances en 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'])
FWIW J'ai écrit un système de fichiers FUSE pour donner accès 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 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.
Dans la question que vous avez mentionnée en tant qu'utilisateur root, une chose que je dois 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);
});
Pour obtenir les métadonnées d'instance, utilisez
wget -q -O - http://169.254.169.254/latest/meta-data/instance-id
Vous pouvez simplement faire une requête HTTP pour obtenir des métadonnées en passant les paramètres de vos 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 demandes HTTP pour obtenir les métadonnées et les données utilisateur.
Autre
Vous pouvez utiliser l'outil de requête de métadonnées d'instance EC2 qui est un simple script bash qui utilise curl pour interroger les métadonnées d'instance EC2 à partir d'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 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.. :)
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, toutes joliment emballées dans un tableau, sans dépendances externes. Comme c'est une demande qui n'a jamais échoué ou retardé pour moi, il devrait être prudent de le faire de cette façon, sinon j'irais pour 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
Lance ça:
curl http://169.254.169.254/latest/meta-data/
Vous pourrez voir différents types d'attributs fournis par aws.
Toutes les métadonnées liées à la ressource EC2 sont accessibles 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ées " doit être id-instance , " api-version " est généralement le dernier qui peut ê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 /, hostname, iam /, instance-action, instance-id, instance-type, local-hostname, local-ipv4, mac, métriques /, réseau /, emplacement /, profil, public-hostname, public-ipv4, public-keys /, reservation-id, security-groups, services /,
Pour plus de détails, veuillez suivre ce lien: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html
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
Pour AWS élastique beanstalk eb cli run eb tags --list
169.254.169.254
dans/etc/hosts
si cela vous fait sentir plus en sécurité, si vous ... soins.