कैसे पता चलेगा कि मशीन EC2 उदाहरण है


43

मैं मेजबानों पर कुछ स्क्रिप्ट्स चलाना चाहता हूं जो EC2 उदाहरण हैं, लेकिन मुझे नहीं पता कि यह कैसे सुनिश्चित किया जाए कि मेजबान वास्तव में EC2 उदाहरण है।

मैंने कुछ परीक्षण किए हैं, लेकिन यह पर्याप्त नहीं है:

  • परीक्षण करें कि बाइनरी ec2_userdata उपलब्ध है (लेकिन यह हमेशा सच नहीं होगा)
  • " Http://169.254.169.254/latest/meta-data " की टेस्ट उपलब्धता (लेकिन यह हमेशा सच होगा? और यह "जादुई आईपी" क्या है?)


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

2
EC2s की IP रेंज सार्वजनिक हैं (हालांकि समय-समय पर बदलती रहती हैं)। यदि आप एक वर्तमान सूची के साथ रहते हैं, तो आप उस श्रेणी के खिलाफ इंस्टेंस आईपी की जांच कर सकते हैं।
कर्मा फुसेबोक्स

2
यदि आप EC2 और केवल EC2 चाहते हैं तो 169.254.169.254 पर भरोसा न करें - नीलगिरी जैसे EC2-alike सिस्टम भी इसका समर्थन करते हैं। संलग्न करें। यूकेलिप्टस
कस्टमर /

1
क्या आपको एक हमलावर के खिलाफ काम करने के लिए विधि की आवश्यकता है, जो मेजबान पर जड़ है, और आपको यह सोचकर बिगाड़ने की कोशिश कर रहा है कि यह उसके अपने दुर्भावनापूर्ण उद्देश्यों के लिए EC2 उदाहरण है? यदि आप करते हैं, तो यह बहुत कठिन होगा।
माइक स्कॉट

जवाबों:


3

वास्तव में, यह पता लगाने का एक बहुत ही सरल तरीका है कि मेजबान EC2 उदाहरण है: अपने सार्वजनिक आईपी के रिवर्स लुकअप की जांच करें। EC2 के पलटने में काफी मुश्किल होती है।

इसके अलावा, यदि आपने इसे संशोधित नहीं किया है, तो होस्टनाम आपका रिवर्स होना चाहिए, जिससे इसे स्पॉट करना आसान हो जाएगा।

आप जिस "जादुई आईपी" के बारे में बात करते हैं, उसका भी उपयोग कर सकते हैं, क्योंकि यह वास्तव में ईसी 2 इंस्टेंस टैग प्राप्त करने का मानक तरीका है, हालांकि, यदि आप ईसी 2 नेटवर्क पर नहीं हैं, तो आपको टाइमआउट की प्रतीक्षा करनी होगी, जो आमतौर पर नहीं होती है वांछित...

यदि ये विधियां पर्याप्त नहीं हैं, तो बस अपने आईपी का एक-एक कर लें और जांचें कि क्या आप भीतर हैं और अमेज़ॅन ईसी 2 आईपी ब्लॉक।

संपादित करें: आप इस छोटे शेल बिट का उपयोग कर सकते हैं:

#!/bin/bash
LOCAL_HOSTNAME=$(hostname -d)
if [[ ${LOCAL_HOSTNAME} =~ .*\.amazonaws\.com ]]
then
        echo "This is an EC2 instance"
else
        echo "This is not an EC2 instance, or a reverse-customized one"
fi

