Bir makinenin EC2 örneği olup olmadığını nasıl anlarım?


43

Bazı komut dosyalarını EC2 örneği olan ana bilgisayarlarda çalıştırmak istiyorum ancak ana bilgisayarın gerçekten bir EC2 örneği olduğundan nasıl emin olacağımı bilmiyorum .

Bazı testler yaptım ama bu yeterli değil:

  • İkili ec2_userdata'nın kullanılabilir olduğunu test edin (ancak bu her zaman doğru olmayacaktır)
  • " Http://169.254.169.254/latest/meta-data " testinin kullanılabilirliği (ancak bu her zaman doğru olacak mı? Ve bu "sihirli IP" nedir?)


Aslında bir APIPA adresi, meta veri alımı gibi kritik bir hizmet için referans olarak kullanmak oldukça garip.
Matthieu Cerda

2
EC2'lerin IP aralıkları halka açıktır (zaman zaman değişiklik gösterse de). Mevcut bir listeye ayak uydurabiliyorsanız, IP örneklerini bu aralıklara göre kontrol edebilirsiniz.
Karma Fusebox,

2
EC2 ve sadece EC2 - EC2 benzeri sistemler için Okaliptüs gibi sistemler istiyorsanız, 169.254.169.254 belgesine güvenmeyin . engage.eucalyptus.com/customer/portal/articles/…
ceejayoz

1
Ana bilgisayarda kökeni olan ve kendi kötü niyetli amaçları için bir EC2 örneği olduğunu düşünerek sizi kandırmaya çalışan bir saldırgana karşı çalışmak için yönteme ihtiyacınız var mı? Eğer yaparsan, o zaman çok daha zor olacak.
Mike Scott,

Yanıtlar:


3

Aslında, ev sahibinin EC2 örneği olup olmadığını saptamanın çok basit bir yolu var: Genel IP adresinizin tersine bakın. EC2'yi tersine çevirmek oldukça zor.

Ayrıca, onu değiştirmediyseniz, ana bilgisayar adı tersi de olmalı, bu da onu daha kolay keşfetmenizi sağlar.

Ayrıca, konuştuğunuz "sihirli IP" yi de kullanabilirsiniz, çünkü EC2 Örnek etiketlerini almanın standart yoludur, ancak, eğer bir EC2 ağında değilseniz, genellikle arzu ...

Bu yöntemler yeterli değilse, sadece IP’nizin bir kimliğini yapın ve Amazon EC2 IP bloğunda olup olmadığınızı kontrol edin.

EDIT: Bu küçük kabuk bitini kullanabilirsiniz:

#!/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

