IAM Identity Centerの所属するユーザー名とグループ名のリストをシェルスクリプトで抽出してみた

AWS CLIで取得した所属するユーザーとグループのリストをIDから名前に置き換えてCSVで出力するスクリプトを作ってみました
2022.09.26

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

みなさんこんにちは、杉金です。
少し前のアップデートで念願のAWS IAM Identity Center APIが更新されまして、ユーザーやグループの設定変更や情報取得できる範囲が拡張されました。グループに所属するユーザーやユーザーが所属するグループを取得できるようになったのですが、取得できる情報がIDであるため、IDを名前に置き換えてCSVで出力するスクリプトを作ってみました。

(2022/10/31更新)以下のブログで、Pythonを使って所属グループだけでなく、権限割り当て一覧も取得できます。ユーザーの棚卸しをしたい場合はこちらのブログが参考になります。

アップデート情報

以下のリンクがアップデート内容でして、この中の2つのAPIで所属ユーザーとグループの情報が取得できます。

  • ListGroupMembershipsForMember:対象ユーザーが所属するグループのリスト
  • ListGroupMemberships:対象グループに所属するユーザーのリスト

ユーザーとグループの作成、更新、削除については以下のブログが参考になります。

グループ名と所属するユーザー名の一覧

スクリプトを実行することで以下のようなリストが取得できます。左端がグループ名で横に所属するユーザー名がカンマ区切りで続きます。

group_name,user_name
group1,hijikata_toshizo,okita_soji
group2,nagakura_shinpachi,hijikata_toshizo
group3,hijikata_toshizo,saito_hajime
group4,saito_hajime,hijikata_toshizo
group9

group9のように、所属ユーザーがいないグループも取得できますので、使ってなさそうなグループの洗い出しに使えます。以下がシェルスクリプトのコードです。5〜10行目まではご自身の環境に応じて修正ください。

#!/bin/bash

export AWS_PAGER=""

# IAM Identity CenterのストアID
store_id="d-XXXXXX"
# IAM Identity Centerを利用しているリージョン 
region="ap-northeast-1" 
# 出力ファイル名
output_file=list-users-in-group.csv

userlist=$(aws identitystore list-users --identity-store-id ${store_id} --region ${region})
grouplist=$(aws identitystore list-groups --identity-store-id ${store_id} --region ${region} --query 'sort_by(Groups, &DisplayName)[].[GroupId,DisplayName]')
echo "group_name,user_name" > ${output_file}

for group in $(echo ${grouplist} | jq -r '.[] | .[0] + ":" + .[1]'); do
  output_line=${group#*:}

  for userid in $(aws identitystore list-group-memberships --identity-store-id $store_id --group-id ${group%:*} | jq -r '.[][] | .MemberId.UserId'); do
    username=$(echo $userlist | jq -r '.Users[] | select(.UserId == "'${userid}'" ) | .UserName')
    output_line=${output_line}","${username}
  done

  echo ${output_line} >> ${output_file}

done

ユーザー名と所属するグループ名の一覧

スクリプトを実行することで以下のようなリストが取得できます。左端がユーザー名で横に所属するグループ名がカンマ区切りで続きます。

user_name,group_name
hijikata_toshizo,group1,group3,group2,group4
ito_kashitaro
nagakura_shinpachi,group2
okita_soji,group1
saito_hajime,group4,group3

ito_kashitaroのように、グループに所属していないユーザーの洗い出しに使えます。以下がシェルスクリプトのコードです。5〜10行目まではご自身の環境に応じて修正ください。

#!/bin/bash

export AWS_PAGER=""

# IAM Identity CenterのストアID
store_id="d-XXXXXX"
# IAM Identity Centerを利用しているリージョン 
region="ap-northeast-1" 
# 出力ファイル名
output_file=list-groups-for-user.csv

userlist=$(aws identitystore list-users --identity-store-id ${store_id} --region ${region} --query 'sort_by(Users, &UserName)')
grouplist=$(aws identitystore list-groups --identity-store-id ${store_id} --region ${region})
echo "user_name,group_name" > $output_file

for userid in $(echo ${userlist} | jq -r '.[].UserId'); do
  output_line=$(echo ${userlist} | jq -r '.[] | select(.UserId == "'${userid}'" ) | .UserName')

  for groupid in $(aws identitystore list-group-memberships-for-member --identity-store-id ${store_id} --member-id "{ \"UserId\":\"${userid}\" }" --query 'GroupMemberships[*].GroupId' | jq -r '.[]'); do
    group_name=$(echo ${grouplist} | jq -r '.[][] | select(.GroupId == "'${groupid}'") | .DisplayName')
    output_line=${output_line}","${group_name}
  done

  echo ${output_line} >> ${output_file}

done

動作確認環境

$aws --version
aws-cli/2.7.31 Python/3.9.11 Darwin/21.6.0 exe/x86_64 prompt/off
$bash --version
GNU bash, バージョン 5.1.16(1)-release (aarch64-apple-darwin21.1.0)
$jq --version
jq-1.6

改善の余地あり

今回のスクリプトですが、改善の余地があります。

  • シェルスクリプトであるため、Windowsユーザーに優しくない
  • 所属するユーザーやグループの並びがランダム
  • アクセス許可セットと組み合わせて誰が何の権限を持っているかをリスト化したい
  • 表示名やメールアドレスなど表示するユーザー情報をカスタマイズできるようにしたい
  • 処理に少し時間がかかるので進捗状況を表したい

1点目は、PowerShell版を作るかPython版を作るか検討中です。2点目以降を考えるとPythonでユーティリティツールみたいなの作れるといいかもと思ってます。

最後に

改善点を盛り込んでから公開しようかと思いましたが、時間がかかりそうであるため一旦今のレベルで公開してみました。上記に挙げた改善点以外にもコード全体の構成などのより良くなりそうな要素は他にもあると思っていますので、アップグレードしてくれる方を歓迎します。jqの試行錯誤やスクリプト作成にとても助かったリンクを参考情報として記載します。

参考資料