Найти регион в экземпляре EC2

Есть ли способ найти регион экземпляра внутри экземпляра?

Я ищу что-то похожее на метод поиска идентификатор экземпляра.


person Gary Richardson    schedule 22.11.2010    source источник
comment
возможный дубликат Узнайте идентификатор экземпляра из ec2 машина   -  person Till    schedule 28.11.2010
comment
Короткий ответ для тех, кому наплевать на все сценарии оболочки: получите зону доступности из http://169.254.169.254/latest/meta-data/placement/availability-zone и удалите последний символ.   -  person Sarsaparilla    schedule 09.12.2017
comment
Отвечает ли это на ваш вопрос? Как получить идентификатор экземпляра из ec2 экземпляр?   -  person dWinder    schedule 11.05.2020
comment
Для тех, кто читает пост в середине 2020 года, теперь вы можете использовать http://169.254.169.254/latest/meta-data/placement/region   -  person d4nyll    schedule 06.08.2020


Ответы (28)


Этот 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 на основе комментариев

person dannosaur    schedule 16.03.2012
comment
Он должен запускаться внутри экземпляра EC2 и питаться от серверной части AWS. Он не будет работать больше нигде (в основном потому, что этот IP-адрес является APIPA). Также нет возможности получить эту информацию непосредственно из экземпляра без подключения к источнику метаданных. Это предполагает, что API 169.254.169.254 доступен, и ваш сценарий должен соответствующим образом обрабатывать сетевые сбои. ec2-metadata - это просто оболочка для этого API, но, по сути, делает то же самое. - person dannosaur; 07.04.2015
comment
Это что-то задокументировано? Вы можете объяснить, как вы это нашли? - person meawoppl; 18.05.2015
comment
Честно говоря, когда я придумал этот двухстрочный лайнер, я просто копался в API в поисках чего-нибудь, что можно было бы использовать для определения правильного региона. API метаданных AWS полностью задокументирован здесь: docs.aws .amazon.com / AWSEC2 / latest / UserGuide / - person dannosaur; 18.05.2015
comment
Гораздо более простая команда sed replace, чем та, которая предусмотрена для EC2_REGION: sed 's/[a-z]$// - person threejeez; 13.08.2015
comment
IID, безусловно, работает, поэтому взглянуть на него чище, чем это предположение о том, как Amazon будет выбирать имена зон. - person bmargulies; 19.11.2015
comment
Интересно, случайно ли люди, которые не могут заставить работать 169.254.169.254, заблокировали его брандмауэром? - person David Jones; 07.01.2016
comment
Просто для записи, я только что успешно получил документ JSON, который включал AZ из http://169.254.169.254/latest/dynamic/instance-identity/document в регионе us-west-2 (Орегон). Не знаю, не работало, но определенно работает (для меня!) Сейчас. - person Calrion; 22.05.2016
comment
Если это в сценарии начальной загрузки, возможно, служба метаданных еще не создана - если это так, подождите и попробуйте еще раз. Я видел, что после загрузки требуется 10-15 секунд, чтобы расположение метаданных стало доступным. - person vacri; 27.03.2018
comment
Вы можете избежать вызова sed echo "${EC2_AVAIL_ZONE: : -1}". В bash 4.2+ вы можете удалить пробел между двумя :. - person kikap; 17.05.2018
comment
В качестве альтернативы как sed, так и bashisms вы можете использовать эту гораздо более переносимую замену: EC2_REGION=${EC2_AVAIL_ZONE%?} - person mtraceur; 23.01.2019
comment
Еще проще sed: sed 's/.$/', потому что . в регулярном выражении соответствует любому последнему символу. - person mtraceur; 23.01.2019
comment
Я предпочитаю удалять, только если они есть, и только известные возможности (точно так же, как sed даннозавра), например: "${EC2_AVAIL_ZONE%[a-z]}" - person Boop; 15.05.2019
comment
Сделано небольшое улучшение, чтобы упростить использование в Ansible: 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
comment
В bash мы можем использовать расширение параметров, чтобы сделать вторую строку более краткой и без создания отдельных процессов: 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
person mgarman    schedule 13.02.2012
comment
Должно ли это работать в любом регионе / аз (и на любом AMI)? Я получаю 404 - Not Found попытку GET получить этот URL с машины в us-east-1a. - person Adam Monsen; 21.06.2012
comment
@AdamMonsen, возможно, это временная ошибка. Я на нас-восток-1а и отлично работает. - person Florin Andrei; 12.03.2014
comment
Спасибо @FlorinAndrei. У меня тоже работает. - person Adam Monsen; 13.03.2014
comment
С jq: curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region - person Yaron; 17.06.2014
comment
С awk: curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | awk -F\" '/region/ {print $4}' - person Yaron; 04.08.2014
comment
Это небезопасно и небезопасно полагаться. - person chicks; 03.04.2015