Dikkat et, [[bir bashism. Ayrıca bir Python veya Perl uniline, YMMV kullanabilirsiniz.


13
bu, bir VPC'de veya ana bilgisayar adını değiştirdiğiniz bir ortamda çalışmaz; Örneğin. Makineleriniz domain.local ise
Preflightsiren

2
ana bilgisayar adı biti başarısızlığa bağlı.
Dan Pritts

3
hostname -ddöndürüreu-west-1.compute.internal
Bulletmagnet

42

Hata mesajlarından kaçınmak ve komut dosyasına örnek kullanım dahil etmek için Hannes'in cevabı değiştirildi:

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

Bu, Windows örneklerinde çalışmaz. Kıvrılmanın avantajı, hem EC2'de hem de EC2'de olmayan ani yakınlığıdır.


4
AWS da bunu bu şekilde yapıyor tavsiye görünüyor docs.aws.amazon.com/AWSEC2/latest/UserGuide/...
Mike

3
Bu yöntemi sevdim. Sadece bir hipervizör altında çalışan EC2 dışı bir sistemin ec2yanlış bir pozitif ile başlayan bir UUID üretebileceğini unutmayın . Bu pek mümkün değildir (256'da bir şans) ve yalnızca bu dosyayı dolduran bir hiper yönetici kullanıyorsanız. Bu yüzden yukarıda verilen belgelerde “ muhtemelen bir EC2 örneğine bakıyorsunuz ” yazıyor .
Nate

1
@ Nate, iyi bir nokta, ama bu 4096'da 1 şansı olmamalı mı? (16 x 16 x 16)
Wildcard

2
@Wildcard: Yorumumu düzenleyemiyorum, ancak doğru.
Nate

7
TEHLİKE! Bu yöntem bizim için yıllarca güvenilir bir şekilde çalışmıştı ... yakın zamana kadar , bu dosyada bulunmayan en son c5 ve m5 türleri . Bu yüzden bu örnekleri ele almak için 169.254.169.254 geri dönüş kontrolünü eklemek zorundayım .
Josh Kupershmidt

20

Öncelikle, mevcut cevaplarla ilgili şu ince problemlerden dolayı yeni bir cevap göndermem gerektiğine ve @ qwertzguy'ün cevabı üzerine yorumum hakkında bir soru aldıktan sonra hissettim . İşte mevcut cevaplarla ilgili problemler:

  1. Kabul cevap @MatthieuCerda dan kesinlikle en az değil ben karşı kontrol herhangi VPC örneklerinde, güvenilir çalışmaz. (Örneklerimde, hostname -diçinde "amazonaws.com" olan hiçbir şey değil, dahili DNS için kullanılan bir VPC adı alıyorum.)
  2. @Qwertzguy tarafından verilen en yüksek oyu alan cevap , bu dosyaya sahip olmayan yeni m5 veya c5 örnekleri üzerinde çalışmaz . Her ne kadar, bu davranış değişikliği AFAIK belgelemek ihmal Amazon doc sayfa bu konuda yazıyor "... Eğer / sys / hiper yönetici / Uuid var ...". AWS'den bu değişikliğin kasıtlı olup olmadığını sordum, aşağıya bakınız †.
  3. @Jer gelen cevap çünkü ille her yerde çalışmıyor instance-data.ec2.internalDNS arama çalışmayabilir. Yeni test ettiğim bir Ubuntu EC2 VPC örneğinde, şunu gördüm: $ curl http://instance-data.ec2.internal curl: (6) Could not resolve host: instance-data.ec2.internal bu yönteme dayanan kodun yanlışlıkla EC2'de olmadığı sonucuna varmasına neden olacak!
  4. Cevap kullanmakdmidecode işe yarayabilir @tamale gelen ama senin bir dayanmaktadır.) Sahip dmidecode). Örneğiniz ve b geçerli kök veya sahip sudoKodunuzdaki içinden parola az yeteneği.
  5. Cevap / sys / cihazlarını kontrol etmek için sanal / / dmi / id / bios_version @spkane gelen tehlikeli yanıltıcıdır! Bir Ubuntu 14.04 m5 örneğini kontrol ve var bios_versioniçinde 1.0. Bu dosya Amazon'un belgesinde belgelenmemiş , bu yüzden gerçekten ona güvenmezdim.
  6. Güvenilmez bir üçüncü taraf URL’sini kontrol etmek ve sonucu kullanmak için @ Chris-Montanaro’dan gelen cevabın ilk kısmı whoisbirkaç düzeyde sorunlu. Bu cevapta önerilen URL’nin şu anda 404 sayfa olduğunu unutmayın! Eğer çalışma yaptı 3. taraf hizmetini buldunuz bile, nispeten olacağını çok (yerel bir dosyayı kontrol ile karşılaştırıldığında) yavaş ve muhtemelen hız kısıtlayıcı sorunları veya ağ sorunları çalıştırmak, ya da muhtemelen EC2 örneği bile yoktur dış ağ erişimi.
  7. İkinci öneri Chris-Montanaro @ gelen cevap kontrol etmek http://169.254.169.254/ biraz daha iyi olmakla birlikte, yanlış önlemek için dikkatli olmak zorunda başka yorumcu notları diğer bulut sağlayıcıları, bu örnek meta URL'nin kullanılabilir olması olduğunu pozitifler. Ayrıca hala yerel bir dosyadan çok daha yavaş olacaktır, bu kontrolün ağır yüklü örneklerde özellikle yavaş (geri dönmek için birkaç saniye) olduğunu gördüm. Ayrıca, çok uzun bir süre boyunca asılı kalmamak için kıvrılmaya karşı bir argüman -mveya --max-timeargüman iletmeyi hatırlamalısınız , özellikle bu adresin hiçbir yere yol açıp asabileceği EC2 dışı bir örnekte ( @ algal'in cevabında olduğu gibi ).

Ayrıca, kimsenin Amazon'un (olası) dosyayı kontrol etmenin belgelenmiş belgeselinden bahsettiğini de göremiyorum /sys/devices/virtual/dmi/id/product_uuid.

EC2'de çalışıp çalışmadığınızı belirlemenin bu kadar karmaşık olabileceğini kim bilebilirdi ?! Tamam, şimdi listelenen yaklaşımlarla ilgili sorunların çoğuna sahibiz, işte EC2'de çalışıp çalışmadığınızı kontrol etmek için önerilen bir bash pasajı. Bunun genellikle hemen hemen tüm Linux örneklerinde çalışması gerektiğini düşünüyorum, Windows örnekleri okuyucu için bir egzersizdir.

#!/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

Açıkçası, bunu daha fazla geri dönüş kontrolüyle genişletebilir ve /sys/hypervisor/uuidşans eseri "ec2" ile başlayan bir yanlış pozitifin ele alınmasıyla ilgili paranoya da dahil edebilirsiniz . Ancak bu, gösterim amacıyla ve muhtemelen neredeyse tüm patolojik olmayan kullanım durumlarında yeterince iyi bir çözümdür.

[†] Bu açıklamayı AWS desteğinden c5 / m5 örnekleri için yapılan değişiklik hakkında geri aldım:

C5 ve M5 örnekleri, yeni bir hiper yönetici yığını kullanır ve ilişkili çekirdek sürücüleri , diğer / eski örnek türleri tarafından kullanılan Xen sürücüleri gibi sysfs'te (/ sys'ye monte edilmiş) dosyalar oluşturmaz . İşletim sisteminin bir EC2 örneğinde çalışıp çalışmadığını saptamanın en iyi yolu, bağladığınız belgelerde listelenen farklı olasılıkları hesaba katmaktır .


