Czy istnieje sposób na wyszukanie regionu instancji z poziomu instancji?
Szukam czegoś podobnego do metody znajdowania identyfikatora instancji .
Czy istnieje sposób na wyszukanie regionu instancji z poziomu instancji?
Szukam czegoś podobnego do metody znajdowania identyfikatora instancji .
http://169.254.169.254/latest/meta-data/placement/availability-zone
i usuń ostatni znak.
http://169.254.169.254/latest/meta-data/placement/region
Odpowiedzi:
Ten adres URL ( http://169.254.169.254/latest/dynamic/instance-identity/document ) już nie działa. Otrzymuję kod 404, gdy próbowałem go użyć. Mam następujący kod, który jednak wydaje się działać:
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]$//'`"
Mam nadzieję że to pomoże.
EDYCJA: Ulepszona sed
na podstawie komentarzy
ec2-metadata
jest tylko opakowaniem tego interfejsu API, ale zasadniczo robi to samo.
sed 's/[a-z]$//
Jest jeszcze jeden sposób, aby to osiągnąć:
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
próbuje GET
tego adresu URL z automatu w 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/.$//'
W przypadku systemów opartych na Debianie polecenie jest bez myślnika.
ec2metadata --availability-zone | sed 's/.$//'
ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'
ec2-metadata
nie wygląda na coś, co jest dostępne domyślnie - czy możesz dołączyć instrukcje dotyczące instalacji?
Jeśli chcesz uniknąć wyrażeń regularnych, oto jedna linijka, którą możesz zrobić w Pythonie:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | python -c "import json,sys; print json.loads(sys.stdin.read())['region']"
Możesz użyć ec2-metadata:
ec2-metadata -z | grep -Po "(us|sa|eu|ap)-(north|south|central)?(east|west)?-[0-9]+"
eu-central-1
środku, masz przerąbane.
central
nie istniało, kiedy początkowo pisałem odpowiedź. Jest teraz dodany.
awk '{split($2,arr,"-"); print arr[1]"-"arr[2]}'
zachowuje tylko pierwsze dwa składniki nazwy AZ.
eu-west-1
, eu-west-2
a eu-west-3
(także us-west-1
i us-west-2
) @OP: samo dopasowanie '[a-z][a-z]-[a-z]*-[0-9][0-9]*'
wydaje się bezpieczniejsze (to jest podstawowe wyrażenie regularne, można je skrócić za pomocą rozszerzonego RE). (Bieżące wyrażenie regularne zostanie przerwane na ca
region, af
regiony i me
region)
Najłatwiejsze, jakie znalazłem do tej pory
curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
bardzo prosta jedna wkładka
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
błąd.
Jeśli masz zainstalowany jq , możesz to zrobić (prawdopodobnie najbardziej wdzięczna metoda) w ten sposób:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region
Zwraca to po prostu nieprzetworzoną wartość „regionu” bez żadnego ładnego nadruku lub innego formatowania. Źródła: AWS Forum
Jeśli możesz korzystać z AWS Java SDK, istnieje teraz metoda, która zwraca bieżącą nazwę regionu (na przykład „us-east-1”, „eu-west-1”):
To najczystsze rozwiązanie, jakie znalazłem:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p'
Na przykład,
export REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p')
Dzięki https://unix.stackexchange.com/a/144330/135640 przy bash 4.2+ możemy po prostu usunąć ostatni znak ze strefy dostępności:
$ region=`curl -s 169.254.169.254/latest/meta-data/placement/availability-zone`
$ region=${region::-1}
$ echo $region
us-east-1
Zakłada się, że AWS nadal używa jednego znaku dla stref dostępności dołączonych do regionu.
region=${region%?}
2 liner, który działa tak długo, jak używasz ec2.internal jako domeny wyszukiwania:
az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone)
region=${az:0:${#az} - 1}
W pewnym momencie, ponieważ większość z tych odpowiedzi zostały zamieszczone, AWS zrobił coś rozsądnego i wdrożono nową drogę: latest/meta-data/placement/region
.
Oznacza to, że pobranie regionu powinno być tak proste, jak
REGION="$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/region)"
EDYCJA: Warto również wspomnieć, że ten punkt końcowy został udostępniony w wersji API metadanych 2019-10-01. Przed użyciem upewnij się, że Twoja instancja obsługuje tę lub nowszą wersję, zaznaczając http://169.254.169.254/
.
Lub nie wymagaj Ubuntu lub tego narzędzia i po prostu zrób:
: "${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:]])}"}
Działa to dla eu-central-1, jak również dla różnych stref literowych. (Nie mam wystarczającej liczby przedstawicieli, aby odpowiedzieć na powyższą odpowiedź seda)
ec2-metadata --availability-zone | sed 's/[a-z]$//'
ec2metadata --availability-zone | sed 's/.$//'
(bez kreski)
Aby znaleźć informacje o EC2, do którego jesteś zalogowany, możesz skorzystać z narzędzia ec2-metadata.
Narzędzie można zainstalować, korzystając z tego łącza. Po zainstalowaniu narzędzia możesz uruchomić
# ec2-metadata -z
poznać region.
To narzędzie jest instalowane z najnowszym (10.10) systemem AMI Ubuntu,
ec2-metadata -z
pokazuje tylko strefę dostępności, a nie region.
Jeśli chcesz uzyskać region za pomocą JS, powinno to działać:
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();
}
});
To było mapowanie znalezione z AWS DOCS, w odpowiedzi na wywołanie API metadanych, wystarczy przyciąć ostatni znak.
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
(bez myślnika) to bieżące polecenie, które zapewnia wszystkie informacje o hostingu aws dotyczące twojego ec2 box. jest to najbardziej eleganckie i bezpieczne podejście. ( ec2-metadata
jest starym, już nieważnym poleceniem).
Metoda wykorzystująca tylko egrep, która powinna działać na większości uruchomionych instancji Linuksa bez konieczności instalowania jakichkolwiek dodatkowych narzędzi. Przetestowałem to na liście wszystkich obecnych regionów AWS i wszystkie pasują.
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]')
Możesz uzyskać region wystąpienia za pomocą tego żądania curl
$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1