web-dev-qa-db-fra.com

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

Existe-t-il un moyen de rechercher la région d'une instance à partir de celle-ci?

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

116
Gary Richardson

Cette URL ( http://169.254.169.254/latest/dynamic/instance-identity/document ) ne semble plus fonctionner. Je reçois un 404 quand j'ai essayé de l'utiliser. J'ai le code suivant qui semble fonctionner cependant:

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 t'aides.

EDIT: Amélioré sed sur la base de commentaires

127
dannosaur

Il y a 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
74
mgarman

Si vous êtes d'accord avec jq, vous pouvez exécuter:

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq .region -r

Je suppose que c'est le moyen le plus propre.

32
Ilya Sher
ec2-metadata --availability-zone | sed 's/.$//'
26
Jose Alban

Vous pouvez utiliser ec2-metadata:

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

Si vous souhaitez éviter les expressions rationnelles, voici une solution que vous pouvez utiliser avec Python:

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | python -c "import json,sys; print json.loads(sys.stdin.read())['region']"
16
Jaeyoung Chun

Plus facile que j'ai trouvé jusqu'à présent

 curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
15

très simple one liner

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

Si vous avez jq installé, vous pouvez également vous en occuper (probablement la méthode la plus "gracieuse") de cette façon:

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region

Cela retourne simplement la valeur brute de "région" sans aucune impression ni autre mise en forme. Référence: AWS Forum

8
Arbab Nazar

Sortez la région de la zone de disponibilité, enlevez sa dernière lettre.

ec2-metadata -z | awk '{print $2}' | sed 's/[a-z]$//'
6
mohrt

Utilisez JQ:

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
5
Spanky

Grâce à https://unix.stackexchange.com/a/144330/13564 , avec bash 4.2+, nous pouvons simplement supprimer le dernier caractère de la zone de disponibilité:

$ region=`curl -s 169.254.169.254/latest/meta-data/placement/availability-zone`
$ region=${region::-1}
$ echo $region
us-east-1

Cela suppose qu'AWS continue d'utiliser un seul caractère pour les zones de disponibilité ajoutées à la région.

4
Steve Jansen

C'est la solution la plus propre que j'ai trouvée:

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/  "region" : "\(.*\)"/\1/p'

Par exemple.,

export REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/  "region" : "\(.*\)"/\1/p')

  • Ne fait pas d'appel API, utilise les méta-données d'instance EC2
  • Utilise uniquement curl et basic sed, donc pas de dépendances sur les SDK ou les outils non susceptibles d'être installés.
  • N'essayez pas d'analyser le nom de la zone de disponibilité. Ne vous inquiétez donc pas si AWS modifie le format du nom de zone/région.
4
Kelly Setzer

Solution très simple, j'ai finalement trouvé après avoir lu ces réponses:

$ hostname -f | cut -d'.' -f2

Exemple:

[centos @ ip-172-31-10-75 ~] $ nom_hôte -f

ip-172-31-10-75.us-west-1.compute.internal

[centos @ ip-172-31-10-75 ~] $

[centos @ ip-172-31-10-75 ~] $ nom_hôte -f | coupé-d '.' -f2

us-west-1

4
S.K. Venkat

Si vous pouvez utiliser le kit SDK AWS Java, il existe maintenant une méthode qui renverra le nom de la région actuelle (tel que "us-east-1", "eu-west-1"). "):

http://docs.aws.Amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/regions/Regions.html#getCurrentRegion ()

4
Ken Weiner

Ou ne faites pas d'Ubuntu ou de cet outil une exigence, mais 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:]])}"}
3
flaccid

Si vous travaillez avec JSON, utilisez les bons outils. jq beaucoup puissant dans ce cas.

# curl -s curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region'
eu-west-1
3
Alan

2 doublure qui fonctionne tant que vous utilisez ec2.internal comme domaine de recherche:

az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone)
region=${az:0:${#az} - 1}
3
Gil Zellner

Pour ceux qui veulent faire ça avec le bon vieux PowerShell

$var = (curl http://169.254.169.254/latest/dynamic/instance-identity/document | Select-String-Pattern "Zone" | ConvertFrom-Json | Select-Object -ExpandProperty "region")
echo $var
3
dank

Cela fonctionne pour eu-central-1 ainsi que pour les différentes zones de lettres. (Je n'ai pas assez de rep pour répondre à la réponse sed ci-dessus)

ec2-metadata --availability-zone | sed 's/[a-z]$//'
2
Tyler Kellogg

Je cherchais également une solution pour trouver une région à partir de l'instance et voici ma solution pure de Bash:

az=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
region=${az:0:${#az}-1}

à moins qu'il y ait des régions où AZ a plus de deux lettres, ce que je ne connais pas.

1
Ajax

Pour rechercher des informations sur l'EC2 auquel vous êtes connecté, vous pouvez utiliser l'outil ec2-metadata.

Vous pouvez installer l’outil en suivant ce lien. Après l’installation de l’outil, vous pouvez exécuter

# ec2-metadata -z

pour découvrir la région.

Cet outil est installé avec les dernières AMI Ubuntu (10.10),

0
sheki

Si vous utilisez Windows, vous pouvez utiliser ce one-liner powershell:

$region=(Invoke-RestMethod "http://169.254.169.254/latest/dynamic/instance-identity/document").region
0
cwa

Si vous souhaitez que la région utilise JS, cela devrait fonctionner:

meta.request("/latest/meta-data/placement/availability-zone",function(err,data){
        if(err)
                console.log(err);
        else{
                console.log(data);
                str = data.substring(0, data.length - 1);
                AWS.config.update({region:str});
                ec2 = new AWS.EC2();
            }
     });

C'est le mappage trouvé à partir d'AWS DOCS. En réponse à l'appel de l'API de métadonnées, il suffit de couper le dernier caractère pour que cela fonctionne.

  eu-west-1a :eu-west-1
  eu-west-1b :eu-west-1
  eu-west-1c :eu-west-1
  us-east-1a :us-east-1
  us-east-1b :us-east-1
  us-east-1c :us-east-1
  us-east-1d :us-east-1
  ap-northeast-1a :ap-northeast-1
  ap-northeast-1b :ap-northeast-1
  us-west-1a :us-west-1
  us-west-1b :us-west-1
  us-west-1c :us-west-1
  ap-southeast-1a :ap-southeast-1
  ap-southeast-1b :ap-southeast-1
0