AWS CLI の出力結果を整形する

# はじめに

AWS CLIを使う中で、「出力結果、今回はここまでいらないんだよな…」と思いつつ対応しませんでした。
夜中ですが、悔いが少し残っていたのでゆるーく試してみる。
結果的には、 `jq` コマンドまたは、 `--query` でgrepできますという話です。
（みなさんはきっとすでにご存知のはず…浅い人間で申し訳ないです）

## 達成したいこと

例えば、IAMユーザとユーザーグループを作成済みの状態とする。
AWS CLIで出力される結果から、欲しい情報だけ抜き取って表示したい。
`GroupName` だけをリストで表示させたりとかですね。

```shell
$ aws iam list-groups-for-user --user-name QiitaExecutionTerraformer
{
    "Groups": [
        {
            "Path": "/",
            "GroupName": "QiitaExecutionTerraformerGroup",
            "GroupId": "AGPAQZTTHPWT6US2TTDIT",
            "Arn": "arn:aws:iam::055002496423:group/QiitaExecutionTerraformerGroup",
            "CreateDate": "2021-03-03T16:01:50Z"
        },
        {
            "Path": "/",
            "GroupName": "MiscGroup",
            "GroupId": "AGPAQZTTHPWT73DH67YCF",
            "Arn": "arn:aws:iam::055002496423:group/MiscGroup",
            "CreateDate": "2021-03-03T16:01:50Z"
        }
    ]
}
```

## 環境

Mac OS X 10.14.1 x86_64

```shell
$ aws --version
aws-cli/1.18.110 Python/3.8.7 Darwin/20.2.0 botocore/1.17.33

$ terraform -version
Terraform v0.13.5
+ provider registry.terraform.io/hashicorp/aws v3.18.0
```


## 事前準備
以下のようなファイルを作成し、 `apply` しておく。

```shell
$ export AWS_ACCESS_KEY_ID=[アクセスキー]
$ export AWS_SECRET_ACCESS_KEY=[シークレットアクセスキー]
$ export AWS_DEFAULT_REGION=ap-northeast-1
$ aws sts get-caller-identity --query Account --output text

$ terraform init
$ terraform apply
```


```terraform:main.tf
resource "aws_iam_group" "qiita_terraformer" {
  name = "QiitaExecutionTerraformerGroup"
}

resource "aws_iam_group" "misc_terraformer" {
  name = "MiscGroup"
}

resource "aws_iam_user" "terraformer" {
  name = "QiitaExecutionTerraformer"

  tags = {
    Name = "qiita_example"
  }
}

resource "aws_iam_user_group_membership" "terraformer" {
  user = aws_iam_user.terraformer.name

  groups = [aws_iam_group.qiita_terraformer.name, aws_iam_group.misc_terraformer.name]
}
```

```terraform:versions.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "3.18.0"
    }
  }
  required_version = "0.13.5"
}
```

## grepの方法

ほんの少ししか調べてませんが、２つのやり方があります。
他にもたくさんの選択肢があるでしょう。 

* AWS CLI で `--query` オプションを使う
* `jq` コマンドを使う

それぞれ使っていきます。

### AWS CLI で `--query` オプションを使う

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

#### keyを指定して、valueのみを出力する

```shell
$ aws iam list-groups-for-user --user-name QiitaExecutionTerraformer --query 'Groups[].GroupName'
[
    "QiitaExecutionTerraformerGroup",
    "MiscGroup"
]
```

#### 出力するkey名を指定する

`--query` では、keyを任意の値に設定できるので、簡潔なキーの名前にすることもできるみたいです。

```shell
$ aws iam list-groups-for-user --user-name QiitaExecutionTerraformer --query 'Groups[].{name:GroupName}'
[
    {
        "name": "QiitaExecutionTerraformerGroup"
    },
    {
        "name": "MiscGroup"
    }
]
```


### `jq` コマンドを使う

AWS CLIの出力形式のデフォルトは、JSONです。なので、 `jq` コマンドでgrep可能です。

> AWS CLI は、次の 4 つの出力形式をサポートしています。
・json – JSON 文字列形式で出力されます。
・yaml – YAML 文字列形式で出力されます。（AWS CLI バージョン 2 でのみ利用できます。）
・yaml-stream – 出力はストリーミングされ、YAML 文字列としてフォーマットされます。ストリーミングにより、大きなデータ型の処理を高速化できます。（AWS CLI バージョン 2 でのみ利用できます。）
・text – 複数行のタブ区切り文字列値の形式で出力されます。これは、grep、sed、または awk などのテキストプロセッサに出力を渡すのに役立ちます。
・table – セルの罫線を形成する文字列 +|- を使用して表形式で出力されます。通常、情報は他の形式よりも読みやすい「わかりやすい」形式で表示されますが、プログラムとしては役立ちません。

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

（出力形式は５つに見えますが…）

JSONということで、 key, valueで絞れることが確認できればいいです。
`jq` コマンドを自分で考えて実行するのは初めてだったりします…。

#### keyを指定する

```shell
$ aws iam list-groups-for-user --user-name QiitaExecutionTerraformer | jq ".[][].GroupName"
"QiitaExecutionTerraformerGroup"
"MiscGroup"
```

#### valueを指定する

```shell
$ aws iam list-groups-for-user --user-name QiitaExecutionTerraformer | jq '.[][] | select(.GroupName | contains("Qiita"))'
{
  "Path": "/",
  "GroupName": "QiitaExecutionTerraformerGroup",
  "GroupId": "AGPAQZTTHPWT6US2TTDIT",
  "Arn": "arn:aws:iam::055002496423:group/QiitaExecutionTerraformerGroup",
  "CreateDate": "2021-03-03T16:01:50Z"
}
```

部分一致かつ出力するvalueを指定したものはこんな感じ。

```shell
$ aws iam list-groups-for-user --user-name QiitaExecutionTerraformer | jq '.[][] | select(.GroupName | contains("Qiita")) | .GroupName'
"QiitaExecutionTerraformerGroup"
```

## 最後に

出力長いのなんとかしたいなぁというもやもやは解消できたので、あとは使い慣れていくだけ。