EC2 bulut sunucusundan bölge bulun


131

Bir örneğin bölgesine örnek içinden bakmanın bir yolu var mı?

Örnek kimliğini bulma yöntemine benzer bir şey arıyorum .



8
Tüm kabuk komut dosyalarını umursamayanlar için kısa cevap: kullanılabilirlik bölgesini alın http://169.254.169.254/latest/meta-data/placement/availability-zoneve son karakteri kaldırın.
Sarsaparilla


2020 http://169.254.169.254/latest/meta-data/placement/region
ortasını okuyanlar için

Yanıtlar:


148

Bu URL ( http://169.254.169.254/latest/dynamic/instance-identity/document ) artık çalışıyor görünmüyor. Kullanmaya çalıştığımda 404 alıyorum. Yine de çalışıyor gibi görünen aşağıdaki koda sahibim:

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

Bu yardımcı olur umarım.

DÜZENLEME:sed Yorumlara göre geliştirildi


4
Bu, EC2 bulut sunucusu içinde çalıştırılır ve AWS'nin arka uçları tarafından desteklenir. Başka hiçbir yerde çalışmayacaktır (esasen IP bir APIPA olduğu için). Ayrıca bir meta veri kaynağına bağlanmadan bu bilgileri doğrudan örnek içinden almanın bir yolu yoktur. Bu, 169.254.169.254 API'sinin kullanılabilir olduğunu ve komut dosyanızın ağ hatalarını buna göre işlemesi gerektiğini varsayar. ec2-metadatasadece bu API için bir sarmalayıcıdır, ancak esasen aynı şeyi yapar.
dannosaur

1
Bu belgelenmiş bir şey mi? Nasıl bulduğunuzu açıklayabilir misiniz?
meawoppl

2
Dürüst olmak gerekirse, bu 2-astarı bulduğumda, doğru bölgeyi belirlemek için kullanabileceğim herhangi bir şeyi aramak için API hakkında dalga geçiyordum. AWS meta veri API'si burada tam olarak belgelenmiştir: docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
dannosaur

12
EC2_REGION için sağlanandan çok daha basit sed değiştirme komutu:sed 's/[a-z]$//
threejeez

2
Bu bir önyükleme dosyasındaysa, meta veri hizmeti henüz somutlaştırılmamış olabilir - öyleyse bekleyin ve yeniden deneyin. Meta veri konumunun kullanılabilir hale gelmesinin önyüklemeden sonra 10-15 saniye sürdüğünü gördüm.
vacri

81

Bunu başarmanın bir yolu daha var:

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

echo $REGION

us-east-1

Bu herhangi bir bölgede / az'de (ve herhangi bir AMI'de) çalışmalı mı? Ben alıyorum 404 - Not Foundçalışırken GETbir makineden o URL us-east-1a.
Adam Monsen

@AdamMonsen belki de geçici bir hataydı. Us-doğu-1a üzerindeyim ve harika çalışıyor.
Florin Andrei

Teşekkürler @FlorinAndrei. Şimdi benim için de çalışıyor.
Adam Monsen

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

4
Awk ile:curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | awk -F\" '/region/ {print $4}'
Yaron

38

Kullanmakta sorun jqyoksa, aşağıdakileri çalıştırabilirsiniz:

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

Sanırım en temiz yol bu.


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

Debian tabanlı sistemler için komut tire olmadan yapılır.

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

6
Sadece bölge adıyla saf dizeyi alın:ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'
nahsh

ec2-metadatavarsayılan olarak kullanılabilen bir şey gibi görünmüyor - kurulum talimatlarını ekleyebilir misiniz?
Tim Malone

23

Normal ifadeden kaçınmak istiyorsanız, işte Python ile yapabileceğiniz tek satırlık bir program:

curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | python -c "import json,sys; print json.loads(sys.stdin.read())['region']"

Bu cevap daha yüksek olmalı!
Kostas Demiris

@KostasDemiris Katılıyorum, daha çok JSON yapısındaki değeri normal bir ifadeden çok okudum.
lasec0203

1
Eğer jq'niz kurulu değilse, bunu yapmanın en iyi yolu budur.
AWS'nin bunu

17

Ec2 meta verilerini kullanabilirsiniz:

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

2
Bununla, eğer eu-central-1içindeysen mahvolursun.
dannosaur

2
centralcevabımı ilk yazdığımda yoktu. Şimdi eklendi.
Daniel Kuppitz

22
AWS her yeni bölge eklediğinde bozulan bir komut dosyası bana özellikle güçlü bir çözüm gibi görünmüyor.
Ryan B. Lynch

1
Grep yerine awk '{split($2,arr,"-"); print arr[1]"-"arr[2]}'AZ isminin sadece ilk iki bileşenini tutacaktır.
dskrvk

