Знайдіть регіон із екземпляра EC2


131

Чи є спосіб шукати область екземпляра всередині екземпляра?

Я шукаю щось подібне до методу пошуку ідентифікатора екземпляра .



8
Коротка відповідь для тих, хто не переймається всіма сценаріями оболонки: http://169.254.169.254/latest/meta-data/placement/availability-zoneдістаньте зону наявності та видаліть останній символ.
Сарсапарілла

Відповіді:


147

Ця 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]$//'`"

Сподіваюся, це допомагає.

EDIT: Удосконалено sedна основі коментарів


4
Це потрібно запустити всередині екземпляра EC2 і живитись за допомогою програмного забезпечення AWS. Він не працюватиме більше ніде (по суті, тому, що IP - це APIPA). Крім того, немає можливості отримати цю інформацію безпосередньо з екземпляра, не підключаючись до джерела метаданих. Це передбачає, що API 169.254.169.254 доступний, і ваш сценарій повинен відповідати мережним збоям відповідно. ec2-metadataє лише обгорткою для цього API, але по суті робить те ж саме.
dannosaur

1
Це щось задокументоване? Чи можете ви пояснити, як ви його знайшли?
meawoppl

2
Чесно кажучи, коли я придумав цей 2-лайнер, я просто роздумував над API, шукаючи все, що міг би використати для визначення правильної області. API метаданих AWS повністю задокументований тут: docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
dannosaur

12
Набагато простіша команда заміни sed, ніж та, яка була передбачена для EC2_REGION:sed 's/[a-z]$//
threejeez

2
Якщо це є початковим сценарієм, служба метаданих може бути ще не екземпляром - якщо так, зачекайте та спробуйте ще раз. Я бачив, як пройде 10-15 секунд після завантаження, щоб розташування метаданих стало доступним.
vacri

81

Є ще один спосіб досягти цього:

REGION=`curl http://169.254.169.254/latest/dynamic/instance-identity/document|grep region|awk -F\" '{print $4}'`

echo $REGION

us-east-1

Чи має це працювати в будь-якому регіоні / az (і в будь-якому AMI)? Я отримую 404 - Not Foundнамагаюся GETцим URL з машини в us-east-1a.
Адам Монсен

@AdamMonsen, можливо, це була тимчасова помилка. Я на нас-схід-1а, і це чудово працює.
Флорін Андрій

Дякую @FlorinAndrei Зараз працює і для мене.
Адам Монсен

3
З jq:curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
Ярон

4
З awk:curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | awk -F\" '/region/ {print $4}'
Ярон

38

Якщо ви все добре використовуєте jq, ви можете виконати наступне:

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

Я думаю, це найчистіший спосіб.


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

Для систем на базі debian команда не має тире.

ec2metadata --availability-zone | sed 's/.$//'

6
Отримайте чистий рядок лише з назвою регіону:ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'
nahsh

ec2-metadataЗдається, це не те, що доступно за замовчуванням - чи можна включити інструкції з установки?
Тім Малоун

23

Якщо ви хочете уникати регулярних виразів, ось однолінійка, яку ви можете зробити з 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']"

Ця відповідь повинна бути вищою!
Костас Деміріс

@KostasDemiris Я згоден, швидше читайте значення в структурі JSON, ніж регулярний вираз.
lasec0203

1
Я згоден, це здається найкращим способом зробити це, якщо у вас не встановлено jq. Ви дійсно очікуєте, що AWS
викладе

17

Ви можете використовувати метадані ec2:

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

2
З цим, якщо ти в eu-central-1тебе, накрутили.
dannosaur

2
centralне існувало, коли я спочатку написав свою відповідь. Додано зараз.
Даніель Куппіц

22
Сценарій, який ламається щоразу, коли AWS додає новий регіон, не здається мені особливо сильним рішенням.
Райан Б. Лінч

1
Замість grep, awk '{split($2,arr,"-"); print arr[1]"-"arr[2]}'збереже лише перші два компоненти назви AZ.
dskrvk

@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регіон)
Герт ван ден Берг


