Einführung in AWS-CLI, Teil 3 EC2-Ressourcen mittels AWS-CLI filtern

Autor / Redakteur: Dipl. -Ing. Thomas Drilling / Stephan Augsten

Das AWS-CLI-Kommando „EC2“ bietet eine große Auswahl an Möglichkeiten, virtuelle Maschinen in AWS zu erstellen, zu steuern und zu verwalten. Der dritte Teil unseres CLI-Workshops befasst sich mit der Suche nach Ressouren, bzw. allgemein mit den Filtermöglichkeiten der Ausgaben, die „jedes“ CLI-Kommando liefert.

Anbieter zum Thema

Das EC-Subkommando „describe instances“ liefert ohne weitere Filterung sämtliche in der Default-Region vorhanden Instanzen zurück.
Das EC-Subkommando „describe instances“ liefert ohne weitere Filterung sämtliche in der Default-Region vorhanden Instanzen zurück.
(Bild: Drilling / AWS)

Wir haben uns bisher ausschließlich mit dem AWS-CLI-Kommando „aws ec2“ befasst und dabei unter anderem das Sub-Command „run instances“ kennengelernt. So erstellt beispielsweise

aws ec2 run-instances --image-id <ami-id> --user-data file:///home/ec2-user/UserData.txt --key-name <key-name> --security-group-ids <sg-id> --instance-type t2.micro --subnet-id <subnet-id> --associate-public-ip-address --query 'Instances[*].InstanceId'

eine neue EC2-Instanz in mit den hervorgehobenen Provisionierungs-Attributen, wie z. B. Image-ID (ami-id), Security-Group (sg-id) oder Subnetz (subnet-id).

Hat der Admin explizit das Ausgabe-Format „JSON“ gewählt oder es via „aws configure“ voreingestellt, liefert jedes CLI-Kommando ein mehr oder weniger komplexes Array aller in der bei „aws configure“ (oder explizit) angegebenen Default-Region vorhandenen Ressourcen. Das abgebildete Kommando filtert den umfangreichen JSON-Output, sodass dieser nur die Instance-ID der erstellten Instanz enthält.

Das EC-Subkommando „describe instances“ liefert ohne weitere Filterung sämtliche in der Default-Region vorhanden Instanzen zurück.
Das EC-Subkommando „describe instances“ liefert ohne weitere Filterung sämtliche in der Default-Region vorhanden Instanzen zurück.
(Bild: Drilling / AWS)

Verwendet der Admin aber beispielsweise „describe instances“, das einfachste und am häufigsten benötige Sub-Command in EC2, so liefert dieses ohne weitere Filterung sämtliche in der Default-Region vorhanden Instanzen zurück – und zwar jede mit all ihren verfügbaren Attributen. Je nach Anzahl der Instanzen kann das Ausgabe-Array also sehr, sehr groß ausfallen, wie die Abbildung zeigt.

Bei der Analyse des JSON-Files fällt auf, dass die „oberste Ebene“ nicht durch die Instanzen (Instances) gebildet wird, sondern durch die so genannte „Reservation“. Diese hat nicht etwa etwas mit dem Purchase-Typ „Reserved Instances“ zu tun. Vielmehr kann man das Attribut etwa mit „Erstellungs-Anforderung für EC2-Instanzen“ übersetzen.

So lassen sich ja z. B. mit einem einzigen Sub-Command „create-instances“ (oder auch im entsprechenden Dialog der AWS-Management-Console zum Erstellen von EC2-Instanzen) von ein und demselben AMI in einem einzigen Aufruf durchaus mehrere Instanzen des gleichen Typs erzeugen. Diese hätten dann naturgemäß je eine individuelle Instance-ID, aber alle die gleiche Reservation-ID.

Die Reservation-ID ist also ein eindeutiger Wert, der eine Anforderung zum Starten von EC2-Instanzen angibt. So eine Startanforderung kann von der CLI, AutoScaling oder der AWS Management Console stammen. Jede Anforderung nach EC2-Instanzen liefert entweder keine oder mehrere Instanzen zurück. Klappt die Startanforderung, ist der Rückgabewert eins (oder höher), da eine einzelne Startanforderung in mehrere Reservierungen aufgeteilt werden kann.

In jedem --query-Ausdruck muss naturgemäß auch immer erst die ReservationID und dann die InstanceID referenziert sein.
In jedem --query-Ausdruck muss naturgemäß auch immer erst die ReservationID und dann die InstanceID referenziert sein.
(Bild: Drilling / AWS)

In der Regel erhalten Instanzen, die gleichzeitig gestartet werden, dieselbe Reservierungs-ID. Startet man jedoch zwei Instanzen zu zwei verschiedenen Zeitpunkten, werden unterschiedliche Reservierungswerte zurückgegeben. So kann der Nutzer z. B. beim Kommando „aws ec2 run-instances“ die minimale und maximale Anzahl von Instanzen angeben, die gleichzeitig gestartet werden sollen. Weitere Informationen zur Reservation-ID liefert die API-Dokumentation für den Reservierungsdatentyp.