Если вы согласны с использованием jq, вы можете запустить следующее:

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

Думаю, это самый чистый способ.

person Ilya Sher    schedule 15.10.2015

ec2-metadata --availability-zone | sed 's/.$//'

Для систем на базе Debian команда не должна содержать тире.

ec2metadata --availability-zone | sed 's/.$//'
person Jose Alban    schedule 16.06.2016
comment
Получить чистую строку только с названием региона: ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/' - person nahsh; 06.06.2018
comment
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']"
person Jaeyoung Chun    schedule 26.07.2016
comment
Этот ответ должен быть выше! - person Kostas Demiris; 21.09.2016
comment
@KostasDemiris Я согласен, лучше читать значение из структуры JSON, чем из регулярного выражения. - person lasec0203; 15.08.2017
comment
Я согласен, что это лучший способ сделать это, если у вас не установлен jq. Вы действительно ожидаете, что AWS представит это как что-то вроде 169.254.169.254/latest/meta-data / место размещения / регион ... - person Krenair; 22.01.2018

Вы можете использовать метаданные ec2:

ec2-metadata -z | grep -Po "(us|sa|eu|ap)-(north|south|central)?(east|west)?-[0-9]+"
person Daniel Kuppitz    schedule 02.09.2012
comment
С этим, если вы в eu-central-1, вы облажались. - person dannosaur; 07.04.2015
comment
central не существовало, когда я изначально написал свой ответ. Это добавлено сейчас. - person Daniel Kuppitz; 07.04.2015
comment
Сценарий, который ломается каждый раз, когда AWS добавляет новый регион, мне не кажется особенно сильным решением. - person Ryan B. Lynch; 09.06.2015
comment
Вместо grep, awk '{split($2,arr,"-"); print arr[1]"-"arr[2]}' сохранит только первые два компонента имени AZ. - person dskrvk; 15.09.2016
comment
@dskrvk Если вы оставите только первые два компонента, как вы различаете между 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/.$//'
person Francesco Gualazzi    schedule 25.05.2016
comment
Преимущество этого заключается в отсутствии зависимостей, отличных от значений по умолчанию, и это всего лишь одна строка. - person Mark Stosberg; 29.08.2018

очень простой однострочник

