- 公開日
- 最終更新日
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ファイルに対して強力です。
改行を補ってきれいに出力してくれます。

指定したキーの出力
以下のように指定することで、特定のキーを取得することができます。
cat vpc.json | jq .Vpcs[].CidrBlockAssociationSet[].CidrBlock

jsonファイルの構造図

配列を使ったキーの出力
以下のように配列を使ってキーを出力することもできます。
cat vpc.json | jq .Vpcs[].Tags[0]
jsonファイルの構造図

配列?要素?
以下のコマンドを実行してみます。
cat vpc.json | jq '.Vpcs[] | .Tags'

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

少し分かりにくいですが、一回目のコマンドは配列として出力され、二回目のコマンドは要素として出力されています。
違いはコマンド末尾の[](ブラケット)があるかどうかとなります。
ブラケットをつけることで配列の要素を出力してくれます。
条件付き抽出
jqにはselectという組み込み関数があります。
これを使うことで、条件に一致したキーを持つデータを出力することができます。
以下のコマンドは、Nameタグが「my-vpc」となるvpcの情報を取得します。
cat vpc.json | jq '.Vpcs[] | select(.Tags[]? | .Key=="Name" and .Value=="my-vpc") '

コマンドの動作としては以下のようになります。
- Vpcs内の要素を取り出す
- Tags内の要素を取り出す
- 取り出した要素に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 '

出力結果の整形
-rオプションをつけることで、出力結果からダブルクォート(")を取り除くことができます。
cat vpc.json | jq -r '.Vpcs[] | select(.Tags[]? | .Key=="Name" and .Value=="my-vpc") | .VpcId '

出力結果にキーを付与することもできます。
cat vpc.json | jq -r '.Vpcs[] | select(.Tags[]? | .Key=="Name" and .Value=="my-vpc") |{VPCID: .VpcId }'

まとめ
始めは何が行われているのかが分からなかったですが、一つずつ挙動を確認することで、selectの挙動まで理解することができてよかったです。
jqhには他にもさまざまな機能があるため、引き続き学んでいきたいです。
この記事は私が書きました
山内 宏紀
記事一覧CloudFormationが好きです。 使っているギターはSGです。