Meistern der AWS CLI-Ausgabefilterung mit JQ: Fortgeschrittene Techniken
Verwenden Sie jq mit AWS CLI JSON-Ausgabe, um Cloud-Daten für Skripte und Berichte zu filtern, umzuformen und zu exportieren.
Meisterhafte AWS CLI Ausgabefilterung mit JQ: Fortgeschrittene Techniken
Die AWS CLI Ausgabefilterung wird unübersichtlich, wenn ein Befehl tief verschachteltes JSON zurückgibt. Sie benötigen möglicherweise nur eine Instanz-ID, einen Tag-Wert oder einen kurzen CSV-Bericht, aber Befehle wie aws ec2 describe-instances geben weit mehr Daten zurück als das.
Die AWS CLI hat eine integrierte --query-Option, die JMESPath verwendet, und sie ist oft das richtige Werkzeug für einfache Abfragen. jq ist nützlich, wenn Sie eine umfangreichere JSON-Umformung, bedingte Logik, CSV-Ausgabe oder Filter wünschen, die Sie in Shell-Skripten wiederverwenden können.
Beginnen Sie mit JSON-Ausgabe
jq liest JSON, daher lassen Sie die AWS CLI explizit JSON zurückgeben:
aws ec2 describe-instances --output json
Sie können JSON auch mit aws configure als Ihre konfigurierte Standardeinstellung festlegen, aber die Verwendung von --output json in Beispielen und Skripten macht die Abhängigkeit offensichtlich.
Installieren Sie jq mit Ihrem Systempaketmanager, falls es noch nicht verfügbar ist:
sudo apt update && sudo apt install jq
sudo dnf install jq
brew install jq
AWS JSON lesen und inspizieren
Der Identitätsfilter . gibt das eingegebene JSON zurück. Er ist praktisch, wenn Sie eine hübsch formatierte Ausgabe wünschen, während Sie die Struktur einer Antwort kennenlernen:
aws ec2 describe-instances --output json | jq '.'
Um einen Top-Level-Schlüssel auszuwählen, verwenden Sie die Punktnotation:
aws ec2 describe-instances --output json | jq '.Reservations'
Die meisten AWS-Befehle verpacken nützliche Daten in Arrays. Für EC2-Instanzen ist die Struktur Reservations[] gefolgt von Instances[], daher benötigen Sie normalerweise beide Ebenen.
Arrays durchlaufen
Verwenden Sie .[], um jedes Element aus einem Array auszugeben. Dieser Befehl gibt jede EC2-Instanz-ID über alle Reservierungen hinweg aus:
aws ec2 describe-instances --output json | jq '.Reservations[].Instances[].InstanceId'
Standardmäßig enthält die Zeichenkettenausgabe JSON-Anführungszeichen. Fügen Sie -r hinzu, wenn Sie Rohtext für eine Shell-Schleife oder einen anderen Befehl benötigen:
aws ec2 describe-instances --output json | jq -r '.Reservations[].Instances[].InstanceId'
Sie können auch ein kleineres Objekt mit nur den Feldern erstellen, die Sie interessieren:
aws ec2 describe-instances --output json |
jq '.Reservations[].Instances[] | {id: .InstanceId, state: .State.Name, type: .InstanceType}'
Das ergibt kompakte JSON-Datensätze anstelle der vollständigen EC2-Antwort.
Filtern mit select()
Verwenden Sie select(), wenn Sie nur Datensätze möchten, die einer Bedingung entsprechen. Dieses Beispiel listet laufende Instanz-IDs auf:
aws ec2 describe-instances --output json |
jq -r '.Reservations[].Instances[] | select(.State.Name == "running") | .InstanceId'
Zeichenkettenliterale innerhalb eines jq-Filters verwenden doppelte Anführungszeichen, wie z.B. "running". Wenn Sie das gesamte jq-Programm in einfache Anführungszeichen setzen, gibt Ihre Shell diese doppelten Anführungszeichen sicher weiter.
Für eine spezifischere Überprüfung filtern Sie nach Instanztyp:
aws ec2 describe-instances --output json |
jq -r '.Reservations[].Instances[] | select(.InstanceType == "t3.micro") | .InstanceId'
Optionale Felder sicher behandeln
AWS-Ressourcen lassen oft Felder aus. Tags sind ein häufiges Beispiel. Wenn eine Instanz kein Tags-Array hat, kann .Tags[] fehlschlagen. Verwenden Sie den optionalen Iterator .Tags[]?:
aws ec2 describe-instances --output json |
jq '.Reservations[].Instances[] | {id: .InstanceId, name: (.Tags[]? | select(.Key == "Name") | .Value)}'
Das funktioniert, kann aber keinen name-Wert erzeugen, wenn das Tag fehlt. Für Skripte ist ein Standardwert normalerweise einfacher zu verarbeiten:
aws ec2 describe-instances --output json |
jq '.Reservations[].Instances[] | {
id: .InstanceId,
name: ((.Tags[]? | select(.Key == "Name") | .Value) // "unnamed")
}'
Ein Array anstelle eines Streams zurückgeben
Viele jq-Filter geben einen Strom von Werten aus. Wenn ein anderes Tool ein gültiges JSON-Array erwartet, setzen Sie den Ausdruck in eckige Klammern:
aws ec2 describe-instances --output json |
jq '[.Reservations[].Instances[].InstanceId]'
Dies ist nützlich, wenn Sie eine JSON-Datei für einen anderen Automatisierungsschritt schreiben.
CSV oder TSV exportieren
Für tabellenkalkulationsfreundliche Berichte erstellen Sie ein Array von Feldern und übergeben es an @csv oder @tsv. Verwenden Sie -r, damit jq rohe CSV-Zeilen anstelle von JSON-Zeichenketten schreibt:
aws ec2 describe-instances --output json |
jq -r '.Reservations[].Instances[] | [.InstanceId, .InstanceType, .State.Name] | @csv'
Um eine Kopfzeile einzuschließen, geben Sie sie vor den Datenzeilen aus:
aws ec2 describe-instances --output json |
jq -r '["instance_id","instance_type","state"], (.Reservations[].Instances[] | [.InstanceId, .InstanceType, .State.Name]) | @csv'
Praktisches Beispiel: Nicht zugeordnete Elastic IPs finden
Nicht zugeordnete Elastic-IP-Adressen können vermeidbare Kosten verursachen. Dieser Befehl listet öffentliche IPs auf, bei denen AWS keine AssociationId zurückgegeben hat:
aws ec2 describe-addresses --output json |
jq -r '.Addresses[] | select(.AssociationId == null) | .PublicIp'
Wenn es Adressen ausgibt, überprüfen Sie sie vor der Freigabe:
aws ec2 release-address --allocation-id eipalloc-0123456789abcdef0
Leiten Sie Freigabebefehle nicht direkt aus einer Erkennungsabfrage weiter, bevor Sie die Ergebnisse überprüft haben. Ein kurzer Überprüfungsschritt ist billiger als die Wiederherstellung nach dem Löschen der falschen Ressource.
Wann --query stattdessen verwendet werden sollte
Verwenden Sie AWS CLI --query für einfache Projektionen, da es vor der Ausgabeformatierung ausgeführt wird und den Befehl in sich geschlossen hält:
aws ec2 describe-instances \
--query 'Reservations[].Instances[].InstanceId' \
--output text
Greifen Sie zu jq, wenn das Ergebnis mehr Transformation erfordert, wie z.B. Fallback-Werte, CSV-Formatierung, Kombinieren von Feldern oder längere Filter, die in der jq-Syntax leichter zu lesen sind.
Fazit
Verwenden Sie --output json als Übergabepunkt zwischen AWS CLI und jq. Kombinieren Sie dann .[], select(), Objektkonstruktion, //-Standardwerte und -r-Rohtextausgabe, um große AWS-Antworten in die genauen Daten zu verwandeln, die Ihr Skript oder Bericht benötigt.