Есть ли способ найти регион экземпляра внутри экземпляра?
Я ищу что-то похожее на метод поиска идентификатор экземпляра.
Есть ли способ найти регион экземпляра внутри экземпляра?
Я ищу что-то похожее на метод поиска идентификатор экземпляра.
Этот URL (http://169.254.169.254/latest/dynamic/instance-identity/document) больше не работает. Я получаю 404, когда пытаюсь его использовать. У меня есть следующий код, который, похоже, работает:
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]$//'`"
Надеюсь это поможет.
РЕДАКТИРОВАТЬ: улучшено sed на основе комментариев
ec2-metadata - это просто оболочка для этого API, но, по сути, делает то же самое.
- person dannosaur; 07.04.2015
sed 's/[a-z]$//
- person threejeez; 13.08.2015
http://169.254.169.254/latest/dynamic/instance-identity/document в регионе us-west-2 (Орегон). Не знаю, не работало, но определенно работает (для меня!) Сейчас.
- person Calrion; 22.05.2016
echo "${EC2_AVAIL_ZONE: : -1}". В bash 4.2+ вы можете удалить пробел между двумя :.
- person kikap; 17.05.2018
sed, так и bashisms вы можете использовать эту гораздо более переносимую замену: EC2_REGION=${EC2_AVAIL_ZONE%?}
- person mtraceur; 23.01.2019
sed: sed 's/.$/', потому что . в регулярном выражении соответствует любому последнему символу.
- person mtraceur; 23.01.2019
sed даннозавра), например: "${EC2_AVAIL_ZONE%[a-z]}"
- person Boop; 15.05.2019
AWS_DEFAULT_REGION=`curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/[a-z]$//'`
- person Daniel Hajduk; 17.10.2019
EC2_REGION=${EC2_AVAIL_ZONE%[a-z]}
- person Fabian Ritzmann; 26.05.2020
Есть еще один способ добиться этого:
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 попытку GET получить этот URL с машины в us-east-1a.
- person Adam Monsen; 21.06.2012
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
- person Yaron; 17.06.2014
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | awk -F\" '/region/ {print $4}'
- person Yaron; 04.08.2014
Если вы согласны с использованием jq, вы можете запустить следующее:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq .region -r
Думаю, это самый чистый способ.
ec2-metadata --availability-zone | sed 's/.$//'
Для систем на базе Debian команда не должна содержать тире.
ec2metadata --availability-zone | sed 's/.$//'
ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'
- person nahsh; 06.06.2018
ec2-metadata похоже, не является чем-то, что доступно по умолчанию - можете ли вы включить инструкции по установке?
- person Tim Malone; 17.04.2019
Если вы хотите избежать регулярных выражений, вот однострочник, который вы можете сделать с помощью 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']"
Вы можете использовать метаданные ec2:
ec2-metadata -z | grep -Po "(us|sa|eu|ap)-(north|south|central)?(east|west)?-[0-9]+"
eu-central-1, вы облажались.
- person dannosaur; 07.04.2015
central не существовало, когда я изначально написал свой ответ. Это добавлено сейчас.
- person Daniel Kuppitz; 07.04.2015
awk '{split($2,arr,"-"); print arr[1]"-"arr[2]}' сохранит только первые два компонента имени AZ.
- person dskrvk; 15.09.2016
eu-west-1, eu-west-2 и eu-west-3 (также us-west-1 и us-west-2) @OP: просто соответствие '[a-z][a-z]-[a-z]*-[0-9][0-9]*' кажется более безопасным (это базовое регулярное выражение, его можно сделать короче с помощью расширенного RE). (Текущее регулярное выражение разбивается на область ca, область af и область me)
- person Gert van den Berg; 06.07.2020
Самый простой, который я нашел до сих пор
curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'
очень простой однострочник
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 ошибку.
- person S.K. Venkat; 04.04.2018
Если у вас установлен jq, вы также можете сделать это (вероятно, самый «изящный» метод) следующим образом:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region
Это просто возвращает исходное значение «региона» без какой-либо красивой печати или другого форматирования. Ссылка: Форум AWS
В какой-то момент после публикации большинства этих ответов AWS поступила разумно и реализовала новый путь: latest/meta-data/placement/region.
Это означает, что получение региона должно быть таким же простым, как
REGION="$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/region)"
РЕДАКТИРОВАТЬ: также, вероятно, стоит упомянуть, что эта конечная точка была доступна в версии API метаданных 2019-10-01. Перед использованием убедитесь, что ваш экземпляр поддерживает эту или более позднюю версию, установив флажок http://169.254.169.254/.
http://169.254.169.254/latest/meta-data/placement. region возвращается как один из перечисленных вариантов?
- person SteveGoob; 19.01.2021
region конечной точки, поэтому она была недоступна - как задокументировано.
- person yurez; 20.01.2021
Берем регион из зоны доступности, убираем из него последнюю букву.
ec2-metadata -z | awk '{print $2}' | sed 's/[a-z]$//'
Используйте JQ:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
Если вы можете использовать AWS Java SDK, теперь существует метод, который вернет текущее имя региона (например, «us-east-1», «eu-west-1»):
Это самое чистое решение, которое я нашел:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p'
E.g.,
export REGION=$(curl -s http://169.254.169.254/latest/dynamic/instance-identity/document |sed -n 's/ "region" : "\(.*\)"/\1/p')
Благодаря https://unix.stackexchange.com/a/144330/135640, с bash 4.2+ мы можем просто удалите последний символ из зоны доступности:
$ region=`curl -s 169.254.169.254/latest/meta-data/placement/availability-zone`
$ region=${region::-1}
$ echo $region
us-east-1
Это предполагает, что AWS продолжает использовать один символ для зон доступности, добавленных к региону.
region=${region%?}
- person David Jones; 21.01.2016
2, который работает, пока вы используете ec2.internal в качестве поискового домена:
az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone)
region=${az:0:${#az} - 1}
Для всех, кто хочет сделать это с помощью старого доброго 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
Или не делайте Ubuntu или этот инструмент обязательными, а просто выполните:
: "${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:]])}"}
Если вы работаете с json - используйте правильные инструменты. jq в этом случае очень мощный.
# curl -s curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r '.region'
eu-west-1
Это работает для eu-central-1, а также для различных буквенных зон. (У меня недостаточно репутации, чтобы ответить на ответ sed выше)
ec2-metadata --availability-zone | sed 's/[a-z]$//'
ec2metadata --availability-zone | sed 's/.$//' (без тире)
- person Vladimir Kondratyev; 15.11.2019
Если вы работаете в Windows, вы можете использовать эту однострочную оболочку PowerShell:
$region=(Invoke-RestMethod "http://169.254.169.254/latest/dynamic/instance-identity/document").region
Чтобы узнать информацию о EC2, в которую вы вошли, вы можете использовать инструмент метаданных ec2.
Вы можете установить инструмент, перейдя по этой ссылке. После установки инструмента Вы можете запустить
# ec2-metadata -z
чтобы узнать регион.
Эти инструменты устанавливаются с последними (10.10) образцами Ubuntu AMI,
ec2-metadata -z показывает только зону доступности, но не регион.
- person Matt Solnit; 01.04.2011
Если вы хотите получить регион с помощью JS, это должно сработать:
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();
}
});
Это было сопоставление, найденное в AWS DOCS, в ответ на вызов API метаданных, просто обрезать последний символ должно работать.
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
Также искал решение для поиска региона из экземпляра, и вот мое чистое решение Bash:
az=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone)
region=${az:0:${#az}-1}
если нет регионов, где AZ имеет более двух букв, о которых я не знаю.
ec2metadata (без тире) - это текущая команда, которая предоставляет вам всю информацию о хостинге aws для вашего блока ec2. это самый элегантный и безопасный подход. (ec2-metadata - это старая, уже недействительная команда.)
Метод, использующий только egrep, который должен работать на большинстве запущенных экземпляров Linux без необходимости установки каких-либо дополнительных инструментов. Я проверил это по списку всех текущих регионов AWS, и все они совпадают.
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]')
Для решения sed и curl похоже, что формат немного изменился. У меня работает
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | sed -n 's/ "region" : "\(.*\)"[,]/\1/p'
Вы можете получить регион экземпляра, используя этот запрос curl
$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1
http://169.254.169.254/latest/meta-data/placement/availability-zoneи удалите последний символ. - person Sarsaparilla   schedule 09.12.2017http://169.254.169.254/latest/meta-data/placement/region- person d4nyll   schedule 06.08.2020