【AWS CLI】【初心者向け】--queryを何となく使いこなす

記事タイトルとURLをコピーする

こんにちは。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]のように記載する。

どなたかのお役に立てれば幸いです。

福島 和弥 (記事一覧)

2019/10 入社

AWS CLIが好きです。

AWS資格12冠。2023 Japan AWS Partner Ambassador/APN ALL AWS Certifications Engineer。