AWS CLI jq を使ってJSONを見やすくする

  • 2019.10.15
  • AWS
AWS CLI jq を使ってJSONを見やすくする

はじめに

前回、AWS CLIをはじめたのですが、操作や表示など若干見にくい部分があるので、あれこれ格闘中です。

まずは、AWS CLIの長いコマンドを全て打つのが非常に面倒だったため、タブキーによる補完を有効にしました。

こちらはaws_complete へのパスは通っていたので、そのまま次のコマンドを流すだけで有効になりました。

complete -C '/usr/local/aws/bin/aws_completer' aws

これで入力は少し楽になったのですが、大量に吐かれるJSONを見るのが結構大変です。

今回はこのJSONを見やすく加工するための jq について実際にさわってみたいと思います。

jqのインストール

私の場合はMacOS Mojaveでやっていますので、次のコマンドでインストールできます。

brew install jq

jqを使ってみる

subnet一覧の表示

$ aws ec2 describe-subnets | jq .

これで subnet 一覧の表示はできますが、jq を使ったところで特に代わり映えはありません。括弧のフォントが太くなったり、キー名の色が変わったりとその程度です。

subnet一覧の特定の項目のみ表示

$ aws ec2 describe-subnets | jq '.Subnets[] | {AvailabilityZone: .AvailabilityZone, CidrBlock: .CidrBlock}' 

これで特定の項目のみ絞り込むことができます。今回は AvailabilityZoneとCidrBlockのみ表示しました。次のような表示になります。

{
  "AvailabilityZone": "ap-northeast-1c",
  "CidrBlock": "192.168.1.0/24"
}
{
  "AvailabilityZone": "ap-northeast-1a",
  "CidrBlock": "172.31.48.0/20"
}

〜(以下省略)〜

Subnet一覧をCidrBlockで絞り込み

$ aws ec2 describe-subnets | jq '.Subnets[] | select(.CidrBlock == "192.168.1.0/24")'

これで一つのCidrBlockで絞り込むことができます。ですが、ワイルドカードで指定したいこともあると思います。そんなときは次の方法で指定します。

Subnet一覧をCidrBlockのワイルドカード指定で絞り込み

$ aws ec2 describe-subnets | jq '.Subnets[] | select(.CidrBlock | test("192.168.*"))'

とりあえず、この程度でことは足りそうです。いまのところ。

CLIのオプションを使って指定

AWS CLIのオプションにも同等な機能がありました。

$ aws ec2 describe-subnets --filters "Name=cidr-block,Values=192.168.*" --query "Subnets[*].[AvailabilityZone,CidrBlock]"

どっちが簡単なんだろう。テーブル形式で表示できたりもするので、CLIオプションをそのまま使った方が良いのか迷うところですね。

$ aws ec2 describe-subnets --filters "Name=cidr-block,Values=192.168.*" --query "Subnets[*].{AvailabilityZone:AvailabilityZone,CidrBlock:CidrBlock}" --output table

こんな風にもできますし。

----------------------------------------
|            DescribeSubnets           |
+-------------------+------------------+
| AvailabilityZone  |    CidrBlock     |
+-------------------+------------------+
|  ap-northeast-1c  |  192.168.1.0/24  |
|  ap-northeast-1a  |  192.168.0.0/24  |
+-------------------+------------------+