4
Evet, 2018'de seyahat eden diğer dostlar ... aradığınız cevap bu.
russellpierce

Okuma / sys / devices / sanal / dmi / id / product_uuid ayrıca kök ayrıcalıkları gerektirir
Thayne

@Thayne doğru - bu elifbloğun üzerindeki yorumun söylediği ve eliftestin -rtest operatörünü kullanmasının nedeni budur , bu dosyanın var olup olmadığını ve dosya için okuma izinlerinin olup olmadığını kontrol eder.
Josh Kupershmidt

169.254.169.254 meta verilerine ek bir not - önyükleme sırasında her zaman hazır değildir. Bir bootscript için bu meta verilere ihtiyacınız varsa, hazır olana kadar yoklamaya devam etmeniz gerekir. Örneğin cloud-init bootscriptlerini çalıştırmaya başlamasının 30 saniye kadar sürdüğünü gördüm.
vacri

15

EC2'de değilseniz hızlı bir DNS hatası döndürecek IP IP yerine EC2'nin iç etki alanı adına göre arama yapın ve IP çakışmalarını veya yönlendirme sorunlarını önler:

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

Bazı dağıtımlarda, çok temel sistemler veya kurulum aşamalarında çok erken kıvrılma mümkün değildir. Bunun yerine wget kullanarak :

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

4
Ne yazık ki, VPC'de başarısız görünüyor!
Ashe

2
Ayrıca çift tırnak içerisindeki ünlem işareti karakterini kullanmayın - senin yankı patlatmak olabilir ile -bash: !": event not found. echoBunun yerine s için tek tırnak kullanın.
Josh Kupershmidt 10:15

1
Bu muhtemelen sunucunun hala ec2.internal bölgesini bilen EC2'nin DNS sunucularını kullandığını ve /etc/resolv.conf dosyasını hiç kimse 8.8.8.8 olarak değiştiremediğini veya kendi DNS altyapılarını yuvarladığını varsaymaktadır.
lamont

1
AWS bunu kırmış gibi görünüyor. Artık example-data.ec2.internal çözümünü çözemiyorum. example-data.us-west-2.compute.internal olsa da, en azından şimdilik.
Bryan Larsen

14

Amaç bunun bir EC2 örneği mi yoksa Google gibi başka bir bulut örneği mi olduğunu söylemekse dmidecodeçok iyi çalışıyor ve ağ bağlantısı gerektirmiyor. Bunu diğer yaklaşımlardan bazılarına karşı seviyorum, çünkü meta veri URL yolu EC2 ve GCE için farklı.

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

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

Bunun diğer VM ortamlarında ve hatta gerçek donanımda iyi çalışmasını beklerdim - Hiçbir donanım satıcısının bios sürümünün "amazon" dediği sistemleri göndermesini beklemiyorum ...
Guss

Ubuntu EC2 örneklerinde bu geri dönüyor 1.0- söz yok amazon.
Nate

5

Ana bilgisayar adlarının değişmesi ve genel IP’nize karşı bir whois çalıştırması olasıdır:

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