export AVAILABILITY_ZONE=`wget -qO- http://instance-data/latest/meta-data/placement/availability-zone`
export REGION_ID=${AVAILABILITY_ZONE:0:${#AVAILABILITY_ZONE} - 1}
person Ravi Kumar    schedule 13.03.2013
comment
Это две строки - person Christian; 27.03.2018
comment
Но это не работает в регионе США-Запад-1. Возвращает curl: (6) Could not resolve host: instance-data; Name or service not known ошибку. - person S.K. Venkat; 04.04.2018
comment
@ S.K.Venkat Это, вероятно, связано с настройками DNS вашего VPC ... Использование IP для метаданных-api кажется более безопасным (половина других ответов делает это) - person Gert van den Berg; 06.07.2020

Если у вас установлен jq, вы также можете сделать это (вероятно, самый «изящный» метод) следующим образом:

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

Это просто возвращает исходное значение «региона» без какой-либо красивой печати или другого форматирования. Ссылка: Форум AWS

person Arbab Nazar    schedule 29.09.2018

В какой-то момент после публикации большинства этих ответов 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/.

person SteveGoob    schedule 30.06.2020
comment
У меня это сработало в некоторых случаях, но в других я получаю сообщение 404 Not Found, даже если последняя доступная версия - 2020-10-27. - person yurez; 19.01.2021
comment
Ха, попробуй просто http://169.254.169.254/latest/meta-data/placement. region возвращается как один из перечисленных вариантов? - person SteveGoob; 19.01.2021
comment
Оказалось, что проблемные экземпляры работали без перезапуска с момента добавления region конечной точки, поэтому она была недоступна - как задокументировано. - person yurez; 20.01.2021

Берем регион из зоны доступности, убираем из него последнюю букву.

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

Используйте JQ:

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

Если вы можете использовать AWS Java SDK, теперь существует метод, который вернет текущее имя региона (например, «us-east-1», «eu-west-1»):

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

person Ken Weiner    schedule 20.02.2015

Это самое чистое решение, которое я нашел:

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')

  • Не выполняет вызов API, использует метаданные экземпляра EC2
  • Использует только curl и базовый sed, поэтому никакие зависимости от SDK или инструментов вряд ли будут установлены.
  • Не пытается проанализировать имя зоны доступности, поэтому не беспокойтесь, если AWS изменит формат имени AZ / региона
person Kelly Setzer    schedule 27.04.2015
comment
Да отлично, спасибо. Этот результат можно легко десериализовать в объект json. - person dynamiclynk; 16.06.2015
comment
Я получаю запятую в конце. - person Craig; 04.06.2017

Благодаря 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 продолжает использовать один символ для зон доступности, добавленных к региону.

person Steve Jansen    schedule 24.09.2015
comment
Мы всегда могли удалить последний символ в оболочке: 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}
person Gil Zellner    schedule 06.09.2017

Для всех, кто хочет сделать это с помощью старого доброго 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
person dank    schedule 19.02.2018

Или не делайте 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:]])}"}
person flaccid    schedule 09.03.2011
comment
Обратите внимание, что это работает только потому, что в настоящее время зона доступности - это всегда имя региона с добавленной к нему строчной буквой (например, регион - us-west-1, зона - us-west-1a). Если Amazon когда-нибудь нарушит этот шаблон, приведенная выше логика перестанет работать. - person Matt Solnit; 01.04.2011

Если вы работаете с json - используйте правильные инструменты. jq в этом случае очень мощный.

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

Это работает для eu-central-1, а также для различных буквенных зон. (У меня недостаточно репутации, чтобы ответить на ответ sed выше)

ec2-metadata --availability-zone | sed 's/[a-z]$//'
person rec    schedule 31.05.2017
comment
Должно быть 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
person cwa    schedule 25.05.2019

Чтобы узнать информацию о EC2, в которую вы вошли, вы можете использовать инструмент метаданных ec2.

Вы можете установить инструмент, перейдя по этой ссылке. После установки инструмента Вы можете запустить

# ec2-metadata -z

чтобы узнать регион.

Эти инструменты устанавливаются с последними (10.10) образцами Ubuntu AMI,

person sheki    schedule 01.12.2010
comment
Это неверно. 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
person Surya Prakash Patel    schedule 20.06.2017

Также искал решение для поиска региона из экземпляра, и вот мое чистое решение Bash:

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

если нет регионов, где AZ имеет более двух букв, о которых я не знаю.

person Ajax    schedule 02.04.2019

ec2metadata (без тире) - это текущая команда, которая предоставляет вам всю информацию о хостинге aws для вашего блока ec2. это самый элегантный и безопасный подход. (ec2-metadata - это старая, уже недействительная команда.)

person GViz    schedule 06.10.2019
comment
Это может зависеть от выбранного вами типа виртуального ящика. Я придерживаюсь Linux. - person GViz; 09.12.2019

Метод, использующий только egrep, который должен работать на большинстве запущенных экземпляров Linux без необходимости установки каких-либо дополнительных инструментов. Я проверил это по списку всех текущих регионов AWS, и все они совпадают.

curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]'

Пояснение к REGEX:

  • "(\ w) +" Соответствует любому количеству букв
  • "-" соответствует только одному тире
  • «[0-9]» соответствует любому 1 числу

Если вы хотите, чтобы это было в переменной, выполните:

region=$(curl http://169.254.169.254/latest/meta-data/placement/availability-zone | egrep -o '(\w)+-(\w)+-[0-9]')

person Chart96    schedule 25.04.2020

Для решения sed и curl похоже, что формат немного изменился. У меня работает

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | sed -n 's/ "region" : "\(.*\)"[,]/\1/p'
person denken    schedule 10.06.2020

Вы можете получить регион экземпляра, используя этот запрос curl

$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1
person Артем Косенко    schedule 28.07.2020
comment
Это просто дублированный ответ stackoverflow.com/a/62664161/3966682 - person d4nyll; 06.08.2020