ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

AWS CLIに欠かせないjqを学んでみる

この記事を共有する

目次

皆さんこんにちは!
本年度中に20本ブログを書くと宣言していたのにも関わらず、3月までさぼってしまった山内です、、
今回はAWS CLIに欠かせないjqについてちゃんと学んでみようと思い、理解した内容の備忘録としてブログを執筆しました。

jqとは

jsonファイルの抽出、加工、整形ができるコマンドラインツールとなります。
AWS CLIの結果はjson形式で出力できるため、jqコマンドを使うときれいに整形ができます。

jqの操作

今回は以下のjsonファイルを使います。
2つのVPCの情報が格納されています。

ここを押すと展開します


{
    "Vpcs": [
        {
            "OwnerId": "xxxxxxxxxx",
            "InstanceTenancy": "default",
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-xxxxxxxxxx",
                    "CidrBlock": "10.100.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ],
            "IsDefault": false,
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "my-vpc"
                },
                {
                    "Key": "aws:cloudformation:logical-id",
                    "Value": "VPC"
                },
                {
                    "Key": "aws:cloudformation:stack-name",
                    "Value": "my-veri-stack-VPC-xxxxxxxxxx"
                },
                {
                    "Key": "aws:cloudformation:stack-id",
                    "Value": "arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxx:stack/my-veri-stack-VPC-xxxxxxxxxx"
                }
            ],
            "BlockPublicAccessStates": {
                "InternetGatewayBlockMode": "off"
            },
            "VpcId": "vpc-xxxxxxxxxx",
            "State": "available",
            "CidrBlock": "10.100.0.0/16",
            "DhcpOptionsId": "dopt-xxxxxxxxxx"
        },
        {
            "OwnerId": "xxxxxxxxxx",
            "InstanceTenancy": "default",
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-xxxxxxxxxx",
                    "CidrBlock": "10.150.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ],
            "IsDefault": false,
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "second-vpc"
                },
                {
                    "Key": "aws:cloudformation:logical-id",
                    "Value": "VPC"
                },
                {
                    "Key": "aws:cloudformation:stack-name",
                    "Value": "my-second-stack-VPC-xxxxxxxxxx"
                },
                {
                    "Key": "aws:cloudformation:stack-id",
                    "Value": "arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxx:stack/my-veri-stack-VPC-xxxxxxxxxx"
                }
            ],
            "BlockPublicAccessStates": {
                "InternetGatewayBlockMode": "off"
            },
            "VpcId": "vpc-xxxxxxxxxx",
            "State": "available",
            "CidrBlock": "10.150.0.0/16",
            "DhcpOptionsId": "dopt-xxxxxxxxxx"
        }
    ]
}

jsonファイルを開く

以下のコマンドを実行することで、jsonファイルをjqに渡して開くことができます。

cat vpc.json | jq .

このコマンドは改行がないjsonファイルに対して強力です。
改行を補ってきれいに出力してくれます。
01.png

指定したキーの出力

以下のように指定することで、特定のキーを取得することができます。

cat vpc.json | jq  .Vpcs[].CidrBlockAssociationSet[].CidrBlock

03.png

jsonファイルの構造図 02.png

配列を使ったキーの出力

以下のように配列を使ってキーを出力することもできます。

cat vpc.json | jq  .Vpcs[].Tags[0]

04.png jsonファイルの構造図 05.png

配列?要素?

以下のコマンドを実行してみます。

cat vpc.json | jq '.Vpcs[] | .Tags'

07.png

cat vpc.json | jq '.Vpcs[] | .Tags[]'

08.png

少し分かりにくいですが、一回目のコマンドは配列として出力され、二回目のコマンドは要素として出力されています。
違いはコマンド末尾の[](ブラケット)があるかどうかとなります。
ブラケットをつけることで配列の要素を出力してくれます。

条件付き抽出

jqにはselectという組み込み関数があります。
これを使うことで、条件に一致したキーを持つデータを出力することができます。
以下のコマンドは、Nameタグが「my-vpc」となるvpcの情報を取得します。

cat vpc.json | jq  '.Vpcs[] | select(.Tags[]? | .Key=="Name" and .Value=="my-vpc") '

06.png

コマンドの動作としては以下のようになります。

  1. Vpcs内の要素を取り出す
  2. Tags内の要素を取り出す
  3. 取り出した要素にKeyがName、Valueがmy-vpcがあるかどうかをselectで選択し出力

また、次のコマンドを実行することで、Nameタグが「my-vpc」となるvpcのVPC IDを取得できます。

cat vpc.json | jq  '.Vpcs[] | select(.Tags[]? | .Key=="Name" and .Value=="my-vpc") | .VpcId '

09.png

出力結果の整形

-rオプションをつけることで、出力結果からダブルクォート(")を取り除くことができます。

cat vpc.json | jq -r '.Vpcs[] | select(.Tags[]? | .Key=="Name" and .Value=="my-vpc") | .VpcId '

10.png

出力結果にキーを付与することもできます。

cat vpc.json | jq -r '.Vpcs[] | select(.Tags[]? | .Key=="Name" and .Value=="my-vpc") |{VPCID: .VpcId }'

11.png

まとめ

始めは何が行われているのかが分からなかったですが、一つずつ挙動を確認することで、selectの挙動まで理解することができてよかったです。
jqhには他にもさまざまな機能があるため、引き続き学んでいきたいです。

この記事は私が書きました

山内 宏紀

記事一覧

CloudFormationが好きです。 使っているギターはSGです。

山内 宏紀

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。