JQを使ったAWS CLI出力フィルタリングの習得:高度なテクニック
Amazon Web Services (AWS) Command Line Interface (CLI) を使用することは、クラウド自動化とインフラ管理の基本です。AWS CLIは強力なコマンドを提供しますが、そのデフォルトのJSON出力は、しばしば冗長でネストされており、直接スクリプトで使用したり人間が読み取ったりするには煩雑になることがあります。ここで、外部JSONプロセッサであるJQが不可欠なパートナーとなります。
このガイドでは、JQをAWS CLIと統合し、生のJSONレスポンスを正確にフィルタリング、フォーマット、および実用的なデータに変換する方法を深く掘り下げます。これらの高度なフィルタリングテクニックを習得することで、AWSエコシステム内での自動化スクリプトとリアルタイムデータ分析タスクの効率と堅牢性を大幅に向上させることができます。
効果的なフィルタリングのための前提条件
高度なフィルタリングに入る前に、必要なツールが正しくインストールされ、設定されていることを確認してください。JQはコマンドラインJSONプロセッサであり、AWS CLIとは別にインストールする必要があります。
1. JQのインストール
JQは通常、標準的なパッケージマネージャーを通じて利用できます。お使いのオペレーティングシステムに適したバージョンをインストールしてください:
- Linux (Debian/Ubuntu):
bash sudo apt update && sudo apt install jq - Linux (RHEL/Fedora):
bash sudo yum install jq # or dnf install jq - macOS (Homebrewを使用):
bash brew install jq
2. AWS CLI出力設定
JQが正しく機能するためには、AWS CLIに結果をJSON形式で出力するよう指示する必要があります。これは、--output または -o フラグを json に設定することで実現します。
aws ec2 describe-instances --output json
デフォルトでは、AWS CLIはシンプルなフィルタリングのために --query (JMESPathを使用) をよく使用します。しかし、JQは複雑な操作、構造変換、データ抽出において優れた柔軟性を提供するため、JMESPathの限界に達したときに理想的です。
JQの基本構文とパイプライニング
JQはJSON入力を受け取り、フィルタ式を適用することで動作します。出力はAWS CLIコマンドから直接パイプされます。
Identity Filter (.) とプリティプリント
最もシンプルなフィルタは、Identity演算子 (.) です。これは入力構造全体を、きれいにフォーマットされた(プリティプリントされた)状態で返します。
例:EC2インスタンスのプリティプリント
aws ec2 describe-instances --output json | jq '.'
トップレベルキーの選択
JSONレスポンス内の特定のトップレベルオブジェクトにアクセスするには、ドット表記を使用します。
出力構造が {"Reservations": [...], "OwnerId": "..."} の場合、Reservations配列のみを選択できます:
aws ec2 describe-instances --output json | jq '.Reservations'
高度なフィルタリングとイテレーション
JQの真の力は、AWSレスポンスで一般的なリソースの配列を扱うときに発揮されます。
配列のイテレーション (.[])
AWSコマンドがリスト(配列)を返す場合、.[] を使用して配列内の各項目を反復処理し、個別に処理できるようにします。
describe-instances の構造を考えてみましょう。メインの配列は Reservations です。各予約には Instances の配列が含まれています。
例:すべてのインスタンスからIDを抽出する
すべての予約にわたるすべてのインスタンスIDのリストを取得するには:
aws ec2 describe-instances --output json | jq '.Reservations[].Instances[].InstanceId'
特定の属性の選択
反復処理後、各オブジェクトから特定のフィールドを選択できます。上記のコマンドの出力は、それぞれ引用符で囲まれた文字列のリストを返します。
例:インスタンスIDと状態
インスタンスIDとその現在の状態コードを表示するには:
aws ec2 describe-instances --output json | jq '.Reservations[].Instances[] | {ID: .InstanceId, State: .State.Name}'
これはパイプ (|) 演算子を使用して、反復の結果を新しいオブジェクト構築 {...} に渡します。
条件に基づくフィルタリング (select())
select(condition) 関数は、SQLの WHERE 句と同様に、条件付きデータ取得に不可欠です。
例:実行中のインスタンスのみを検索する
State.Name が running と等しいインスタンスの配列をフィルタリングします。
aws ec2 describe-instances --output json | jq '.Reservations[].Instances[] | select(.State.Name == "running") | .InstanceId'
複雑なフィルタリングのヒント: 文字列をフィルタリングする場合、条件 ("running") で使用される文字列リテラルには二重引用符が必要であることに注意してください。
データのフォーマットと変換
単純な抽出にとどまらず、JQは後続のスクリプトやレポートへの統合を向上させるためにデータを再形成することを可能にします。
結果の配列を作成する
最終的な出力を個々の項目のストリームではなく、きれいなJSON配列にしたい場合は、式全体を角括弧 [...] で囲みます。
例:すべてのインスタンスIDのきれいなリスト
aws ec2 describe-instances --output json | jq '[.Reservations[].Instances[].InstanceId]'
カスタムオブジェクト(マップ)の作成
構造化された設定ファイルを作成したり、データをマッピングしたりするには、キーと値のペアを使用して新しいオブジェクトを構築します。これは、内部のAWS IDをより分かりやすい名前にマッピングするのに優れています。
例:インスタンスIDをタグ付けされた名前にマッピングする
これは、インスタンスに Name キーを持つタグがあることを前提としています。
aws ec2 describe-instances --output json | jq '.Reservations[].Instances[] | {ID: .InstanceId, Name: (.Tags[]? | select(.Key == "Name") | .Value)}'
オプションフィールドに関する注意:
(.Tags[]? | ...)とオプション演算子?の使用に注目してください。インスタンスにタグがない場合、これによりフィルタの失敗が防がれ、Nameフィールドには単にnullが返されます。
CSV/TSV形式での出力
スプレッドシートへのインポートに適したプレーンテキストレポートを生成するには、@csv または @tsv フォーマッタを使用できます。これには、必要なフィールドを正確な順序で配列として構築する必要があります。
例:インスタンスIDとタイプのCSV出力の生成
aws ec2 describe-instances --output json | jq -r '.Reservations[].Instances[] | [.InstanceId, .InstanceType] | @csv'
- ここでは、
-r(raw output) フラグが不可欠です。これにより、最終的なCSV文字列から囲む引用符が削除され、出力が真のプレーンテキストになります。
実践的な自動化の例:未アタッチのElastic IPの確認
この例は、一般的なインフラストラクチャのクリーンアップタスクを解決するために、イテレーション、フィルタリング、および選択を組み合わせる方法を示しています。
目標: 現在インスタンスに関連付けられていない(つまり、未アタッチの)すべてのElastic IPアドレスをリストする。
# 1. すべてのアロケーションを取得
# 2. 各アロケーションを反復処理
# 3. AssociationIdがnullのものだけを選択
# 4. PublicIpを抽出
aws ec2 describe-addresses --output json | \
jq -r '.Addresses[] | select(.AssociationId == null) | .PublicIp'
このコマンドがIPアドレスを返した場合、それらのリソースは解放の候補であり、コスト削減につながることが分かります。
まとめ
AWS CLIとJQの組み合わせは、クラウドデータを管理するための比類のないツールキットを提供します。AWS CLIの内蔵機能である --query はシンプルな検索には強力ですが、JQはイテレーション、複雑な条件ロジック (select)、および高度な自動化パイプラインで必要とされる深層データ変換のための表現力のある機能を提供します。これらのJQテクニック、特にイテレーション ([])、条件フィルタリング (select)、およびraw出力フォーマット (-r) を取り入れることで、かさばるJSONレスポンスを、スクリプトのニーズに正確に合わせた精密で実用的なデータに変換することができます。