LoginSignup
1
1

More than 3 years have passed since last update.

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

Posted at

はじめに

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

達成したいこと

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

$ 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

$ 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 しておく。

$ 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
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]
}
versions.tf
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "3.18.0"
    }
  }
  required_version = "0.13.5"
}

grepの方法

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

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

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

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

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

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

出力するkey名を指定する

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

$ 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 – セルの罫線を形成する文字列 +|- を使用して表形式で出力されます。通常、情報は他の形式よりも読みやすい「わかりやすい」形式で表示されますが、プログラムとしては役立ちません。

(出力形式は5つに見えますが…)

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

keyを指定する

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

valueを指定する

$ 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を指定したものはこんな感じ。

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

最後に

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1