@dskrvk İlk iki bileşeni tutarsanız eu-west-1, eu-west-2ve eu-west-3(Ayrıca us-west-1ve us-west-2) @OP: yalnızca eşleştirme '[a-z][a-z]-[a-z]*-[0-9][0-9]*'daha güvenli görünür (bu basit bir normal ifade, uzatılmış bir RE ile kısaltılabilir). (Geçerli normal ifade cabölge, afbölgeler ve mebölgede
bölünecek

15

Şimdiye kadar bulduğum en kolayı

 curl -s 169.254.169.254/latest/meta-data/placement/availability-zone | sed 's/.$//'

1
Bu, varsayılan olmayan bağımlılıkların avantajına sahiptir ve yalnızca tek bir satırdır.
Mark Stosberg

14

çok basit tek astar

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

4
Bu iki satır
Christian

1
Ama bu us-batı-1 bölgesinde çalışmıyor. curl: (6) Could not resolve host: instance-data; Name or service not knownHata döndürür .
SK Venkat

1
@SKVenkat Bu muhtemelen VPC'nizin DNS ayarlarıyla ilgilidir ... Meta veri-api için IP kullanmak daha güvenli görünüyor (diğer yanıtların yarısı bunu yapıyor)
Gert van den Berg

@GertvandenBerg, ben ikinci ..
SK Venkat

9

Eğer jq yüklediyseniz, şu şekilde de devam edebilirsiniz (muhtemelen en "zarif" yöntem):

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

Bu, herhangi bir güzel baskı veya başka bir biçimlendirme olmadan "bölge" nin ham değerini döndürür. Referans: AWS Forumu


7

Bölgeyi kullanılabilirlik alanından alın, son harfini çıkarın.

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

6

JQ kullan:

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


4

Bulduğum en temiz çözüm bu:

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

Örneğin,

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

  • API çağrısı yapmaz, EC2 örnek meta verilerini kullanır
  • Yalnızca curl ve basic sed kullanır, bu nedenle SDK'lara veya kurulma olasılığı olmayan araçlara bağımlılık yoktur.
  • Erişilebilirlik Alanı adını ayrıştırmaya çalışmaz, bu nedenle AWS'nin AZ / Bölge ad biçimini değiştirmesi durumunda endişelenmeyin

Evet mükemmel, teşekkürler. Bu sonuç, bir json nesnesine kolayca serileştirilebilir.
dynamiclynk

Sonunda virgül alıyorum.
Craig

4

Https://unix.stackexchange.com/a/144330/135640 sayesinde , bash 4.2+ ile son karakteri kullanılabilirlik alanından çıkarabiliriz:

$ region=`curl -s 169.254.169.254/latest/meta-data/placement/availability-zone`
$ region=${region::-1}
$ echo $region
us-east-1

Bu, AWS'nin bölgeye eklenen kullanılabilirlik bölgeleri için tek bir karakter kullanmaya devam ettiğini varsayar.


5
region=${region%?}
David Jones

4

Ec2.internal'ı arama etki alanınız olarak kullandığınız sürece çalışan 2 satır:

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

4

Bunu iyi eski powershell ile yapmak isteyen herkes için

$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

Veya Ubuntu'yu veya bu aracı bir zorunluluk haline getirmeyin ve şunları yapın:

: "${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
Bunun işe yaradığını unutmayın, çünkü şu anda kullanılabilirlik bölgesi her zaman küçük harf eklenmiş bölge adıdır (örneğin bölge "us-west-1", bölge "us-west-1a"). Amazon bu kalıbı hiç bozarsa, yukarıdaki mantık artık çalışmayacaktır.
Matt Solnit

3

JSON ile çalışıyorsanız - doğru araçları kullanın. jq bu durumda çok güçlü.

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

3

Bu eu-central-1'in yanı sıra çeşitli harf bölgeleri için de işe yarar. (Yukarıdaki sed cevabına cevap vermek için yeterli sayım yok)

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

O olmalı ec2metadata --availability-zone | sed 's/.$//'(dash olmadan)
Vladimir Kondratyev

3

Windows üzerinde çalışıyorsanız, bu powershell tek satırlık kullanabilirsiniz:

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

1

Ayrıca örnekten bölge bulmak için bir çözüm arıyordu ve işte benim saf Bash çözümüm:

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

AZ'nin ikiden fazla harfe sahip olduğu bölgeler yoksa, ki benim farkında değilim.


1

Bu yanıtlardan bu en yayınlanmıştır beri Bir noktada, AWS makul olanı yaptı ve yeni bir yol uygulamaya: latest/meta-data/placement/region.

Bu, bölgeyi almak kadar basit olması gerektiği anlamına gelir

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

0

Oturum açtığınız EC2 hakkında bilgi edinmek için ec2-meta veri aracını kullanabilirsiniz.

Bu bağlantıyı takip ederek aracı kurabilirsiniz . Aracı kurduktan sonra çalıştırabilirsiniz

# ec2-metadata -z

bölgeyi bulmak için.

Bu araçlar, en son (10.10) Ubuntu AMI'leri ile yüklü olarak gelir,


4
Bu yanlış. ec2-metadata -zbölgeyi değil, yalnızca kullanılabilirlik bölgesini gösterir.
Matt Solnit

0

JS kullanarak bölge almak istiyorsanız, bu çalışmalıdır:

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();
            }
     });

Bu, meta veri API çağrısına yanıt olarak AWS DOCS'ta bulunan eşlemeydi, çalışması gereken son karakteri kırpmanız yeterli.

  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(tire yok) ec2 kutunuz hakkında size tüm aws barındırma bilgilerini sağlayan mevcut komuttur. bu en zarif ve güvenli yaklaşımdır. ( ec2-metadataeski, artık geçerli olmayan komuttur.)


Bu, seçtiğiniz sanal kutu türüne bağlı olabilir. Linux'a bağlıyım.
GViz

0

Yalnızca egrep kullanan ve herhangi bir ekstra alet yüklemeye gerek kalmadan döndürülen çoğu linux örneğinde çalışması gereken bir yöntem. Bunu mevcut tüm AWS bölgelerinin bir listesine göre test ettim ve hepsi eşleşiyor.

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

REGEX'in açıklaması:

  • "(\ w) +" Bu, herhangi bir sayıda harfle eşleşir
  • "-" yalnızca tek bir tireyle eşleşir
  • "[0-9]" herhangi bir 1 sayıyla eşleşir

Bunu bir değişkene dönüştürmek istiyorsanız şunları yapın:

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


0

Sed ve curl çözümü için format biraz değişmiş gibi görünüyor. Benim için çalışıyor

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.