jqとcolumnでAWS CLIの出力を見やすく整形する

2017.03.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS CLIを使う上で、JSONパーサjqはとても強力です。

例えば「あるEC2インスタンスが含まれるELBは何と何か」を調べようと思ったら、

$ aws elb describe-load-balancers | \
    jq -c '.[][]
         | [.LoadBalancerName, .Instances[][]]'

こうして得られた一覧からgrepしてやれば良いですし、

["api-elb","i-2939xxxx","i-0387ba542xxxxyyyy"]
["local-elb","i-b983xxxx","i-e6d0xxxx","i-2939xxxx","i-9477xxxx"]
:

あるRDSパラメータグループを使っているRDSは何か」を調べようと思ったら、

$ aws rds describe-db-instances | \
    jq -c '.[][]
         | [.DBInstanceIdentifier,
            .DBParameterGroups[].DBParameterGroupName]'

としてやれば一覧が手に入ります。

["api-rdb01","db-rds-dbparamgroup01"]
["web-rdb01","default.mysql5.6"]
:

EC2インスタンスの名前(Nameタグ)の様に多少複雑な検索が必要なものも、

$ aws ec2 describe-instances | \
    jq -c '.[][].Instances[]
         | [.InstanceId,
            [.Tags[] | select(.Key == "Name").Value][],
            .InstanceType]'

jqだけで完結できます。

["i-e6ebxxxx","web-api02-test","t2.small"]
["i-0f8506c19a8c7xxxx","web009","m4.large"]
:

ただしこのままだと、 ご覧の通りJSONっぽいフォーマットのままなので、桁が揃っておらずちょっと見にくいです。

jqには CSV や TSV で出力するモードもあるので、そちらを使ってExcelなどに貼り付けるのも手ではありますが、ちょっと確認したいだけであればそれも冗長です。

表示の桁を揃えてくれる column コマンド

なんとかならないかと思って探してみたところ、columnというコマンドの存在を知りました。

column は、入力を複数カラムに分けて整形します。

調べたところ昔からあるコマンドだったのですが、浅学の身でまったく知りませんでした。OSXにも標準でインストールされていました。

せっかくなので早速使ってみます。

ELBとインスタンスIDの一覧:

$ aws elb describe-load-balancers | \
    jq -r '.[][]
         | [.LoadBalancerName, .Instances[][]]
         | @tsv' | \
    column -t
api-elb    i-2939xxxx  i-0387ba542xxxxyyyy
local-elb  i-b983xxxx  i-e6d0xxxx           i-2939xxxx  i-9477xxxx
:

RDSとRDSパラメータグループの一覧:

$ aws rds describe-db-instances | \
    jq -r '.[][]
         | [.DBInstanceIdentifier,
            .DBParameterGroups[].DBParameterGroupName]
         | @tsv' | \
    column -t
api-rdb01  db-rds-dbparamgroup01
web-rdb01  default.mysql5.6
:

インスタンスIDとインスタンス名、インスタンスタイプの一覧:

$ aws ec2 describe-instances | \
    jq -r '.[][].Instances[]
         | [.InstanceId,
            [.Tags[] | select(.Key == "Name").Value][],
            .InstanceType]
         | @tsv' | \
    column -t
i-e6ebxxxx           web-api02-test  t2.small
i-0f8506c19a8c7xxxx  web009          m4.large
:

うまい具合に縦の桁をそろえて表示してくれました。

実行にあたっては、

  • jqのオプションを-c(--compact-output) ではなく-r (--raw-output) にする
  • | @tsvをつける
  • パイプしてcolumn -tに渡す

といったところがポイントになります。

EC2インスタンスのPublicIpAddressのように、付いていたりいなかったりするものが途中のカラムにあると桁がずれてしまいます。そうなりそうな項目は後ろの方に回すなどの工夫をすると良いでしょう。

参考

jqについてはここでも何度も記事になっています。特に下記の記事は参考にさせてもらいました。

軽量JSONパーサー『jq』のドキュメント:『jq Manual』をざっくり日本語訳してみました

jqを活用してAPIレスポンス等から欲しい情報だけを抽出する【初級編】

ちなみに

以前下記のようなツールを作った記事を書いたのですが、

起動したEC2インスタンスの一覧を簡易表示するスクリプトが欲しい

同じことをjq+columnでやろうとするとこうなります。

こちらは前述の、空白のカラムが有ると表示が崩れる問題をケアしてみました。
@tsvの代わりに@csvを使い、columnではセパレータに,を使うようにしています。

ここまで複雑になると実用上どうなのという気はしますが、やっぱり、自作のスクリプトを使わずにすむ・メンテが行き届いた汎用コマンドが使えるというのはうれしいですね。