veya AWS meta-veri URL'sini tıklayın

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'de çalışmıyorsanız, hızlı bir şekilde başarısız olması için ikinci curl deyimine bir --connect-timeout 1 ekleyin.
Jonathan Oliver

1
FWIW, meta URL'yi kullanarak yapabilirsiniz bir bulut örneği olarak çalışıyor belirtmek, ancak özellikle EC2 ise kesin olarak belirleyemez. OpenStack ve Okaliptüs de aynı meta veri URI'sini kullanır. Bunun sirke topladığını biliyorum ama işim için hangi bulut sağlayıcının önemi var.
EmmEff

5

Bu, ec2'deki Linux ana bilgisayarları için de iyi çalışır ve ağa ve ilgili zaman aşımına uğramasını gerektirmez:

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

Bu işe yarıyor, çünkü Amazon bu girişi şöyle tanımlamaktadır:

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


2018/05/01; Ubuntu çalıştıran M5 örneklerinde geçersiz görünüyor.
russellpierce

Ubuntu EC2 örneklerimde bu geri dönüyor 1.0. Bahsetmek yok amazon.
Nate

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

ama bunun dağıtımlar boyunca ne kadar taşınabilir olduğunu bilmiyorum.


2
Eh, kesinlikle Windows EC2 örnekleri üzerinde çalışmayacak.
ceejayoz

1
Bu yöntemi tercih ediyorum, çünkü her türlü nedenden dolayı asılabilen bir ağ etkileşimi içermiyor. Bir takas için zaman aşımı süresinin bir takas için kullanılması garanti edilmez. Windows örnekleri umrumda değil.
Hannes

Bu tam ihtiyacım olan şeydi! Kıvrılmaktan çok daha iyi, teşekkürler!
qwertzguy

1
Tam UUID'yi kullanmayı düşünün, sadece başka bir satıcının hipervizörü UUID'nin "ec2" ile başlaması durumunda. Bunun olma şansı 4096'da 1'dir ve bu ihmal edilemez.
Hannes

1
Aslında, tüm UUID'leri karşılaştırmak işe yaramadı çünkü vahşi doğada çok sayıda farklı hiper yönetici UUID'yi gördüm. Hepsi olsa "ec2" ile başlar, bu yüzden bu cevap olduğu gibi çalışır.
Hannes,

3

Hızlı cevap:

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

Bir yıldan fazla bir süredir burada yayınlanan cevaplardan birini kullanıyordum - ancak yeni 'c5' örnek tipleri üzerinde çalışmıyor (şimdi 'c4'ten yükseltme yapmaya çalışıyorum).

Bu çözümü sevdim, çünkü gelecekte kırılması en az ihtimal gibi görünüyor.

Eski örnek tiplerinde ve yeni dosyalarda bu dosya var ve 'EC2' ile başlıyor. VirtualBox üzerinde çalışan Ubuntu'yu kontrol ettim (desteklemem gerekiyor) ve 'VirtualBox' dizesini içeriyordu.

Önceki bir posterde belirtildiği gibi (ama kaçırması kolaydı) - bunu yapmanın yollarını içeren Amazon belgeleri var - cevabımı da içeren.

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


2

Belki "facter" kullanabilirsiniz:

"Facter, işletim sistemi, linux dağıtımı veya MAC adresi gibi basit işletim sistemi gerçeklerini almak için çapraz platformlu bir kütüphanedir."

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

Örneğin, ec2 gerçeğine bakarsak (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

Yüklenmiş bir kıvrılma kurduysanız, eğer EC2 içinde çalışıyorsanız bu komut 0 değerini ve eğer kullanmıyorsanız sıfır olmayanını verir:

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

AMI-ID'sini bildiren EC2 meta verisini çekmeye çalışır. Bu, 3 saniye sonra başarılı olmazsa, EC2'de çalışmadığını varsayar.


0

Bu partiye biraz geç kaldım, ancak bu yazıyla karşılaştım ve daha sonra bu AWS belgelerini buldum:

Bir EC2 örneğini tanımlamanın kesin ve şifreli olarak doğrulanmış bir yöntemi için, imzası dahil olmak üzere örnek kimlik belgesini kontrol edin. Bu belgeler, her EC2 örneğinde yerel, yönlendirilemez adres http://169.254.169.254/latest/dynamic/instance-identity/ adresinde bulunabilir.

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

Elbette, kıvrılma zaman aşımını aşağıdaki gibi ayarlayabilseniz de, ağa genel gider gerektirir.

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

Bu zaman aşımını 5 s olarak ayarlar.

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.