IAM認証情報レポートに権限の詳細がないのでCLIで全部吐かせる

`{ユーザー名}.txt`のような形でユーザー数分のテキストファイルが出るようになれば、対外的に適切なユーザー管理している資料として十分なので、作成しました。

```bash:s3user.txt
-----------------------------------------------------------
|                         GetUser                         |
+---------------------------------------------------------+
||                         User                          ||
|+-------------+-----------------------------------------+|
||  Arn        |  arn:aws:iam::123456789012:user/s3user  ||
||  CreateDate |  2018-01-01T20:00:00+00:00              ||
||  Path       |  /                                      ||
||  UserId     |  ABCDEFGHIJKLMNOYQRSTU                  ||
||  UserName   |  s3user                                 ||
|+-------------+-----------------------------------------+|
------------------
|ListUserPolicies|
+----------------+
------------------------------------------------------------------------
|                       ListAttachedUserPolicies                       |
+----------------------------------------------------------------------+
||                          AttachedPolicies                          ||
|+---------------------------------------------+----------------------+|
||                  PolicyArn                  |     PolicyName       ||
|+---------------------------------------------+----------------------+|
||  arn:aws:iam::aws:policy/AmazonS3FullAccess |  AmazonS3FullAccess  ||
|+---------------------------------------------+----------------------+|
----------------------------------
|        GetPolicyVersion        |
+--------+----------+------------+
| Action | Effect   | Resource   |
+--------+----------+------------+
|  s3:*  |  Allow   |  *         |
+--------+----------+------------+
-------------------
|ListGroupsForUser|
+-----------------+

```

簡単かと思いきや、権限がユーザーグループ経由かユーザー直アタッチの場合分けと、更に`list-attached-user-policies`と`list-user-policies`から両方取る必要があり、かつその後のパーミッション詳細のとり方まで違い、多くのコマンドが必要になってしまいました。

上記の一人分を出すために以下のスクリプトを作りました。

```bash:one.sh
#!/bin/bash
set -e
if [[ -z "${USERNAME}" ]]; then
  USERNAME=$(aws iam get-user --query 'User.UserName' --output text)
fi

aws iam get-user --user-name $USERNAME --output table
aws iam list-user-policies --user-name $USERNAME --output table
for POLICY_NAME in $(aws iam list-user-policies --user-name $USERNAME --query "PolicyNames" --output text) ; do
  aws iam get-user-policy --user-name $USERNAME --policy-name $POLICY_NAME --output table
done
aws iam list-attached-user-policies --user-name $USERNAME --output table
for POLICY_ARN in $(aws iam list-attached-user-policies --user-name $USERNAME --query "AttachedPolicies[].PolicyArn" --output text) ; do
  VERSION=$(aws iam get-policy --policy-arn $POLICY_ARN --output json --output text --query "Policy.DefaultVersionId")
  aws iam get-policy-version --version-id $VERSION --policy-arn $POLICY_ARN --query "PolicyVersion.Document.Statement" --output table
done

aws iam list-groups-for-user --user-name $USERNAME --output table
for GROUP in $(aws iam list-groups-for-user --user-name $USERNAME --output text --query "Groups[].GroupName") ; do
  aws iam list-group-policies --output table --group-name $GROUP --output table
  for POLICY_NAME in $(aws iam list-group-policies --output table --group-name $GROUP --query "PolicyNames" --output text) ; do
    aws iam get-group-policy --group-name $GROUP --policy-name $POLICY_NAME --output table
  done
  aws iam list-attached-group-policies --output table --group-name $GROUP;
  for POLICY_ARN in $(aws iam list-attached-group-policies --group-name $GROUP --query "AttachedPolicies[].PolicyArn" --output text) ; do
    VERSION=$(aws iam get-policy --policy-arn $POLICY_ARN --output json --output text --query "Policy.DefaultVersionId")
    aws iam get-policy-version --version-id $VERSION --policy-arn $POLICY_ARN --query "PolicyVersion.Document.Statement" --output table
  done
done
```

使い方はそのままです。

```bash
sh one.sh # 引数無しで自身のパーミッション詳細をとる
USERNAME=s3user sh one.sh # ユーザーは引数USERNAMEで指定する
```

`one.sh`を全ユーザーまわして取得する`all.sh`を作りました。フォルダ`output`を作成し中にファイルを吐きます。

```bash
mkdir output;
aws iam list-users |  jq '.Users[].UserName' | xargs -I% sh -c 'USERNAME=% sh one.sh | tee ./output/%.txt'
```

工数が多くなればなるほど車輪の再開発をしてる気がしたのですが、他にやり方ないでしょうか。Githubで似たプロジェクトをいくつか見つけたものも、star数百程度でベストプラクティスとして普及しているレベルのものは見つからずでした。どなたか教えてくだされば幸いです。

レポジトリはこちらです。
https://github.com/umihico/iam-user-permissions-viwer