こんにちは。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]
のように記載する。
どなたかのお役に立てれば幸いです。