169 votes

Trouver une région à partir d'une instance EC2

Existe-t-il un moyen de rechercher la région d'une instance depuis l'intérieur de l'instance ?

Je cherche quelque chose de similaire à la méthode de trouver l'identifiant de l'instance .

1 votes

12 votes

Réponse courte pour tous ceux qui ne se soucient pas de tous les scripts shell : récupérez la zone de disponibilité à partir de http://169.254.169.254/latest/meta-data/placement/availabili‌​ty-zone et supprimer le dernier caractère.

0 votes

173voto

dannosaur Points 434

Cette URL ( http://169.254.169.254/latest/dynamic/instance-identity/document ) ne semble plus fonctionner. J'obtiens un message 404 lorsque j'essaie de l'utiliser. J'ai le code suivant qui semble fonctionner :

EC2_AVAIL_ZONE=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone`
EC2_REGION="`echo \"$EC2_AVAIL_ZONE\" | sed 's/[a-z]$//'`"

J'espère que cela vous aidera.

EDIT : Amélioration de sed sur la base des commentaires

4 votes

Ceci doit être exécuté à l'intérieur de l'instance EC2 et est alimenté par les backends d'AWS. Il ne fonctionnera nulle part ailleurs (essentiellement parce que cette IP est un APIPA). Il n'y a pas non plus de moyen d'obtenir ces informations directement de l'intérieur de l'instance sans se connecter à une source de métadonnées. Cela suppose que l'API 169.254.169.254 est disponible, et votre script devrait gérer les défaillances du réseau en conséquence. ec2-metadata est juste une enveloppe pour cette API, mais fait essentiellement la même chose.

1 votes

Est-ce quelque chose de documenté ? Pouvez-vous expliquer comment vous l'avez trouvé ?

2 votes

En toute honnêteté, lorsque j'ai trouvé cette phrase, j'étais en train de fouiller dans l'API à la recherche de tout ce que je pourrais utiliser pour identifier la région correcte. L'API de métadonnées AWS est entièrement documentée ici : docs.aws.amazon.com/AWSEC2/latest/UserGuide/

90voto

mgarman Points 301

Il existe un autre moyen d'y parvenir :

REGION=`curl http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\" '{print $4}'`

echo $REGION

us-east-1

0 votes

Cela devrait-il fonctionner dans n'importe quelle région/zone (et sur n'importe quel AMI) ? Je reçois 404 - Not Found en essayant de GET cette URL à partir d'une machine dans us-east-1a .

0 votes

@AdamMonsen peut-être était-ce une erreur passagère. Je suis sur us-east-1a et ça marche très bien.

0 votes

Merci @FlorinAndrei. Cela fonctionne aussi pour moi maintenant.

17voto

Daniel Kuppitz Points 646

Vous pouvez utiliser ec2-metadata :

ec2-metadata -z | grep -Po "(us|sa|eu|ap)-(north|south|central)?(east|west)?-[0-9]+"

2 votes

Avec ça, si vous êtes dans eu-central-1 vous êtes foutu.

2 votes

central n'existait pas lorsque j'ai initialement écrit ma réponse. Elle est ajoutée maintenant.

24 votes

Un script qui se casse à chaque fois qu'AWS ajoute une nouvelle région ne me semble pas être une solution particulièrement solide.

14voto

Ravi Kumar Points 31

Une phrase très simple

export AVAILABILITY_ZONE=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone`
export REGION_ID=${AVAILABILITY_ZONE:0:${#AVAILABILITY_ZONE} - 1}

10 votes

C'est deux lignes

1 votes

Mais cela ne fonctionne pas sur la région us-west-1. Retourne curl: (6) Could not resolve host: instance-data; Name or service not known erreur.

1 votes

@S.K.Venkat Cela est probablement lié aux paramètres DNS de votre VPC... L'utilisation de l'IP de l'API métadonnées semble plus sûre (la moitié des autres réponses le font).

3voto

flaccid Points 31

Ou ne faites pas d'Ubuntu ou de cet outil une exigence et faites-le tout simplement :

: "${EBS_VOLUME_AVAILABILITY_ZONE:=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)}"
: ${EBS_VOLUME_REGION:="${EBS_VOLUME_AVAILABILITY_ZONE%%*([![:digit:]])}"}

2 votes

Notez que cela ne fonctionne que parce que actuellement la zone de disponibilité est toujours le nom de la région auquel est ajoutée une lettre minuscule (par exemple, la région est "us-west-1", la zone est "us-west-1a"). Si Amazon rompt un jour ce schéma, la logique ci-dessus ne fonctionnera plus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X