Ich möchte einige Skripte auf Hosts ausführen, bei denen es sich um EC2-Instanzen handelt, kann aber nicht sicher sein, dass es sich bei dem Host tatsächlich um eine EC2-Instanz handelt.
Ich habe einige Tests gemacht, aber das reicht nicht aus:
- Testen Sie, ob die Binärdatei ec2_userdata verfügbar ist (dies ist jedoch nicht immer der Fall).
- Testverfügbarkeit von " http://169.254.169.254/latest/meta-data " (aber wird dies immer zutreffen? Und was ist diese "magische IP"?)
amazon-ec2
Kelindil
quelle
quelle
Antworten:
Tatsächlich gibt es eine sehr einfache Möglichkeit, festzustellen, ob der Host eine EC2-Instanz ist: Überprüfen Sie die umgekehrte Suche Ihrer öffentlichen IP. Die EC2-Umkehrungen sind kaum zu übersehen.
Wenn Sie es nicht geändert haben, sollte der Hostname umgekehrt sein, damit Sie es leichter erkennen können.
Sie können auch die "magische IP" verwenden, von der Sie gesprochen haben, da dies in der Tat die Standardmethode zum Abrufen von EC2-Instanz-Tags ist. Wenn Sie sich jedoch nicht in einem EC2-Netzwerk befinden, müssen Sie auf eine Zeitüberschreitung warten, die in der Regel nicht der Fall ist wünschenswert...
Wenn diese Methoden nicht ausreichen, geben Sie einfach Ihre IP-Adresse ein und überprüfen Sie, ob Sie sich innerhalb von Amazon EC2 befinden und die IP blockieren.
EDIT: Sie können dieses kleine Shell-Bit verwenden:
Vorsicht, [[ist ein Bashismus. Sie können auch eine Python- oder Perl-Uniline, YMMV, verwenden.
quelle
hostname -d
kehrt zurückeu-west-1.compute.internal
Die Antwort von Hannes wurde geändert, um Fehlermeldungen zu vermeiden und eine Beispielverwendung in das Skript aufzunehmen:
Dies funktioniert nicht in Windows-Instanzen. Vorteil gegenüber dem Einrollen ist, dass es sowohl bei EC2 als auch bei Nicht-EC2 nahezu augenblicklich ist.
quelle
ec2
einem falschen Positiv beginnt . Dies ist unwahrscheinlich (eine 1-in-256-Chance) und nur dann, wenn Sie einen Hypervisor verwenden, der diese Datei auffüllt. Aus diesem Grund heißt es in der oben verlinkten Dokumentation, dass es sich wahrscheinlich um eine EC2-Instanz handelt.Zuerst hatte ich das Bedürfnis, eine neue Antwort zu schreiben, weil die vorhandenen Antworten folgende subtile Probleme aufwiesen und nachdem ich eine Frage zu meinem Kommentar zur Antwort von @ qwertzguy erhalten hatte . Hier sind die Probleme mit den aktuellen Antworten:
hostname -d
, der für internes DNS verwendet wird, und nichts mit "amazonaws.com".)instance-data.ec2.internal
DNS-Suche möglicherweise nicht funktioniert. Auf einer Ubuntu EC2 VPC-Instanz, auf der ich gerade getestet habe, sehe ich:$ curl http://instance-data.ec2.internal curl: (6) Could not resolve host: instance-data.ec2.internal
Dies würde dazu führen, dass Code, der sich auf diese Methode stützt, fälschlicherweise zu dem Schluss kommt, dass es sich nicht um EC2 handelt!dmidecode
Antwort mag funktionieren, hängt jedoch davon ab, dass Sie a.)dmidecode
Auf Ihrer Instanz verfügbar sind und b.) Über Root- odersudo
kennwortlose Funktionen in Ihrem Code verfügen .bios_version
von1.0
. Diese Datei ist auf dem Amazon- Dokument überhaupt nicht dokumentiert , daher würde ich mich wirklich nicht darauf verlassen.whois
des Ergebnisses ist auf mehreren Ebenen problematisch. Beachten Sie, dass die in dieser Antwort vorgeschlagene URL derzeit eine 404-Seite ist! Selbst wenn Sie einen 3rd-Party - Service finden taten der Arbeit getan hat, wäre es vergleichsweise seinen sehr langsam ( im Vergleich zu einer Datei lokal Überprüfung) und möglicherweise in geschwindigkeitsbegrenzenden Probleme oder Netzwerkprobleme führen, oder möglicherweise Ihre EC2 - Instanz noch nicht einmal außerhalb des Netzwerkzugriffs.-m
oder ein--max-time
Argument an curl zu übergeben, um zu vermeiden, dass es sehr lange hängen bleibt, insbesondere in einer Nicht-EC2-Instanz, in der diese Adresse möglicherweise nirgendwohin führt und hängen bleibt (wie in der Antwort von @ algal ).Ich sehe auch nicht, dass irgendjemand Amazon als dokumentierten Fallback für die Überprüfung der (möglichen) Datei erwähnt hat
/sys/devices/virtual/dmi/id/product_uuid
.Wer hätte gedacht, dass die Entscheidung, ob Sie mit EC2 arbeiten, so kompliziert sein könnte ?! OK, jetzt, da wir (die meisten) Probleme mit den aufgelisteten Ansätzen haben, ist hier ein vorgeschlagenes Bash-Snippet, um zu überprüfen, ob Sie mit EC2 arbeiten. Ich denke, das sollte generell auf fast allen Linux-Instanzen funktionieren, Windows-Instanzen sind eine Übung für den Leser.
Offensichtlich könnten Sie dies mit noch mehr Fallback-Checks erweitern und Paranoia über den Umgang mit z. B. einem
/sys/hypervisor/uuid
zufälligen Fehlalarm von "ec2" einschließen und so weiter. Dies ist jedoch eine ausreichend gute Lösung für Illustrationszwecke und wahrscheinlich für fast alle nicht-pathologischen Anwendungsfälle.[†] Diese Erklärung zur Änderung für c5 / m5-Instanzen wurde vom AWS-Support zurückgegeben:
quelle
elif
Block, und deshalbelif
verwendet der-r
Test den Testoperator, der prüft, ob die Datei vorhanden ist und ob Sie Leseberechtigungen für die Datei haben.Suchen Sie nach den Metadaten anhand des internen Domänennamens von EC2 anstelle der IP-Adresse. Dies führt zu einem schnellen DNS-Fehler, wenn Sie nicht mit EC2 arbeiten, und vermeidet IP-Konflikte oder Routing-Probleme:
In einigen Distributionen, sehr einfachen Systemen oder in sehr frühen Installationsphasen ist Curl nicht verfügbar. Verwenden Sie stattdessen wget :
quelle
-bash: !": event not found
. Verwenden Sieecho
stattdessen einfache Anführungszeichen .Wenn Sie feststellen möchten, ob es sich um eine EC2-Instanz oder eine andere Art von Cloud-Instanz handelt, wie z. B. Google,
dmidecode
funktioniert dies sehr gut und es ist kein Netzwerk erforderlich. Ich mag dies im Vergleich zu einigen anderen Ansätzen, da der Metadaten-URL-Pfad für EC2 und GCE unterschiedlich ist.quelle
1.0
- keine Erwähnung vonamazon
.Hostnamen ändern sich wahrscheinlich. Führen Sie einen Whois gegen Ihre öffentliche IP-Adresse aus:
oder klicken Sie auf die AWS-Metadaten-URL
quelle
Dies funktioniert auch für Linux-Hosts in ec2 und erfordert kein Netzwerk und damit verbundene Zeitlimits:
grep -q amazon /sys/devices/virtual/dmi/id/bios_version
Dies funktioniert, da Amazon diesen Eintrag folgendermaßen definiert:
$ cat /sys/devices/virtual/dmi/id/bios_version 4.2.amazon
quelle
1.0
. Keine Erwähnung vonamazon
.aber ich weiß nicht, wie portabel dies über Distributionen hinweg ist.
quelle
Schnelle Antwort:
Ich habe über ein Jahr lang eine der hier veröffentlichten Antworten verwendet - aber sie funktioniert nicht auf den neuen Instanztypen 'c5' (ich arbeite derzeit an einem Upgrade von 'c4').
Ich mag diese Lösung, weil es so scheint, als würde sie in Zukunft am wenigsten scheitern.
Bei den älteren und den neueren Instanztypen ist diese Datei vorhanden und beginnt mit 'EC2'. Ich habe geprüft, ob Ubuntu auf VirtualBox läuft (was ich auch unterstützen muss) und es enthält den String 'VirtualBox'.
Wie bereits in einem früheren Poster erwähnt (aber leicht zu übersehen), gibt es eine Amazon-Dokumentation, in der meine Antwort enthalten ist.
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
quelle
Vielleicht kannst du "facter" benutzen:
"Facter ist eine plattformübergreifende Bibliothek zum Abrufen einfacher Betriebssystemdaten wie Betriebssystem, Linux-Distribution oder MAC-Adresse."
http://www.puppetlabs.com/puppet/related-projects/facter/
Wenn wir uns zum Beispiel die ec2-Tatsache ansehen (facter-1.6.12 / lib / facter / ec2.rb):
quelle
Wenn Sie Curl installiert haben, gibt dieser Befehl 0 zurück, wenn Sie innerhalb von EC2 ausgeführt werden, und einen Wert ungleich Null, wenn Sie nicht:
Es wird versucht, die EC2-Metadaten abzurufen, in denen die AMI-ID deklariert ist. Wenn dies nach 3 Sekunden nicht gelingt, wird davon ausgegangen, dass EC2 nicht ausgeführt wird.
quelle
Ein bisschen zu spät zu dieser Party, aber ich bin auf diesen Beitrag gestoßen und habe dann diese AWS-Dokumentation gefunden:
https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/identify_ec2_instances.html
Dies erfordert natürlich den Netzwerk-Overhead, obwohl Sie das Curl-Timeout wie folgt einstellen können:
Das setzt das Timeout auf 5s.
quelle