Padroneggiare il Filtraggio dell'Output di AWS CLI con JQ: Tecniche Avanzate
Usa jq con l'output JSON di AWS CLI per filtrare, rimodellare ed esportare dati cloud per script e report.
Padroneggiare il Filtraggio dell'Output di AWS CLI con JQ: Tecniche Avanzate
Il filtraggio dell'output di AWS CLI diventa complicato quando un comando restituisce JSON profondamente annidato. Potresti aver bisogno solo di un ID istanza, un valore di tag o un breve report CSV, ma comandi come aws ec2 describe-instances restituiscono molti più dati.
AWS CLI ha un'opzione integrata --query che utilizza JMESPath, ed è spesso lo strumento giusto per ricerche semplici. jq è utile quando desideri un rimodellamento JSON più ricco, logica condizionale, output CSV o filtri riutilizzabili negli script shell.
Inizia con Output JSON
jq legge JSON, quindi fai in modo che AWS CLI restituisca JSON esplicitamente:
aws ec2 describe-instances --output json
Puoi anche impostare JSON come predefinito configurato con aws configure, ma usare --output json negli esempi e negli script rende la dipendenza ovvia.
Installa jq con il gestore pacchetti del tuo sistema se non è già disponibile:
sudo apt update && sudo apt install jq
sudo dnf install jq
brew install jq
Leggi e Ispeziona JSON di AWS
Il filtro identità, ., restituisce il JSON di input. È utile quando desideri un output ben formattato mentre impari la forma di una risposta:
aws ec2 describe-instances --output json | jq '.'
Per selezionare una chiave di primo livello, usa la notazione punto:
aws ec2 describe-instances --output json | jq '.Reservations'
La maggior parte dei comandi AWS racchiude dati utili in array. Per le istanze EC2, la struttura è Reservations[] seguita da Instances[], quindi di solito hai bisogno di entrambi i livelli.
Itera Attraverso gli Array
Usa .[] per emettere ogni elemento da un array. Questo comando stampa ogni ID istanza EC2 in tutte le prenotazioni:
aws ec2 describe-instances --output json | jq '.Reservations[].Instances[].InstanceId'
Per impostazione predefinita, l'output delle stringhe include virgolette JSON. Aggiungi -r quando hai bisogno di testo grezzo per un ciclo shell o un altro comando:
aws ec2 describe-instances --output json | jq -r '.Reservations[].Instances[].InstanceId'
Puoi anche costruire un oggetto più piccolo con solo i campi che ti interessano:
aws ec2 describe-instances --output json |
jq '.Reservations[].Instances[] | {id: .InstanceId, state: .State.Name, type: .InstanceType}'
Questo fornisce record JSON compatti invece della risposta EC2 completa.
Filtra con select()
Usa select() quando desideri solo record che soddisfano una condizione. Questo esempio elenca gli ID delle istanze in esecuzione:
aws ec2 describe-instances --output json |
jq -r '.Reservations[].Instances[] | select(.State.Name == "running") | .InstanceId'
Le stringhe letterali all'interno di un filtro jq usano virgolette doppie, come "running". Se racchiudi l'intero programma jq in virgolette singole, la tua shell passerà quelle virgolette doppie in modo sicuro.
Per un controllo più specifico, filtra per tipo di istanza:
aws ec2 describe-instances --output json |
jq -r '.Reservations[].Instances[] | select(.InstanceType == "t3.micro") | .InstanceId'
Gestisci Campi Opzionali in Modo Sicuro
Le risorse AWS spesso omettono campi. I tag sono un esempio comune. Se un'istanza non ha array Tags, .Tags[] può fallire. Usa l'iteratore opzionale .Tags[]?:
aws ec2 describe-instances --output json |
jq '.Reservations[].Instances[] | {id: .InstanceId, name: (.Tags[]? | select(.Key == "Name") | .Value)}'
Funziona, ma può produrre nessun valore name quando il tag è mancante. Per gli script, un valore predefinito è di solito più facile da consumare:
aws ec2 describe-instances --output json |
jq '.Reservations[].Instances[] | {
id: .InstanceId,
name: ((.Tags[]? | select(.Key == "Name") | .Value) // "senza_nome")
}'
Restituisci un Array Invece di uno Stream
Molti filtri jq emettono uno stream di valori. Se un altro strumento si aspetta un array JSON valido, racchiudi l'espressione tra parentesi quadre:
aws ec2 describe-instances --output json |
jq '[.Reservations[].Instances[].InstanceId]'
Questo è utile quando stai scrivendo un file JSON per un altro passaggio di automazione.
Esporta CSV o TSV
Per report adatti ai fogli di calcolo, costruisci un array di campi e passalo a @csv o @tsv. Usa -r in modo che jq scriva righe CSV grezze invece di stringhe JSON:
aws ec2 describe-instances --output json |
jq -r '.Reservations[].Instances[] | [.InstanceId, .InstanceType, .State.Name] | @csv'
Per includere una riga di intestazione, emettila prima delle righe di dati:
aws ec2 describe-instances --output json |
jq -r '["instance_id","instance_type","state"], (.Reservations[].Instances[] | [.InstanceId, .InstanceType, .State.Name]) | @csv'
Esempio Pratico: Trova IP Elastici Non Associati
Gli indirizzi IP Elastici non associati possono generare costi evitabili. Questo comando elenca gli IP pubblici dove AWS non ha restituito un AssociationId:
aws ec2 describe-addresses --output json |
jq -r '.Addresses[] | select(.AssociationId == null) | .PublicIp'
Se stampa indirizzi, rivedili prima del rilascio:
aws ec2 release-address --allocation-id eipalloc-0123456789abcdef0
Non inviare comandi di rilascio direttamente da una query di scoperta finché non hai controllato i risultati. Un breve passaggio di revisione è più economico che recuperare dalla cancellazione della risorsa sbagliata.
Quando Usare --query Invece
Usa --query di AWS CLI per proiezioni semplici perché viene eseguito prima della formattazione dell'output e mantiene il comando autonomo:
aws ec2 describe-instances \
--query 'Reservations[].Instances[].InstanceId' \
--output text
Ricorri a jq quando il risultato necessita di più trasformazioni, come valori di fallback, formattazione CSV, combinazione di campi o filtri più lunghi che sono più facili da leggere nella sintassi jq.
Conclusione
Usa --output json come punto di passaggio tra AWS CLI e jq. Quindi combina .[], select(), costruzione di oggetti, valori predefiniti // e output grezzo -r per trasformare grandi risposte AWS nei dati esatti di cui il tuo script o report ha bisogno.