हालांकि सावधान, [[एक बेशवाद है। आप पायथन या पर्ल यूनीलाइन, वाईएमएमवी का भी उपयोग कर सकते हैं।


13
यह VPC या ऐसे वातावरण में काम नहीं करता है जहाँ आपने hostname बदला है; जैसे। यदि आपकी मशीनें domain.local में हैं
Preflightsiren

2
होस्टनाम बिट केवल विफल होने के लिए बाध्य है।
दान प्रीत

3
hostname -dरिटर्नeu-west-1.compute.internal
बुलेटमैग्नेट

42

त्रुटि संदेशों से बचने और स्क्रिप्ट में उदाहरण के उपयोग को शामिल करने के लिए हेंस का जवाब बदल दिया गया:

if [ -f /sys/hypervisor/uuid ] && [ `head -c 3 /sys/hypervisor/uuid` == ec2 ]; then
    echo yes
else
    echo no
fi

यह विंडोज उदाहरणों में काम नहीं करता है। कर्ल पर लाभ यह है कि यह ईसी 2 और गैर-ईसी 2 दोनों पर तात्कालिक है।


4
एडब्ल्यूएस भी यह इस तरह से करने की सलाह देते लगते docs.aws.amazon.com/AWSEC2/latest/UserGuide/...
माइक

3
मुझे यह तरीका पसंद है। बस इस बात से अवगत रहें कि एक हाइपरविजर के तहत चलने वाला एक गैर-ईसी 2 सिस्टम एक यूयूआईडी उत्पन्न कर सकता है जो ec2एक झूठी सकारात्मक के साथ शुरू होता है । यह संभावना नहीं है (1-इन-256 मौका) और केवल अगर आप एक हाइपरविजर का उपयोग कर रहे हैं जो उस फ़ाइल को पॉप्युलेट करता है। इसीलिए ऊपर लिंक किया गया दस्तावेज़ कहता है "आप शायद EC2 उदाहरण देख रहे हैं "।
नैट

1
@ अच्छा, अच्छी बात है, लेकिन क्या 4096 में ऐसा नहीं होना चाहिए? (16 x 16 x 16)
वाइल्डकार्ड

2
@Wildcard: मैं अपनी टिप्पणी संपादित नहीं कर सकता, लेकिन यह सही है।
नैट

7
खतरा! इस पद्धति ने वर्षों तक हमारे लिए मज़बूती से काम किया ... अभी हाल ही में नवीनतम सी 5 और एम 5 प्रकारों के साथ, जिनमें यह फ़ाइल मौजूद नहीं है । इसलिए मुझे उन उदाहरणों को संभालने के लिए 169.254.169.254 का फालबैक चेक जोड़ना होगा ।
जोश कुपर्शमीद

20

सबसे पहले, मैंने मौजूदा उत्तरों के साथ निम्नलिखित सूक्ष्म समस्याओं के कारण एक नया उत्तर पोस्ट करने की आवश्यकता महसूस की, और @ क्वर्टज़्गी के उत्तर पर मेरी टिप्पणी के बारे में एक प्रश्न प्राप्त करने के बाद । यहां वर्तमान उत्तरों के साथ समस्याएं हैं:

  1. स्वीकार किए जाते हैं जवाब @MatthieuCerda से निश्चित रूप से मज़बूती से काम नहीं करता है, कम से कम किसी भी VPC उदाहरणों मैं विरुद्ध जांच पर नहीं। (मेरे उदाहरणों पर, मुझे इसके लिए एक VPC नाम मिलता है hostname -d, जिसका उपयोग आंतरिक DNS के लिए किया जाता है, इसमें "amazonaws.com" के साथ कुछ भी नहीं है।)
  2. उच्चतम मतदान जवाब @qwertzguy से नई M5 या सी 5 उदाहरणों पर नहीं काम करता है , जो इस फ़ाइल नहीं है। Neglects इस व्यवहार परिवर्तन AFAIK दस्तावेज़ के लिए, हालांकि अमेज़न डॉक पेज को इस विषय पर कहना है "... तो / sys / हाइपरविजर / UUID मौजूद है ..."। मैंने AWS से पूछा कि क्या यह बदलाव जानबूझकर किया गया था, नीचे देखें whether
  3. @Jer का उत्तर आवश्यक रूप से हर जगह काम नहीं करता है क्योंकि instance-data.ec2.internalDNS लुकअप काम नहीं कर सकता है। एक Ubuntu EC2 VPC उदाहरण पर मैंने अभी-अभी परीक्षण किया है, मैं देखता हूं: $ curl http://instance-data.ec2.internal curl: (6) Could not resolve host: instance-data.ec2.internal जो इस पद्धति पर भरोसा करते हुए कोड को गलत तरीके से समाप्त करने का कारण बनेगा वह EC2 पर नहीं है!
  4. जवाब का उपयोग करने केdmidecode @tamale से काम कर सकते हैं, लेकिन आप एक पर निर्भर करता है।) होने dmidecodeपर अपने उदाहरण है, और ख उपलब्ध।) रूट या होने sudoके लिए अपने कोड के भीतर से पासवर्ड से कम क्षमता।
  5. इस सवाल का जवाब / sys / उपकरणों की जांच करने / आभासी / डीएमआई / आईडी / bios_version @spkane से खतरनाक तरीके से भ्रामक है! मैं एक Ubuntu 14.04 M5 उदाहरण जाँच की, और एक मिल गया bios_versionकी 1.0। यह फ़ाइल अमेज़ॅन के डॉक पर बिल्कुल भी प्रलेखित नहीं है , इसलिए मैं वास्तव में इस पर भरोसा नहीं करूंगा।
  6. @ क्रिस-मोंट्रो से जवाब का पहला हिस्सा एक अविश्वसनीय 3-पार्टी यूआरएल की जांच करने और whoisपरिणाम पर उपयोग करने के लिए कई स्तरों पर समस्याग्रस्त है। ध्यान दें कि उस उत्तर में सुझाया गया URL अभी 404 पेज का है! यहां तक ​​कि अगर आपको एक 3-पार्टी सेवा मिली जो काम करती है, तो यह तुलनात्मक रूप से बहुत धीमी होगी (स्थानीय रूप से किसी फ़ाइल की जांच करने की तुलना में) और संभवतः दर-सीमित मुद्दों या नेटवर्क के मुद्दों में चलती है, या संभवतः आपके EC2 उदाहरण में भी नहीं है बाहर नेटवर्क का उपयोग।
  7. में दूसरा सुझाव @ क्रिस-Montanaro से जवाब की जांच करने के http://169.254.169.254/ थोड़ा बेहतर है, लेकिन एक और टिप्पणीकार नोटों कि अन्य क्लाउड प्रदाताओं इस उदाहरण मेटाडेटा URL उपलब्ध बनाने है, तो आप गलत से बचने के लिए सावधान रहना होगा सकारात्मक। इसके अलावा यह अभी भी एक स्थानीय फ़ाइल की तुलना में बहुत धीमा होगा, मैंने देखा है कि यह चेक विशेष रूप से धीमी गति से (कई सेकंड लौटने के लिए) भारी लोड वाले उदाहरणों पर है। इसके अलावा, आपको इसे लंबे समय तक लटकाए रखने से बचने के लिए कर्ल -mया --max-timeतर्क पारित करने के लिए याद रखना चाहिए , विशेष रूप से गैर-ईसी 2 उदाहरण पर जहां यह पता चल सकता है और लटका हुआ है (जैसा कि @ एगल के जवाब में )।