In jedem --query-Ausdruck muss naturgemäß auch immer erst die ReservationID und dann die InstanceID referenziert sein. Möchte der Admin beispielsweise nur die jeweiligen „ReservationID“ „aller“ Reservations „aller“ EC2-Insanzen (egal, ob gestartet oder nicht) in der Default-Region sehen, verwendet er:

aws ec2 describe-instances --query 'Reservations[*].ReservationId'

Möchte er dagegen die InstanceIDs sämtlicher EC2-Instancen in der Default-Region sehen, verwendet er

aws ec2 describe-instances –query 'Reservations[*].Instances[*].InstanceId'

Wie man sieht, schränkt die Option „--query“ quasi nachträglich das ausgegebene JSON-File auf den gewünschten Output ein, man könnte sie also eine Art Display-Filter nutzen. Die Option --query lässt sich aber auch mit der Option --filter kombinieren, mit der sich die zu erwartende Ausgabe bereits vorher so filtern lässt, dass der JSON-Output kompakter wird. Im folgenden Beispiel suchen wir alle EC2-Instanzen in der Default-Region, die mit dem Tag „Project=ERPSystem“ versehen sind, geben von diesen aber nur das Attribut „InstanceID“ aus:

aws ec2 describe-instances --filter "Name=tag:Project,Values=ERPSystem" --query 'Reservations[*].Instances[*].InstanceId'

Die --query-Option schränkt das JSON-File auf die gewünschte Ausgabe ein.
Die --query-Option schränkt das JSON-File auf die gewünschte Ausgabe ein.
(Bild: Drilling / AWS)

Solche Filter kommen immer dann zum Einsatz, wenn man in der der betreffenden Region über sehr viele Ressourcen verfügt. Der Admin kann dann die Ergebnisse so filtern, dass er nur die Ressourcen „enthält“, die bestimmten Kriterien entsprechen. So prüft der Admin etwa mit folgenden Kommando, ob die Instance mit der InstanceID „i-07acc9579c72e34fc“ existiert:

aws ec2 describe-instances --filter Name="instance-id",Values=" i-07acc9579c72e34fc"

Tut sie das, gibt das Kommando allerdings wieder das komplette Attribut-Array der betreffenden Instanz aus. Möchte man die Ausgabe wieder auf die InstanceID selbst beschränken, muss erneut die –query-Option herhalten:

aws ec2 describe-instances --filter Name="instance-id",Values=" i-07acc9579c72e34fc" --query "Reservations[*].Instances[*].InstanceId"

Nun fragen wir wie folgt nach der Image-ID der betreffenden Instanz …

aws ec2 describe-instances --filter Name="instance-id",Values=" i-07acc9579c72e34fc" --query "Reservations[*].Instances[*].ImageId"

…, nach der SecurityGroup-ID ...

aws ec2 describe-instances --filter Name="instance-id",Values=" i-07acc9579c72e34fc" --query "Reservations[*].Instances[*].GroupId"

... oder nach der Subnet-ID

aws ec2 describe-instances --filter Name="instance-id",Values=" i-07acc9579c72e34fc" --query "Reservations[*].Instances[*].SubnetId"

Selbstverständlich bietet das Filtern auch erweiterte Möglichkeiten, indem man verschiedene Filter geschickt kombiniert. So kann der Admin wie gesehen beispielsweise nach Schlüsselwörtern, vom Benutzer festgelegten Tags oder vordefinierten Ressourcenattributen filtern. Man kann auch nach Ressourcen suchen, die einem angegebenen Wert gerade nicht entsprechen. Möchte der Admin etwa alle Instanzen auflisten, die nicht beendet wurden, sucht er nach dem „Instance State“ und stellt dem Wert „Terminated“ ein Ausrufezeichen (!) voran.

Beim Suchen nach Feldern lassen sich auch „Teilzeichenfolge“ einbinden, um alle Ressourcen zu finden, die die angegebene Zeichenfolge enthalten. Ferner ist das Verwenden „Regulärer Ausdrücke“ möglich. Sucht der Admin etwa Werte für ein Attribut, die einem spezifisches Muster entsprechen müssen. So könnte man beispielsweise im Namens-Tag „^e.*“ verwenden, um alle Instanzen mit einem Namens-Tag zu finden, das mit „e“ anfängt. Bei der Suche nach regulären Ausdrücken wird die Groß-/Kleinschreibung nicht berücksichtigt.

Durch das Verwenden von CLI-Befehlen in Skripten lassen sich auch weitaus komplexere Operations-Aufgaben erledigen. So könnten man z. B. mit BASH- oder Python Skripten nach Instanzen suchen, die nicht gemäß der Unternehmensrichtlinie getaggt sind und diese z. B. beenden oder entsprechend kennzeichnen.

Diese und weitere Möglichkeiten zeigt Teil 4 unseres AWS-CLI-Workshops.

(ID:45081383)