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.