इसके अलावा, मैं नहीं देखता कि किसी ने भी (संभव) फाइल के लिए अमेजन के डॉक्यूमेंटेड फालबैक ऑफ चेकिंग का उल्लेख किया है /sys/devices/virtual/dmi/id/product_uuid

कौन जानता था कि यह निर्धारित करना कि क्या आप EC2 पर चल रहे हैं, इतना जटिल हो सकता है ?! ठीक है, अब हमारे पास (अधिकांश) सूचीबद्ध दृष्टिकोणों के साथ समस्याएं हैं, यहां यह जांचने के लिए सुझाव दिया गया है कि क्या आप EC2 पर चल रहे हैं। मुझे लगता है कि यह आमतौर पर लगभग किसी भी लिनक्स उदाहरण पर काम करना चाहिए, विंडोज उदाहरण पाठक के लिए एक अभ्यास है।

#!/bin/bash

# This first, simple check will work for many older instance types.
if [ -f /sys/hypervisor/uuid ]; then
  # File should be readable by non-root users.
  if [ `head -c 3 /sys/hypervisor/uuid` == "ec2" ]; then
    echo yes
  else
    echo no
  fi

# This check will work on newer m5/c5 instances, but only if you have root!
elif [ -r /sys/devices/virtual/dmi/id/product_uuid ]; then
  # If the file exists AND is readable by us, we can rely on it.
  if [ `head -c 3 /sys/devices/virtual/dmi/id/product_uuid` == "EC2" ]; then
    echo yes
  else
    echo no
  fi

