Chciałbym uruchomić kilka skryptów na hostach, które są instancjami EC2, ale nie wiem, jak się upewnić, że host jest naprawdę instancją EC2.
Przeprowadziłem kilka testów, ale to nie wystarczy:
- Sprawdź, czy binarne ec2_userdata jest dostępne (ale nie zawsze będzie to prawdą)
- Przetestuj dostępność „ http://169.254.169.254/latest/meta-data ” (ale czy to zawsze będzie prawda? I co to za „magiczne IP”?)
amazon-ec2
Kelindil
źródło
źródło
Odpowiedzi:
Cóż, w rzeczywistości istnieje bardzo prosty sposób na wykrycie, czy host jest instancją EC2: sprawdź wsteczne wyszukiwanie swojego publicznego adresu IP. Odwrotności EC2 trudno przeoczyć.
Ponadto, jeśli go nie zmodyfikowałeś, nazwa hosta powinna być twoją odwrotnością, co dodatkowo ułatwi jego wykrycie.
Możesz także użyć „magicznego adresu IP”, o którym mówiłeś, ponieważ jest to rzeczywiście standardowy sposób uzyskiwania znaczników wystąpienia EC2, jednak jeśli nie jesteś w sieci EC2, musisz poczekać na limit czasu, co zwykle nie jest pożądany...
Jeśli te metody nie są wystarczające, po prostu zrób whois swojego adresu IP i sprawdź, czy jesteś w bloku i blokada IP Amazon EC2.
EDYCJA: Możesz użyć tego małego bitu powłoki:
Ostrożnie jednak [[to bzdura. Możesz także użyć Python lub Perl uniline, YMMV.
źródło
hostname -d
zwrotyeu-west-1.compute.internal
Zmieniono odpowiedź Hannesa, aby uniknąć komunikatów o błędach i uwzględnić przykładowe użycie w skrypcie:
To nie działa w instancjach Windows. Przewaga nad zwijaniem polega na tym, że jest ona prawie natychmiastowa zarówno w EC2, jak i poza EC2.
źródło
ec2
- fałszywie dodatni. Jest mało prawdopodobne (szansa 1 na 256) i tylko wtedy, gdy używasz hiperwizora wypełniającego ten plik. Dlatego w powyższej dokumentacji znajduje się informacja „ prawdopodobnie patrzysz na instancję EC2”.Po pierwsze, czułem potrzebę opublikowania nowej odpowiedzi z powodu następujących subtelnych problemów z istniejącymi odpowiedziami i po otrzymaniu pytania o mój komentarz do odpowiedzi @ qwertzguy . Oto problemy z obecnymi odpowiedziami:
hostname -d
, która jest używana do wewnętrznego DNS, a nie do niczego z „amazonaws.com”).instance-data.ec2.internal
wyszukiwanie DNS może nie działać. Na instancji Ubuntu EC2 VPC, na której właśnie testowałem, widzę:$ curl http://instance-data.ec2.internal curl: (6) Could not resolve host: instance-data.ec2.internal
co spowodowałoby, że kod polegający na tej metodzie błędnie stwierdziłby, że nie ma go na EC2!dmidecode
z @tamale może działać, ale opiera się na was.) Odmidecode
dostępne na przykład, i b.), Mający korzenie lubsudo
zdolność hasłem mniej z poziomu kodu.bios_version
od1.0
. Ten plik w ogóle nie jest udokumentowany w dokumentacji Amazon , więc naprawdę nie polegałbym na nim.whois
wyniku jest problematyczna na kilku poziomach. Uwaga: adres URL sugerowany w tej odpowiedzi to teraz strona 404! Nawet jeśli znalazłeś usługę innej firmy, która działała, byłaby stosunkowo bardzo wolna (w porównaniu do lokalnego sprawdzania pliku) i prawdopodobnie napotkałaby problemy ograniczające szybkość lub problemy z siecią, a może nawet twoja instancja EC2 nie ma zewnętrzny dostęp do sieci.-m
lub--max-time
curl, aby uniknąć zawieszania się przez bardzo długi czas, szczególnie w przypadku instancji innej niż EC2, gdzie ten adres może prowadzić do nikąd i zawiesić się (jak w odpowiedzi @ algal ).Nie widzę też, aby ktokolwiek wspominał o udokumentowanym wycofaniu się Amazon z sprawdzania (możliwego) pliku
/sys/devices/virtual/dmi/id/product_uuid
.Kto wiedział, że ustalenie, czy korzystasz z EC2, może być tak skomplikowane ?! OK, teraz, gdy mamy (większość) problemów z wymienionymi podejściami na liście, oto sugerowany fragment bash, aby sprawdzić, czy korzystasz z EC2. Myślę, że powinno to ogólnie działać na prawie wszystkich instancjach Linuksa, instancje Windows są ćwiczeniem dla czytelnika.
Oczywiście można to rozszerzyć o jeszcze więcej kontroli rezerwowych i uwzględnić paranoję dotyczącą radzenia sobie np. Z fałszywym pozytywnym
/sys/hypervisor/uuid
skutkiem, by zacząć od „ec2” przez przypadek i tak dalej. Ale jest to wystarczająco dobre rozwiązanie do celów ilustracyjnych i prawdopodobnie prawie wszystkich niepatologicznych przypadków użycia.[†] Otrzymałem to wyjaśnienie od wsparcia AWS dotyczące zmiany dla instancji c5 / m5:
źródło
elif
bloku, i dlategoelif
test używa-r
operatora testowego, który sprawdza, czy plik istnieje i czy masz uprawnienia do odczytu pliku.Poszukaj metadanych według wewnętrznej nazwy domeny EC2 zamiast adresu IP, który zwróci szybką awarię DNS, jeśli nie korzystasz z EC2, i pozwoli uniknąć konfliktów adresów IP lub problemów z routingiem:
W niektórych dystrybucjach bardzo podstawowe systemy lub bardzo wcześnie na etapach instalacji curl nie jest dostępny. Korzystanie wget zamiast:
źródło
-bash: !": event not found
.echo
Zamiast tego użyj pojedynczych cudzysłowów .Jeśli celem jest stwierdzenie, czy jest to instancja EC2 LUB inny rodzaj instancji w chmurze, takiej jak Google, to
dmidecode
działa bardzo ładnie i nie wymaga sieci. Podoba mi się to w porównaniu z niektórymi innymi podejściami, ponieważ ścieżka adresu URL metadanych jest inna dla EC2 i GCE.źródło
1.0
- bez wzmiankiamazon
.Nazwy hostów prawdopodobnie się zmienią, uruchom Whois przeciwko Twojemu publicznemu adresowi IP:
lub naciśnij adres metadanych AWS
źródło
Działa to również dobrze dla hostów Linuksa w ec2 i nie wymaga limitów sieciowych i związanych z nimi:
grep -q amazon /sys/devices/virtual/dmi/id/bios_version
To działa, ponieważ Amazon definiuje ten wpis w następujący sposób:
$ cat /sys/devices/virtual/dmi/id/bios_version 4.2.amazon
źródło
1.0
. Brak wzmianki oamazon
.ale nie wiem, jak przenośne jest to w różnych dystrybucjach.
źródło
Szybka odpowiedź:
Korzystałem z jednej z odpowiedzi opublikowanych tutaj od ponad roku - ale nie działa na nowych typach instancji „c5” (teraz pracuję nad aktualizacją z wersji „c4”).
Podoba mi się to rozwiązanie, ponieważ wydaje się, że w przyszłości będzie najmniej prawdopodobne, aby się zepsuło.
W starszych typach instancji i nowszych plik ten jest obecny i zaczyna się od „EC2”. Sprawdziłem Ubuntu działający na VirtualBox (który również muszę obsługiwać) i zawiera ciąg „VirtualBox”.
Jak zauważył poprzedni plakat (ale łatwo go było przegapić) - istnieje dokumentacja Amazon na temat tego, jak to zrobić - która zawiera moją odpowiedź.
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
źródło
Być może możesz użyć „facter”:
„Facter to wieloplatformowa biblioteka do wyszukiwania prostych informacji o systemie operacyjnym, takich jak system operacyjny, dystrybucja linux lub adres MAC”.
http://www.puppetlabs.com/puppet/related-projects/facter/
Na przykład, jeśli przyjrzymy się faktowi ec2 (facter-1.6.12 / lib / facter / ec2.rb):
źródło
Jeśli masz zainstalowane curl, to polecenie zwróci 0, jeśli działasz w EC2 i niezerowe, jeśli nie jesteś:
Próbuje wyciągnąć metadane EC2 deklarujące identyfikator AMI. Jeśli to się nie powiedzie po 3 sekundach, oznacza to, że nie działa w EC2.
źródło
Trochę za późno na tę imprezę, ale natknąłem się na ten post i znalazłem dokumentację AWS:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
To oczywiście wymaga narzutu sieciowego, chociaż można ustawić limit czasu zawijania w następujący sposób:
To ustawia limit czasu na 5s.
źródło