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

उम्मीद है की यह मदद करेगा।

संपादित करें:sed टिप्पणियों के आधार पर सुधार हुआ


4
यह EC2 उदाहरण के अंदर चलाया जाना है और AWS के बैकएंड द्वारा संचालित है। यह कहीं और काम नहीं करेगा (अनिवार्य रूप से क्योंकि आईपी एक एपीआईपीए है)। इसके अलावा मेटाडेटा स्रोत से कनेक्ट किए बिना इस जानकारी को सीधे अंदर से प्राप्त करने का कोई तरीका नहीं है। यह मानता है कि 169.254.169.254 एपीआई उपलब्ध है, और आपकी स्क्रिप्ट को तदनुसार नेटवर्क विफलताओं को संभालना चाहिए। ec2-metadataइस एपीआई के लिए सिर्फ एक आवरण है, लेकिन अनिवार्य रूप से एक ही काम करता है।
डानोसोर

1
क्या यह कुछ प्रलेखित है? क्या आप बता सकते हैं कि आपने इसे कैसे पाया?
मेवप्लप

2
सभी ईमानदारी में जब मैं उस 2-लाइनर के साथ आया था, तो मैं केवल एपीआई के बारे में कुछ भी देख रहा था, जिसे मैं सही क्षेत्र की पहचान करने के लिए उपयोग कर सकता था। AWS मेटाडेटा API यहां पूरी तरह से प्रलेखित है: docs.aws.amazon.com/AWSEC2/latest/UserGuide/…
dann डायनासौर

12
EC2_REGION के लिए उपलब्ध कराए गए कमांड की तुलना में बहुत सरल सेड:sed 's/[a-z]$//
थ्रीजीज

2
यदि यह एक बूटस्क्रिप्ट में है, तो मेटाडेटा सेवा अभी तक त्वरित नहीं हो सकती है - यदि हां, तो प्रतीक्षा करें और फिर से प्रयास करें। मैंने देखा है कि मेटाडेटा स्थान उपलब्ध होने के लिए बूट होने के बाद 10-15 सेकंड लगते हैं।
वैरी

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 पर) में काम करना चाहिए? मैं एक मशीन से उस URL की 404 - Not Foundकोशिश कर रहा हूँ । GETus-east-1a
एडम मॉन्सन

@AdamMonsen शायद यह एक क्षणिक त्रुटि थी। मैं हम-पूर्व -1 ए पर हूं और यह बहुत अच्छा है।
फ्लोरिन आंद्रेई

साभार @FlorinAndrei मेरे लिए भी अब काम करता है।
एडम मोन्सन

3
Jq के साथ:curl -s http://169.254.169.254/latest/dynamic/instance-identity/document | jq -r .region
यार्न

4
जाग के साथ: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/.$//'

डेबियन आधारित प्रणालियों के लिए, कमांड डैश के बिना है।

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

6
केवल क्षेत्र के नाम के साथ शुद्ध स्ट्रिंग प्राप्त करें:ec2-metadata --availability-zone | sed 's/placement: \(.*\).$/\1/'
nahsh

ec2-metadataऐसा प्रतीत नहीं होता कि कुछ डिफ़ॉल्ट रूप से उपलब्ध है - क्या आप इंस्टॉलेशन निर्देश शामिल कर सकते हैं?
टिम मेलोन

23

यदि आप नियमित अभिव्यक्ति से बचना चाहते हैं, तो यहां एक-लाइनर है जिसे आप पायथन के साथ कर सकते हैं:

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 संरचना से मूल्य को नियमित अभिव्यक्ति की तुलना में बहुत अधिक पढ़ा जाता है।
लेसिक ०२०१५ १५'१

1
मैं मानता हूं कि अगर आपने jq इंस्टॉल नहीं किया है तो यह सबसे अच्छा तरीका है। आप वास्तव में उम्मीद करेंगे कि AWS इसे 169.254.169.254/latest/meta-data/placement/region ...
Krenair

17

आप ec2-मेटाडेटा का उपयोग कर सकते हैं:

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

2
इसके साथ, यदि आप eu-central-1खराब हैं।
डानोसोर

2
centralजब मैंने शुरू में अपना उत्तर लिखा था, तब मौजूद नहीं था। यह अब जोड़ा गया है।
डैनियल कुप्पिट्ज

