はじめに
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
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 {
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"
最後に
出力長いのなんとかしたいなぁというもやもやは解消できたので、あとは使い慣れていくだけ。