こんにちは。AWS CLIが好きな福島です。
はじめに
今回は、AWS CLIの「--query」オプションの書き方について、記載します。 私が初めてAWS CLIを使ったときは、json形式もよく分かっていなかったため、 「--query」の使い方に大変、苦戦しました。
ということで、初めてAWS CLIを触る方向けにブログを書きたいと思います。 今回は、タイトル通り、何となく使いこなせるを目指します。
--queryとは
AWS CLIの出力結果の表示項目を限定することができるオプションです。 また、--queryと似た感じの--filtersというオプションもあります。
違いは以下の通りです。
--query:表示するValueを限定する。
--filters:表示する要素を限定する。
例えば、以下のJsonがあったとします。
[
タナカ {
性別:男性,
年齢:22,
国籍:日本
},
マイケル{
性別:男性,
年齢:21,
国籍:アメリカ
},
キャサリン {
性別:女性,
年齢:24,
国籍:フランス
}
]
--queryを使うと、
全員の性別のみであったり、
[
タナカ {
性別:男性
},
マイケル{
性別:男性
},
キャサリン {
性別:女性
}
]
全員の年齢と国籍のみ出力することができます。
[
タナカ {
性別:男性,
国籍:日本
},
マイケル{
性別:男性,
国籍:アメリカ
},
キャサリン {
性別:女性,
国籍:フランス
}
]
--filtersを使うと、
タナカのみであったり、
[
タナカ {
性別:男性,
年齢:22,
国籍:日本
}
]
性別が男性のみを出力することができます。
[
タナカ {
性別:男性,
年齢:22,
国籍:日本
},
マイケル{
性別:男性,
年齢:21,
国籍:アメリカ
}
]
--queryの解説
では、本題に入っていきます。
今回は、「aws ec2 describe-instances」の結果を少し加工したものを基に「--query」を解説していきます。
パート1
まず、以下の出力結果があったとします。
{
"Reservations": [
{
"Instances": [
{
"InstanceId": "i-09c9cb3cb48c0c2b2",
"InstanceType": "t3a.micro",
"State": {
"Name": "stopped"
},
}
],
},
{
"Instances": [
{
"InstanceId": "i-06ca4c7f241e3666a",
"InstanceType": "t3a.micro",
"State": {
"Name": "stopped"
},
}
]
}
]
}
上記から、InstanceIdだけを取得したい場合、以下のように記載します。
aws ec2 describe-instances --query 'Reservations[].Instances[].InstanceId'
初見だとこれだけ見てもさっぱりかと思います。
そこでまずは、aws ec2 describe-instancesの出力結果の構造を何となく理解します。

上記の図を見ると、Reservations(赤枠)の中にInstances(青枠)が入っており、Instances(青枠)の中にInstnaceId(緑枠)が入っています。 これらをどうqueryで表すのか、4Stepで解説します。
Step1
1番外側の{}は無視します。Step2
ReservationsやInstancesの中身は、[]で囲まれています。
これらは、'Reservations[]'と'Instances[]'と表せます。Step3
'Reservations[]'と'Instances[]'の中は、さらに{}で囲まれています。
{}は、「.」と表せます。Step4
欲しい情報は、Instances[]の中の「InstanceId」になるので、
queryの構文は、以下の通りとなります。
--query 'Reservations[].Instances[].InstanceId'
ちなみに実行結果は、こうなります。
[ "i-09c9cb3cb48c0c2b2", "i-06ca4c7f241e3666a" ]
パート2
では、ここで問題です。
以下の情報を取得するためには、queryをどのように記載しますか。

答えは、こうです。
aws ec2 describe-instances --query 'Reservations[].Instances[].State.Name'
こう書いた人はいないでしょうか。(初めて使った私です。
--query 'Reservations[].Instances[].State[].Name'
Stateの部分に[]は不要なのがポイントです。
よく見ると分かりますが、Stateは、[]はなく、{}だけで囲まれています。

そのため、[]は不要という訳です。
パート3
続いては、InstanceIdとInstanceTypeが欲しい場合です。

答えは、こうです。
aws ec2 describe-instances \ --query 'Reservations[].Instances[].[InstanceId,InstanceType]'
複数の項目を指定する場合は、[]で囲み「,」で区切ります。
実行結果は、以下の通りです。
[
"i-09c9cb3cb48c0c2b2",
"t3a.micro"
],
[
"i-06ca4c7f241e3666a",
"t3a.micro"
],
まとめ
以下を覚えれば、--queryは何となく使いこなせます。
①1番外側の{}は無視する。
②[]と{}、どちらで囲まれているかを見極める。
③{}は、「.」と表せることを理解する。
④複数のValueを出力したい場合は、[InstanceId,InstanceType]のように記載する。
どなたかのお役に立てれば幸いです。