Чи є спосіб шукати область екземпляра всередині екземпляра?
Я шукаю щось подібне до методу пошуку ідентифікатора екземпляра .
http://169.254.169.254/latest/meta-data/placement/availability-zone
дістаньте зону наявності та видаліть останній символ.
Чи є спосіб шукати область екземпляра всередині екземпляра?
Я шукаю щось подібне до методу пошуку ідентифікатора екземпляра .
http://169.254.169.254/latest/meta-data/placement/availability-zone
дістаньте зону наявності та видаліть останній символ.
Відповіді:
Ця 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
на основі коментарів
ec2-metadata
є лише обгорткою для цього API, але по суті робить те ж саме.
sed 's/[a-z]$//
Є ще один спосіб досягти цього:
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
.
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/.$//'
Для систем на базі debian команда не має тире.
ec2metadata --availability-zone | sed 's/.$//'
ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'
ec2-metadata
Здається, це не те, що доступно за замовчуванням - чи можна включити інструкції з установки?
Якщо ви хочете уникати регулярних виразів, ось однолінійка, яку ви можете зробити з 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
тебе, накрутили.
central
не існувало, коли я спочатку написав свою відповідь. Додано зараз.
awk '{split($2,arr,"-"); print arr[1]"-"arr[2]}'
збереже лише перші два компоненти назви AZ.
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
регіон)
Найпростіше я знайшов поки що
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
помилки.
Якщо у вас встановлено jq , ви також можете піти про це (мабуть, самий «витончений» метод) таким чином:
curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -c -r .region
Це просто повертає вихідне значення "регіону" без будь-якого симпатичного друку чи іншого форматування. Довідка: Форум AWS
Якщо ви можете використовувати 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'
Наприклад,
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%?}
2 вкладиш, який працює до тих пір, поки ви використовуєте ec2.internal як пошуковий домен:
az=$(curl -s http://instance-data/latest/meta-data/placement/availability-zone)
region=${az:0:${#az} - 1}
Або не пред'являйте вимоги до 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:]])}"}
Це працює для eu-central-1, а також для різних літерних зон. (У мене немає достатньої кількості відповідей, щоб відповісти на відповідь sed вище)
ec2-metadata --availability-zone | sed 's/[a-z]$//'
ec2metadata --availability-zone | sed 's/.$//'
(без тире)
Для отримання інформації про EC2, у який ви ввійшли, ви можете скористатися інструментом метаданих ec2.
Ви можете встановити інструмент, перейшовши за цим посиланням. Після установки інструменту можна запустити
# ec2-metadata -z
щоб дізнатися регіон.
Цей інструмент встановлюється з останніми (10.10) Ubuntu AMI,
ec2-metadata -z
показує лише зону доступності, а не регіон.
Якщо ви хочете отримати регіон за допомогою 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
Метод, що використовує лише 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]')
В якій - то момент , так як це більшість з цих відповідей були розміщені, AWS зробив розумну річ і реалізований новий шлях: latest/meta-data/placement/region
.
Це означає, що отримати регіон має бути так само просто
REGION="$(wget -q -O - http://169.254.169.254/latest/meta-data/placement/region)"
Ви можете отримати регіон екземпляра, використовуючи цей запит на згортання
$ curl http://169.254.169.254/latest/meta-data/placement/region
us-east-1