C'è un modo per cercare la regione di un'istanza all'interno dell'istanza?
Sto cercando qualcosa di simile al metodo di ricerca dell'ID istanza .
http://169.254.169.254/latest/meta-data/placement/availability-zone
e rimuovere l'ultimo carattere.
C'è un modo per cercare la regione di un'istanza all'interno dell'istanza?
Sto cercando qualcosa di simile al metodo di ricerca dell'ID istanza .
http://169.254.169.254/latest/meta-data/placement/availability-zone
e rimuovere l'ultimo carattere.
Risposte:
Quell'URL ( http://169.254.169.254/latest/dynamic/instance-identity/document ) non sembra funzionare più. Ottengo un 404 quando ho provato a usarlo. Ho il seguente codice che sembra funzionare però:
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]$//'`"
Spero che questo ti aiuti.
EDIT: migliorato in sed
base ai commenti
ec2-metadata
è solo un wrapper per questa API, ma essenzialmente fa la stessa cosa.
sed 's/[a-z]$//
C'è un altro modo per ottenerlo:
REGION=`curl http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\" '{print $4}'`
echo $REGION
us-east-1
404 - Not Found
provando a GET
quell'URL da una macchina in us-east-1a
.
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | awk -F\" '/region/ {print $4}'
ec2-metadata --availability-zone | sed 's/.$//'
Per i sistemi basati su Debian, il comando è senza trattino.
ec2metadata --availability-zone | sed 's/.$//'
ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'
ec2-metadata
non sembra essere qualcosa che è disponibile di default - puoi includere le istruzioni di installazione?
Se vuoi evitare l'espressione regolare, ecco un one-liner che puoi fare con 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']"
Puoi usare i metadati ec2:
ec2-metadata -z | grep -Po "(us|sa|eu|ap)-(north|south|central)?(east|west)?-[0-9]+"
eu-central-1
sei fregato.
central
non esisteva quando inizialmente ho scritto la mia risposta. È stato aggiunto ora.
awk '{split($2,arr,"-"); print arr[1]"-"arr[2]}'
manterranno solo i primi due componenti del nome AZ.
eu-west-1
, eu-west-2
e eu-west-3
(anche us-west-1
e us-west-2
) @OP: solo la corrispondenza '[a-z][a-z]-[a-z]*-[0-9][0-9]*'
sembra più sicura (che è una regex di base, può essere accorciata con un RE esteso). (L'attuale regex si spezzerà nella ca
regione, nelle af
regioni e nella me
regione)
Il più semplice che ho trovato finora
curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
una fodera molto semplice
export AVAILABILITY_ZONE=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone`
export REGION_ID=${AVAILABILITY_ZONE:0:${#AVAILABILITY_ZONE} - 1}
curl: (6) Could not resolve host: instance-data; Name or service not known
errore.
Se hai installato jq , puoi anche procedere (probabilmente il metodo più "grazioso") in questo modo:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region
Ciò restituisce semplicemente il valore grezzo di "regione" senza alcuna stampa carina o altra formattazione. Riferimento: AWS Forum
Se sei in grado di utilizzare AWS Java SDK, ora esiste un metodo che restituirà il nome della regione corrente (come "us-east-1", "eu-west-1"):
Questa è la soluzione più pulita che ho trovato:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p'
Per esempio,
export REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p')
Grazie a https://unix.stackexchange.com/a/144330/135640 , con bash 4.2+ possiamo semplicemente rimuovere l'ultimo carattere dalla zona di disponibilità:
$ region=`curl -s 169.254.169.254/latest/meta-data/placement/availability-zone`
$ region=${region::-1}
$ echo $region
us-east-1
Ciò presuppone che AWS continui a utilizzare un singolo carattere per le zone di disponibilità aggiunte alla regione.
region=${region%?}
2 liner che funziona fintanto che stai usando ec2.internal come dominio di ricerca:
az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone)
region=${az:0:${#az} - 1}
Oppure non rendere Ubuntu o questo strumento un requisito e semplicemente:
: "${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:]])}"}
Funziona con eu-central-1 e con le varie zone di lettere. (Non ho abbastanza rappresentante per rispondere alla risposta sed sopra)
ec2-metadata --availability-zone | sed 's/[a-z]$//'
ec2metadata --availability-zone | sed 's/.$//'
(senza trattino)
Stavo anche cercando una soluzione per trovare la regione dall'istanza ed ecco la mia soluzione Bash pura:
az=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
region=${az:0:${#az}-1}
a meno che non ci siano regioni in cui l'AZ ha più di due lettere, di cui non sono a conoscenza.
Per trovare informazioni sull'EC2 a cui si è effettuato l'accesso, è possibile utilizzare lo strumento metadati ec2.
Puoi installare lo strumento seguendo questo link. Dopo aver installato lo strumento, è possibile eseguire
# ec2-metadata -z
per scoprire la regione.
Questo strumento viene installato con le ultime (10.10) Ubuntu AMI,
ec2-metadata -z
mostra solo la zona di disponibilità, non la regione.
Se stai cercando di ottenere una regione usando JS, questo dovrebbe funzionare:
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();
}
});
Questa era la mappatura trovata da AWS DOCS, in risposta alla chiamata API dei metadati, basta tagliare l'ultimo carattere che dovrebbe funzionare.
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
ec2metadata
(senza trattino) è il comando corrente per fornirti tutte le informazioni di hosting di aws sulla tua ec2 box. questo è l'approccio più elegante e sicuro. ( ec2-metadata
è il vecchio comando non più valido.)
Un metodo che utilizza solo egrep, che dovrebbe funzionare sulla maggior parte delle istanze di Linux senza che sia necessario installare alcun tool aggiuntivo. Ho provato questo contro un elenco di tutte le regioni AWS correnti e tutte corrispondono.
curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]'
region=$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]')
Ad un certo punto da quando sono state pubblicate molte di queste risposte, AWS ha fatto la cosa ragionevole e ha implementato un nuovo percorso: latest/meta-data/placement/region
.
Ciò significa che ottenere la regione dovrebbe essere semplice come
REGION="$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/region)"
È possibile ottenere la regione dell'istanza utilizzando questa richiesta di arricciatura
$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1