else
  # Fallback check of http://169.254.169.254/. If we wanted to be REALLY
  # authoritative, we could follow Amazon's suggestions for cryptographically
  # verifying their signature, see here:
  #    https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-identity-documents.html
  # but this is almost certainly overkill for this purpose (and the above
  # checks of "EC2" prefixes have a higher false positive potential, anyway).
  if $(curl -s -m 5 http://169.254.169.254/latest/dynamic/instance-identity/document | grep -q availabilityZone) ; then
    echo yes
  else
    echo no
  fi

fi

जाहिर है, आप इसे और भी अधिक कमियों की जांच के साथ विस्तारित कर सकते हैं, और संचलन के बारे में व्यामोह को शामिल कर सकते हैं जैसे /sys/hypervisor/uuidसंयोग से "ec2" से शुरू होने से एक झूठी सकारात्मक और इतने पर। लेकिन यह दृष्टांत उद्देश्यों के लिए एक अच्छा पर्याप्त समाधान है और शायद लगभग सभी गैर-रोग-संबंधी उपयोग के मामले हैं।

[About] CWS / m5 उदाहरणों के परिवर्तन के बारे में AWS समर्थन से इस स्पष्टीकरण को वापस लें:

C5 और M5 इंस्टेंसेस एक नए हाइपरवाइज़र स्टैक का उपयोग करते हैं और संबंधित कर्नेल ड्राइवर sysfs (जो कि / sys पर आरोहित है) में फाइल नहीं बनाते हैं जैसा कि अन्य / पुराने इंस्टेंस प्रकारों द्वारा उपयोग किए जाने वाले Xen ड्राइवर करते हैं । यह पता लगाने का सबसे अच्छा तरीका है कि ऑपरेटिंग सिस्टम ईसी 2 उदाहरण पर चल रहा है या नहीं, आपके द्वारा जुड़े दस्तावेज़ में सूचीबद्ध विभिन्न संभावनाओं के लिए जिम्मेदार है


4
हाँ साथी यात्री 2018 में ... यह वह उत्तर है जिसकी आपको तलाश है।
रुसलपिएरेस

पढ़ने / sys / उपकरणों / आभासी / डीएमआई / आईडी / product_uuid को भी विशेष अधिकार की आवश्यकता है
Thayne

@ थाइने सही - यह है कि उस elifब्लॉक के ऊपर की टिप्पणी कहती है, और इसीलिए elifपरीक्षण -rपरीक्षण ऑपरेटर का उपयोग करता है , जो यह जांचता है कि क्या फ़ाइल मौजूद है और आपने फ़ाइल के लिए अनुमतियाँ पढ़ ली हैं।
जोश कुपरशमीद

169.254.169.254 मेटाडेटा पर एक अतिरिक्त नोट - यह हमेशा बूट समय पर तैयार नहीं होता है। यदि आपको एक बूटस्क्रिप्ट के लिए मेटाडेटा की आवश्यकता है, तो आपको मतदान तैयार रखने की आवश्यकता है। मैंने देखा है कि उदाहरण के बाद अपने क्लाउड-इनिट बूटस्क्रिप्स को चलाना शुरू करने में इसे 30 सेकंड तक का समय लगता है।
वरी

15

IP के बजाय EC2 आंतरिक डोमेन नाम से मेटाडेटा के लिए देखें, जो कि EC2 पर नहीं होने पर तीव्र DNS विफलता लौटाएगा, और IP विरोध या रूटिंग समस्याओं से बचता है:

curl -s http://instance-data.ec2.internal && echo "EC2 instance!" || echo "Non EC2 instance!"

कुछ डिस्ट्रोस पर, बहुत ही बुनियादी सिस्टम, या किश्त के चरणों में बहुत जल्दी कर्ल उपलब्ध नहीं है। इसके बजाय wget का उपयोग करना :

wget -q http://instance-data.ec2.internal && echo "EC2 instance!" || echo "Non EC2 instance!"

4
दुर्भाग्य से, VPC में विफल प्रतीत होता है!
ऐश

2
इसके अलावा दोहरे उद्धरण चिह्नों के अंदर विस्मयादिबोधक चिह्न चरित्र का उपयोग न करें - आपकी गूंज के साथ उड़ सकता है-bash: !": event not foundechoइसके बजाय उन लोगों के लिए एकल उद्धरण का उपयोग करें ।
जोश कुपरशमिड

1
यह संभवतः मानता है कि सर्वर अभी भी EC2s DNS सर्वरों का उपयोग कर रहा है जो कि ec2.internal क्षेत्र के बारे में जानते हैं और यह कि किसी ने /etc/resolv.conf को 8.8.8.8 में नहीं बदला है या अपने स्वयं के DNS infastructure को रोल किया है।
लैमोंट

1
ऐसा लगता है कि एडब्ल्यूएस टूट गया है। मैं अब inst-data.ec2.internal को हल नहीं कर सकता। inst-data.us-west-2.compute.internal काम करता है, हालांकि, कम से कम अभी के लिए।
ब्रायन लार्सन

14

यदि लक्ष्य यह बताना है कि क्या यह EC2 उदाहरण है या अन्य प्रकार का क्लाउड उदाहरण है, जैसे कि Google, तो dmidecodeबहुत अच्छी तरह से काम करता है और किसी नेटवर्किंग की आवश्यकता नहीं है। मैं इस बनाम कुछ अन्य दृष्टिकोणों को पसंद करता हूं क्योंकि मेटाडेटा यूआरएल पथ ईसी 2 और जीसीई के लिए अलग है।

# From a google compute VM
$ sudo dmidecode -s bios-version
Google

# From an amazon ec2 VM
$ sudo dmidecode -s bios-version
4.2.amazon

मैं अन्य वीएम वातावरण और यहां तक ​​कि वास्तविक हार्डवेयर पर भी ठीक काम करने की उम्मीद करता हूं - मैं किसी भी हार्डवेयर विक्रेताओं से उन शिप सिस्टम की उम्मीद नहीं करता जहां बायोस संस्करण "अमेजन" कहता है ...
Guss

मेरे Ubuntu EC2 पर यह रिटर्न मिलता है 1.0- इसका कोई उल्लेख नहीं है amazon
नैट

5

होस्टनाम बदलने की संभावना है, अपने सार्वजनिक आईपी के खिलाफ एक whois चलाएं:

if [[ ! -z $(whois $(curl -s shtuff.it/myip/short) | grep -i amazon) ]]; then 
  echo "I'm Amazon"
else 
  echo "I'm not Amazon"
fi

या AWS मेटा-डेटा url को हिट करें

if [[ ! -z $(curl -s http://169.254.169.254/1.0/) ]]; then 
  echo "I'm Amazon"
else 
  echo "I'm not Amazon"
fi

2
यदि आप EC2 पर नहीं चल रहे हैं, तो असफल होने के लिए दूसरे कर्ल स्टेटमेंट में --connect-timeout 1 जोड़ें।
जोनाथन ओलिवर

1
मेटाडाटा URL का उपयोग करके FWIW यह संकेत दे सकता है कि यह एक क्लाउड उदाहरण के रूप में चल रहा है, लेकिन यह विशेष रूप से EC2 है, तो यह निर्धारित नहीं कर सकता है। ओपनस्टैक और नीलगिरी भी इसी मेटाडेटा यूआरआई का उपयोग करते हैं। मुझे पता है कि यह एनआईटी उठा रहा है, लेकिन मेरे काम के लिए, जो क्लाउड प्रदाता मायने रखता है।
EmmEff

5

यह एक्से 2 में लिनक्स होस्ट के लिए भी अच्छा काम करता है और इसके लिए नेटवर्क और किसी भी संबंधित समय की आवश्यकता नहीं होती है:

grep -q amazon /sys/devices/virtual/dmi/id/bios_version

यह काम करता है, क्योंकि अमेज़न इस प्रविष्टि को परिभाषित करता है:

$ cat /sys/devices/virtual/dmi/id/bios_version 4.2.amazon


2018/05/01; उबन्टु चल रहे M5 उदाहरणों पर अमान्य प्रतीत होता है।
'17:46 पर russellpierce

मेरे Ubuntu EC2 पर यह रिटर्न मिलता है 1.0। का कोई उल्लेख नहीं amazon
नैट

3
test -f /sys/hypervisor/uuid -a `head -c 3 /sys/hypervisor/uuid` == ec2 && echo yes

लेकिन मुझे नहीं पता कि वितरण में यह कितना पोर्टेबल है।


2
खैर, यह निश्चित रूप से विंडोज ईसी 2 उदाहरणों पर काम करने वाला नहीं है।
सिजॉयज

1
मैं इस पद्धति को पसंद करता हूं क्योंकि इसमें नेटवर्क इंटरैक्शन शामिल नहीं है जो सभी प्रकार के कारणों के लिए लटका सकता है। HTTP एक्सचेंज के लिए टाइमआउट का उपयोग करना हैंग को रोकने के लिए गारंटी नहीं है। मुझे विंडोज इंस्टेंस की परवाह नहीं है।
हेंस

यह वही है जो मुझे चाहिए था! किसी चीज़ को कर्ल करने से बेहतर है, धन्यवाद!
qwertzguy

1
पूर्ण यूयूआईडी का उपयोग करने पर विचार करें, बस कुछ अन्य विक्रेताओं के हाइपरविजर यूयूआईडी भी "ec2" से शुरू होते हैं। ऐसा होने की संभावना 4096 में 1 है जो नगण्य नहीं है।
हनीस

1
वास्तव में, पूरे यूयूआईडी की तुलना करने से काम नहीं चलता है क्योंकि मैंने कई अलग-अलग हाइपरवाइजर यूयूआईडी को जंगल में देखा है। वे सभी "ec2" से शुरू करते हैं, हालांकि, यह उत्तर जैसा है वैसा ही काम करता है।
हेंस

3

शीघ्र जवाब:

if [[ -f /sys/devices/virtual/dmi/id/product_uuid ]] && \
    grep -q "^EC2" /sys/devices/virtual/dmi/id/product_uuid
then
    echo "IS EC2"
else
    echo "NOT EC2"
fi

मैं एक साल के लिए यहां पोस्ट किए गए उत्तरों में से एक का उपयोग कर रहा था - लेकिन यह नए 'c5' उदाहरण प्रकारों पर काम नहीं कर रहा है (मैं 'c4' से अब अपग्रेड करने पर काम कर रहा हूं)।

मुझे यह समाधान पसंद है क्योंकि यह भविष्य में कम से कम टूटने की संभावना है।

पुराने उदाहरण प्रकारों, और नए लोगों पर, यह फ़ाइल मौजूद है और 'EC2' से शुरू होती है। मैंने VirtualBox पर चलने वाले Ubuntu पर जाँच की (कि मुझे भी समर्थन करने की आवश्यकता है) और इसमें स्ट्रिंग 'VirtualBox' शामिल है।

जैसा कि पिछले पोस्टर में उल्लेख किया गया था (लेकिन यह याद रखना आसान था) - ऐसा करने के तरीकों पर अमेज़ॅन प्रलेखन है - जिसमें मेरा उत्तर शामिल है।

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html


2

शायद आप "फैक्टर" का उपयोग कर सकते हैं:

"फैक्टर साधारण ऑपरेटिंग सिस्टम तथ्यों को पुनः प्राप्त करने के लिए एक क्रॉस-प्लेटफॉर्म लाइब्रेरी है, जैसे ऑपरेटिंग सिस्टम, लिनक्स वितरण या मैक एड्रेस।"

http://www.puppetlabs.com/puppet/related-projects/facter/

उदाहरण के लिए, अगर हम ec2 fact (facter-1.6.12 / lib / facter / ec2.rb) पर एक नज़र डालते हैं:

require 'facter/util/ec2'
require 'open-uri'

def metadata(id = "")
  open("http://169.254.169.254/2008-02-01/meta-data/#{id||=''}").read.
    split("\n").each do |o|
    key = "#{id}#{o.gsub(/\=.*$/, '/')}"
    if key[-1..-1] != '/'
      value = open("http://169.254.169.254/2008-02-01/meta-data/#{key}").read.
        split("\n")
      symbol = "ec2_#{key.gsub(/\-|\//, '_')}".to_sym
      Facter.add(symbol) { setcode { value.join(',') } }
    else
      metadata(key)
    end
  end
end

def userdata()
  begin
    value = open("http://169.254.169.254/2008-02-01/user-data/").read.split
    Facter.add(:ec2_userdata) { setcode { value } }
  rescue OpenURI::HTTPError
  end
end

if (Facter::Util::EC2.has_euca_mac? || Facter::Util::EC2.has_openstack_mac? ||
    Facter::Util::EC2.has_ec2_arp?) && Facter::Util::EC2.can_connect?

  metadata
  userdata
else
  Facter.debug "Not an EC2 host"
end

1

यदि आपने कर्ल स्थापित किया है, तो यह कमांड 0 वापस आएगा यदि आप EC2 में चल रहे हैं और यदि आप नहीं हैं तो गैर-शून्य:

curl --max-time 3 http://169.254.169.254/latest/meta-data/ami-id 2>/dev/null 1>/dev/null`

यह एएमआई-आईडी की घोषणा करते हुए EC2 मेटाडेटा को खींचने की कोशिश करता है। यदि यह 3 सेकंड के बाद सफल नहीं होता है, तो यह मानता है कि यह EC2 में नहीं चल रहा है।


0

इस पार्टी में थोड़ी देर हुई, हालाँकि मैं इस पद पर आ गया और फिर इस AWS प्रलेखन को पाया:

EC2 उदाहरण की पहचान करने की एक निश्चित और क्रिप्टोग्राफिक रूप से सत्यापित विधि के लिए, उसके हस्ताक्षर सहित उदाहरण पहचान दस्तावेज की जांच करें। ये दस्तावेज़ स्थानीय, गैर-रूटेबल पते http://169.254.169.254/latest/dynamic/instance-identity/ पर प्रत्येक EC2 उदाहरण पर उपलब्ध हैं

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html

बेशक, इसके लिए नेटवर्क ओवरहेड की आवश्यकता होती है, हालांकि आप कर्ल टाइमआउट को इस तरह सेट कर सकते हैं:

curl -s --connect-timeout 5 http://169.254.169.254/latest/dynamic/instance-identity/

वह समय 5 सेट करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.