14

дуже простий один лайнер

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

4
Це два рядки
Крістіан

1
Але це не працює у регіоні «Захід-1». Повернення curl: (6) Could not resolve host: instance-data; Name or service not knownпомилки.
СК Венкат

1
@SKVenkat Це, ймовірно, пов’язано з налаштуваннями DNS вашого VPC ... Використання IP для метаданих-api здається безпечнішим (половина інших відповідей це робить)
Gert van den Berg

@GertvandenBerg, я його другий ..
SK Venkat

9

Якщо у вас встановлено jq , ви також можете піти про це (мабуть, самий «витончений» метод) таким чином:

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

Це просто повертає вихідне значення "регіону" без будь-якого симпатичного друку чи іншого форматування. Довідка: Форум AWS


7

Дістаньте регіон із зони доступності, зніміть останню літеру.

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



4

Це найчистіше рішення, яке я знайшов:

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

Наприклад,

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

  • Не робить виклик API, використовує метадані екземпляра EC2
  • Використовується лише curl та basic sed, тому ніяких залежностей від SDK чи інструментів, ймовірно, не буде встановлено.
  • Не намагається проаналізувати ім'я зони доступності, тому не хвилюйтесь, якщо AWS змінить формат імені AZ / Region

Так ідеально, дякую. Цей результат легко десеріалізувати в об'єкт json.
dinamilynk

Я отримую кому в кінці.
Крейг

4

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


5
Нам завжди вдавалося зняти останнього персонажа в оболонці:region=${region%?}
Девід Джонс,

4

2 вкладиш, який працює до тих пір, поки ви використовуєте ec2.internal як пошуковий домен:

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

4

Для всіх, хто хоче це зробити за допомогою доброї оболонки

$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

Або не пред'являйте вимоги до 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:]])}"}

2
Зауважте, що це працює лише тому, що в даний час зоною доступності завжди є назва регіону з доданою до нього малою літерою (наприклад, область "us-west-1", зона - "us-west-1a"). Якщо Amazon коли-небудь порушить цю схему, то вищевикладена логіка більше не працюватиме.
Мет Солніт

3

Якщо ви працюєте з json - використовуйте правильні інструменти. jq набагато потужніший у цьому випадку.

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

3

Це працює для eu-central-1, а також для різних літерних зон. (У мене немає достатньої кількості відповідей, щоб відповісти на відповідь sed вище)

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

Це повинно бути ec2metadata --availability-zone | sed 's/.$//'(без тире)
Володимир Кондратьєв

3

Якщо ви працюєте на Windows, ви можете використовувати цей одношаровий корпус повноважень:

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

1

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

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

якщо немає регіонів, де в АЗ є більше двох букв, про які я не знаю.


0

Для отримання інформації про EC2, у який ви ввійшли, ви можете скористатися інструментом метаданих ec2.

Ви можете встановити інструмент, перейшовши за цим посиланням. Після установки інструменту можна запустити

# ec2-metadata -z

щоб дізнатися регіон.

Цей інструмент встановлюється з останніми (10.10) Ubuntu AMI,


4
Це неправильно. ec2-metadata -zпоказує лише зону доступності, а не регіон.
Мет Солніт

0

Якщо ви хочете отримати регіон за допомогою 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

0

ec2metadata(без тире) - це поточна команда, яка надає вам всю інформацію про ваш вікно ec2. це найелегантніший і безпечний підхід. ( ec2-metadataце стара, вже не дійсна команда.)


Це може залежати від вибраного типу віртуальної коробки. Я дотримуюся Linux.
GViz

0

Метод, що використовує лише 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]')


0

Для рішення sed і curl схоже, що формат трохи змінився. Для мене працює

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

0

В якій - то момент , так як це більшість з цих відповідей були розміщені, AWS зробив розумну річ і реалізований новий шлях: latest/meta-data/placement/region.

Це означає, що отримати регіон має бути так само просто

REGION="$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/region)"

0

Ви можете отримати регіон екземпляра, використовуючи цей запит на згортання

$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.