22
एक स्क्रिप्ट जो हर बार टूट जाती है, एडब्ल्यूएस एक नया क्षेत्र जोड़ता है, मेरे लिए विशेष रूप से मजबूत समाधान की तरह नहीं लगता है।
रयान बी। लिंच

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]*'सुरक्षित प्रतीत होता है (यह एक मूल regex है, इसे विस्तारित 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 जो संभवतः आपकी VPC की DNS सेटिंग्स से संबंधित है ... मेटाडेटा-एपीआई के लिए IP का उपयोग करना अधिक सुरक्षित लगता है (अन्य उत्तरों में से आधे का मतलब यही है)
Gert van den Berg

@ गर्तेवेनडेनबर्ग, मैं इसे दूसरा स्थान देता हूं
एसके वेंकट

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

6

JQ का उपयोग करें:

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


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 उदाहरण मेटा-डेटा का उपयोग करता है
  • केवल कर्ल, और मूल सेड का उपयोग करता है, इसलिए एसडीके या उपकरण पर कोई निर्भरता स्थापित होने की संभावना नहीं है।
  • उपलब्धता क्षेत्र के नाम को पार्स करने का प्रयास नहीं करता है, इसलिए यदि एडब्ल्यूएस / क्षेत्र का नाम प्रारूप बदलता है, तो कोई चिंता नहीं है

हां एकदम सही, धन्यवाद। इस परिणाम को आसानी से एक json ऑब्जेक्ट में deserialized किया जा सकता है।
डायनामलिनक

मुझे अंत में एक अल्पविराम मिल रहा है।
क्रेग

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

यह मानता है कि एडब्ल्यूएस क्षेत्र के लिए उपलब्ध उपलब्धता क्षेत्रों के लिए एक ही चरित्र का उपयोग करना जारी रखता है।


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

या उबंटू या इस उपकरण को एक आवश्यकता न बनाएं और बस करें:

: "${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")। अगर अमेज़न कभी इस पैटर्न को तोड़ता है, तो ऊपर दिए गए तर्क अब काम नहीं करेंगे।
मैट सोलनीट

3

यदि आप json के साथ काम करते हैं - सही उपकरण का उपयोग करें। इस मामले में बहुत शक्तिशाली है।

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

3

यह यूरोपीय-केंद्रीय -1 और साथ ही विभिन्न पत्र क्षेत्रों के लिए काम करता है। (मेरे पास ऊपर दिए गए जवाब का जवाब देने के लिए पर्याप्त प्रतिनिधि नहीं है)

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

यह ec2metadata --availability-zone | sed 's/.$//'(बिना डैश के) होना चाहिए
व्लादिमीर कोंडरायेव 22

3

यदि आप खिड़कियों पर चल रहे हैं, तो आप इस पॉवरशेल्ड वन-लाइनर का उपयोग कर सकते हैं:

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

1

यह भी उदाहरण से क्षेत्र खोजने के लिए एक समाधान के लिए देख रहा था और यहाँ मेरा शुद्ध बैश समाधान है:

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

जब तक कि ऐसे क्षेत्र नहीं हैं जहाँ AZ के दो से अधिक अक्षर हैं, जिनके बारे में मुझे जानकारी नहीं है।


0

आपके द्वारा लॉग इन किए गए EC2 के बारे में जानकारी प्राप्त करने के लिए, आप ec2-मेटाडाटा टूल का उपयोग कर सकते हैं।

आप इस लिंक पर जाकर टूल को इंस्टॉल कर सकते हैं टूल इंस्टॉल करने के बाद, आप चला सकते हैं

# ec2-metadata -z

इस क्षेत्र का पता लगाने के लिए।

यह उपकरण नवीनतम (10.10) उबंटू एएमआई के साथ स्थापित होता है,


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

यह एडब्ल्यूएस डॉक्स से मिली मैपिंग थी, मेटाडेटा एपीआई कॉल के जवाब में, बस अंतिम चरित्र को ट्रिम करना चाहिए।

  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 बॉक्स के बारे में जानकारी होस्ट करने वाले सभी aws प्रदान करने के लिए वर्तमान आदेश है। यह सबसे सुरुचिपूर्ण और सुरक्षित दृष्टिकोण है। ( ec2-metadataपुराना है, अब मान्य आदेश नहीं है।)


यह आपके द्वारा चयनित वर्चुअल बॉक्स प्रकार पर निर्भर कर सकता है। मैं लिनक्स के साथ रहना।
जीविज़

0

केवल egrep का उपयोग करने का एक तरीका, जो कि किसी भी अतिरिक्त टंकण को ​​स्थापित किए बिना, किसी भी लिनक्स उदाहरण पर काम करना चाहिए। मैंने सभी मौजूदा 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

सेड और कर्ल समाधान के लिए ऐसा लगता है कि प्रारूप थोड़ा बदल गया है। मेरे लिए काम करता है

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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.