AWS CLIのqueryの使い方（基本）

# はじめに

前回、AWS CLIの--filtersの使い方を勉強したので、その流れで--queryの使い方を調べました。

新卒で入った現場がAIXの運用保守（たまに構築）だったということもあってCLIを使っているということもあるので、今後はCLIを使いこなせるようになろうと思っています。

※前回
https://qiita.com/kkino1985/items/6e92e87e01f40bc06d8b

# 環境情報

OS : Windows10
CLI : aws-cli/1.17.9 Python/3.7.4 Windows/10 botocore/1.14.9


# --filtersと--queryの違い（使い分け）

ざっくり言うと、指定した条件と一致する（またはしない）リソースを表示させるのが--filters、出力結果のうちどの項目を（何という名前で）出力させるかを制御するのが--queryです。

（こちらの記事にもっと良い表現がありました）

https://dev.classmethod.jp/cloud/aws/aws-cli-filter-and-query-howto/

>条件に合致した結果だけを出力するのがフィルターの役割なら、出力する項目を絞り込むのがクエリーです。SQLでいうと「フィルター＝WHERE句」「クエリー＝SELECT句」です。

# やりたいこと

今回はEC2のインスタンス一覧の中から、インスタンスID（InstanceId)とインスタンスタイプ（InstanceType）を抜き出そうと思います。

    aws ec2 describe-instances

    {
        "Reservations": [
            {
                "Groups": [],
                "Instances": [
                    {
                        "AmiLaunchIndex": 0,
                        "ImageId": "ami-068a6cefc24c301d2",
                        "InstanceId": "i-014721086e955343f",
                        "InstanceType": "t2.micro",
                        "KeyName": "hashi-vagrant-test",
                        "LaunchTime": "2020-01-28T08:58:49.000Z",
    （中略）
            },
            {
                "Groups": [],
                "Instances": [
                    {
                        "AmiLaunchIndex": 0,
                        "ImageId": "ami-0f9af249e7fa6f61b",
                        "InstanceId": "i-07b9f379ba833a69c",
                        "InstanceType": "t2.micro",
                        "KeyName": "ubuntu-key",
                        "LaunchTime": "2020-01-16T11:53:32.000Z",
    （以下省略）


# 構文

## 事前知識

--queryを実行するにあたり意識しなければならないのが、出力情報の構造です。
今回の例で言うと、describe-instancesコマンドは「Reservations＞Groups,Instances＞AmiLaunchIndex（他）」という階層構造になっており、出力させたい項目をそれぞれ記載してあげる必要があります。

階層構造は公式リファレンスに記載されていますが、コマンドを実行して確認しても良いです。

https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-instances.html#output

以下、わかりやすいように上の階層から順に表示させていきたいと思います。

## 第一階層

まずは一番上（Reservations）を指定します。
子要素が複数ある階層は`[*]`を指定し、全部の要素が表示できるようにします。

尚、--filtersの時とは異なり、こちらはコマンドで出力される項目名をそのまま使えます。

### コマンド（1回目）

    aws ec2 describe-instances --query "Reservations[*]"

### 出力結果（1回目）

    [
        {
            "Groups": [],
            "Instances": [
                {
                    "AmiLaunchIndex": 0,
                    "ImageId": "ami-068a6cefc24c301d2",
                    "InstanceId": "i-014721086e955343f",
                    "InstanceType": "t2.micro",
    （以下省略）

## 第二階層

最終的にInstansIdとInstanceTypeまで行きたいので、次はInstancesを表示させます。
Reservationsと同様、`[*]`も忘れずに。

### コマンド（2回目）

    aws ec2 describe-instances --query "Reservations[*].Instances[*]"

### 出力結果（2回目）

    [
        [
            {
                "AmiLaunchIndex": 0,
                "ImageId": "ami-068a6cefc24c301d2",
                "InstanceId": "i-014721086e955343f",
                "InstanceType": "t2.micro",
    （以下省略）

## 第三階層

下記のように、`{(任意の項目名):(抽出したい項目名)}`で表示させたい項目を指定します。

### コマンド（3回目）

    aws ec2 describe-instances --query "Reservations[*].Instances[*].{ID:InstanceId,TYPE:InstanceType}"

### 出力結果（3回目）

    [
        [
            {
                "ID": "i-014721086e955343f",
                "TYPE": "t2.micro"
            }
        ],
        [
            {
                "ID": "i-07b9f379ba833a69c",
                "TYPE": "t2.micro"
            }
        ]
    ]

無事、インスタンスIDとインスタンスタイプが取得できました。


# おわりに

今回は本当に初歩的な使い方だけでしたが、実際には--filtersと組み合わせたりと色々な使い方があるので、少しずつでも覚えていくようにしたいと思います。

# 参考URL

https://yomon.hatenablog.com/entry/2017/09/07/084643

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-usage-output.html