この記事で分かること
- jqについて
- jqの導入について
はじめに
JSONはAWS CLIのデフォルトの出力形式です。また、YAMLと同じく、AWSにおいて設定ファイルに多用される記述形式となります。しかし、普段我々が見ているJSONは人間が読みやすいように、改行やインデント整理されたもので、JSONの記述ルールに沿っていれば「1行」でも問題はありません。1行で出力されるその最たる例がCloudTrailのログかと思います。そこで今回JSON形式のCloudTrailログを例に、読みやすいように整形してくれるツールを紹介します。
jqについて
jqは、JSONデータをLinuxのコマンドで言うところのsedやgrep、awkのようにデータ抽出、変換、集計をするコマンドラインツールです。
早速ですが、以下がCloudTrailの生データです。(塗りつぶしはアカウントID)

JSON形式で出力されるのですが、なんとびっくり、1行5362桁となっております。上記画像のログを取得したときは、ほとんど操作をしない状態でした。それでこの出力結果ですから、AWSをがっつり使っているときには何倍ものサイズ(桁数?)になっていると思われます。
さて、言うまでもなく、このままでは視認性が極端に低いので整形をします。先に整形結果をお見せすると以下のようになります。

JSONの整形方法
「JSON」「整形」で調べればいくらでも出てきます。ログをWindowsで確認する前提で記載していますが、方法としては以下がメジャー(?)なのかなと思います。
①ブラウザでのツール利用
②sakuraエディタへのマクロ登録
③jqコマンド導入によるコマンドプロンプト等での表示
①は、ブラウザにログをコピペして整形して出力してもらう、というものです。個人利用においては有用だと思いますが、業務利用は情報セキュリティが厳しいこのご時世難しいと思います。監視ソフトによっては、ブラウザにコピペしただけで、情報の社外流出として検知される可能性もあるので、安易に実行することはおススメしません。
②は、sakuraエディタにマクロを登録しておくことで、整形して表示してくれるというものです。マクロはJava Scriptで記述できるので、慣れている方はインターネット上で調べながらパパっと作れるかと思います(サンプルマクロもたくさん出てきます)。ただ、sakuraエディタの利用が前提なので今回の記事では割愛させていただきます。
③を今回は紹介したいと思います。ログを調べるPCがWindows前提での記事となりますが、Linuxも勘所は同じになります。
jqの導入
exeファイルのダウンロード
こちらのサイトより、jqをダウンロードします。(今回はWindows版をDL)

ファイルの配置とリネーム
ダウンロードしたファイルを「C:\Windows\System32」(※)に配置します。exeファイルを「jq.exe」へリネームします。この「〇〇.exe」の〇〇の部分をコマンドで使用します。そのため「jq」というプログラムですので、「jq.exe」とします。
※普通は環境変数がデフォルトで設定されているため「system32」にさえ配置すれば動くはずです。(「jq」と打ち込むだけで、環境変数内であれば「System32にある jq.exeだ!」とPCが探しに行ってくれます)
System32以外に配置する場合(環境変数に未設定の場所に配置する場合)は、環境変数のパスを通す必要がありますが、ここでは割愛します。
↓System32に配置しリネームしたファイル↓

動作確認
コマンドプロンプトを立ち上げます。(お好きな方法で。お勧めはWindowsキー + R ⇒ cmd)
「jq」と入力後、Enterを押して以下のような出力を得られれば、jqの導入完了。

リネームをしていない場合、リネームしていないファイル名を入力してEnterをすれば同様の結果が得られます。
それにしても、versionが1.7-dirtyなのだが、どういう意味があるのだろうか。試用版?ベータ版的な・・?
使い方(基礎の基礎)
jqのコマンドについては、長くなるので別記事に纏めるとして、jqの使い方の基礎中の基礎を紹介します。
使い方としては、「JSON出力」をパイプで渡してjq(=jq.exe)で再度出力させるだけなんですが、これで通じる方はサラッと読むだけでいいかと思います。(STEP2を実行するだけでOKです)
今回やりたいことをイメージにすると以下のような図になります。

先に説明しておくこととして、一つ目は、「jq」はフィルターです。今回の場合は、JSON形式に記述された読みづらいファイルをjqに渡せば、整形された読みやすいJSONを出力してくれる、というものです。
二つ目に、パイプは「受け取った出力を入力として、次コマンドへ渡す」という説明が多くされるように思います。
「 | 」はキーボードの右上(¥と一緒のことが多い?)にあり、shiftを押しながら入力すれば表示されることが多いと思います。もし、キーボードにパイプが見当たらなければ「たてぼう」と入力し、半角の縦棒を選択すれば、それがパイプです。
以下パイプの出し方

JSONの出力
CloudTrailログを用意します。そのファイルに対し、Shiftを押しながら右クリックし、「パスのコピー」を選択します。

コマンドプロンプトを立ち上げ、「type 」(type+スペース)を入力し、右クリックして先ほどコピーしたパスを貼り付けます。

Enterをクリックし、以下のような出力結果であればコマンド成功です。(塗りつぶしはアカウントID)

typeは指定したファイルを単純出力するコマンドです。Linuxでいうところの「cat」と同じです。これで、typeコマンドの出力として「JSON形式」のテキストが出力されたことになります。
| jq で整形
今度は、STEP1で実行したtypeコマンドの後ろに「|jq」を追加し実行します。以下のような結果が得られれば、jqによる整形が成功です。

typeコマンドにより出力されたJSON形式のテキストデータを受け取り、それを「jq」に渡す。
なお、「|」の前後に半角スペースは在っても無くても問題はありません。(上記画像は、「|」前後に半角スペースはありません)
さいごに
jqの導入と基本的な使い方を記事に纏めました。jqはフィルターと言いましたが、要はデータベースのSQLみたいなものですね。というよりも、JSON Queryの略なのかな。調べても出てこなかったのですが。。jqの真骨頂は、JSONデータから欲しい情報のみを抜き出す使い方ですので、それは別記事に纏めたいと思います。
補足
exeファイルのダウンロードの際に記載した公式サイトは実は以下に記載されています。
