AWS CLI を用いて IAM ユーザーのパス名を一括変更してみた
IAM ユーザーのパスは AWS CLI により変更できます。複数の IAM ユーザーが存在する環境において、複数ユーザーのパスを一括変更したいことがあったため、まとめて変更できるコマンドを検討しました。備忘録も兼ねてブログにします。
IAM ユーザーのパスを一括変更するコマンド
次の 3 つのシチュエーションに分けて、コマンドを検討しています。例外処理は入れていないシンプルな内容となる点はご留意ください。
- すべての IAM ユーザーのパスを指定した値に変更
- 任意の複数 IAM ユーザーのパスを指定した値に変更
- 特定のパスを持つすべての IAM ユーザーのパスを指定した値に変更
「すべての IAM ユーザーのパスを指定した値に変更」するコマンド例です。新しいパスとして NEW_PATH
で指定した値を設定します。
NEW_PATH="/new/path/"
aws iam list-users --query Users[].[UserName] --output text \
| while read user; do
echo "## IAM User name : ${user}"
aws iam update-user --user-name ${user} --new-path ${NEW_PATH}
echo "Update path to \"${NEW_PATH}\""
done
次に「任意の複数 IAM ユーザーのパスを指定した値に変更」するコマンド例です。IAM ユーザーを列挙したファイルを読み込んで実行します。
NEW_PATH="/new/path/"
USER_LIST_FILE="users.txt"
while read user; do
echo "## IAM User name : ${user}"
aws iam update-user --user-name ${user} --new-path ${NEW_PATH}
echo "Update path to \"${NEW_PATH}\""
done < ${USER_LIST_FILE}
読み込むテキストファイルは改行区切りで用意します。例外処理は入れていないので、最後の IAM ユーザーの後に改行がある場合はエラーが発生します。上記のコマンドのまま実行する場合のファイル名は users.txt
です。
ima-user-name-001
ima-user-name-002
ima-user-name-003
ima-user-name-004
最後に「特定のパスを持つすべての IAM ユーザーのパスを指定した値に変更」するコマンド例です。OLD_PATH
で指定したパスを持つすべての IAM ユーザーのパスを NEW_PATH
に変更します。
OLD_PATH="/old/path/"
NEW_PATH="/new/path/"
aws iam list-users --path ${OLD_PATH} --query Users[].[UserName] --output text \
| while read user; do
echo "## IAM User name : ${user}"
aws iam update-user --user-name ${user} --new-path ${NEW_PATH}
echo "Update path from \"${OLD_PATH}\" to \"${NEW_PATH}\""
done
コマンドの実行内容と実行結果例
上述した IAM ユーザーのパスを一括変更するコマンドの実行内容と実行結果例を記載します。
実行前のテストデータとして次の 6 つの IAM ユーザーを用意して、それぞれコマンドを実行します。各コマンドの実行前に下記の状態に戻してから実行しています。
すべての IAM ユーザーのパスを指定した値に変更
「すべての IAM ユーザーのパスを指定した値に変更」するコマンドでは、新しいパスとして NEW_PATH
で指定した値を設定します。
NEW_PATH="/new/path/"
aws iam list-users --query Users[].[UserName] --output text \
| while read user; do
echo "## IAM User name : ${user}"
aws iam update-user --user-name ${user} --new-path ${NEW_PATH}
echo "Update path to \"${NEW_PATH}\""
done
単純に、AWS アカウント内のすべての IAM ユーザーを list-users
コマンドで取得して、各 IAM ユーザーのパスを変更しているだけとなります。
実行結果例です。/bp/zzz/
に変更しています。
$ NEW_PATH="/bp/zzz/"
$ aws iam list-users --query Users[].[UserName] --output text \
> | while read user; do
> echo "## IAM User name : ${user}"
> aws iam update-user --user-name ${user} --new-path ${NEW_PATH}
> echo "Update path to \"${NEW_PATH}\""
> done
## IAM User name : user-001
Update path to "/bp/zzz/"
## IAM User name : user-002
Update path to "/bp/zzz/"
## IAM User name : user-003
Update path to "/bp/zzz/"
## IAM User name : user-004
Update path to "/bp/zzz/"
## IAM User name : user-005
Update path to "/bp/zzz/"
## IAM User name : user-006
Update path to "/bp/zzz/"
実行後の IAM ユーザーの一覧画面です。すべての IAM ユーザーのパスが/bp/zzz/
に変更されています。
任意の複数 IAM ユーザーのパスを指定した値に変更
「任意の複数 IAM ユーザーのパスを指定した値に変更」するコマンドでは、IAM ユーザーを列挙したファイルを読み込んで実行します。
NEW_PATH="/new/path/"
USER_LIST_FILE="users.txt"
while read user; do
echo "## IAM User name : ${user}"
aws iam update-user --user-name ${user} --new-path ${NEW_PATH}
echo "Update path to \"${NEW_PATH}\""
done < ${USER_LIST_FILE}
パスを変更したい IAM ユーザー名を列挙したファイルを用意して、そのファイルを読み込んで各 IAM ユーザーのパスを変更します。
テスト用に次のファイルをファイル名 users.txt
で用意して試してみます。最後に改行は不要です。例外処理をしていないいので、最後に改行がある場合はもう 1 ユーザーいる扱いでコマンドが実行され、エラーとなります。
user-001
user-002
user-004
user-005
実行結果例です。指定した IAM ユーザーのみ /bp/zzz/
に変更しています。
$ NEW_PATH="/bp/zzz/"
$ USER_LIST_FILE="users.txt"
$ while read user; do
> echo "## IAM User name : ${user}"
> aws iam update-user --user-name ${user} --new-path ${NEW_PATH}
> echo "Update path to \"${NEW_PATH}\""
> done < ${USER_LIST_FILE}
## IAM User name : user-001
Update path to "/bp/zzz/"
## IAM User name : user-002
Update path to "/bp/zzz/"
## IAM User name : user-004
Update path to "/bp/zzz/"
## IAM User name : user-005
Update path to "/bp/zzz/"
実行後の IAM ユーザーの一覧画面です。指定していない IAM ユーザーのパスは/bp/aaa/
または /bp/bbb/
のままです。
特定のパスを持つすべての IAM ユーザーのパスを指定した値に変更
「特定のパスを持つすべての IAM ユーザーのパスを指定した値に変更」するコマンドでは、OLD_PATH
で指定したパスを持つすべての IAM ユーザーのみのパスを NEW_PATH
に変更します。
OLD_PATH="/old/path/"
NEW_PATH="/new/path/"
aws iam list-users --path ${OLD_PATH} --query Users[].[UserName] --output text \
| while read user; do
echo "## IAM User name : ${user}"
aws iam update-user --user-name ${user} --new-path ${NEW_PATH}
echo "Update path from \"${OLD_PATH}\" to \"${NEW_PATH}\""
done
list-users
コマンドでは path
オプションを利用することで、指定したパスと完全一致したパスを持つ IAM ユーザーのみ出力できます。出力した IAM ユーザーに対するパスの変更処理は他のコマンドと同様です。
実行結果例です。/bp/aaa/
を /bp/zzz/
に変更しています。
$ OLD_PATH="/bp/aaa/"
$ NEW_PATH="/bp/zzz/"
$ aws iam list-users --path ${OLD_PATH} --query Users[].[UserName] --output text \
> | while read user; do
> echo "## IAM User name : ${user}"
> aws iam update-user --user-name ${user} --new-path ${NEW_PATH}
> echo "Update path from \"${OLD_PATH}\" to \"${NEW_PATH}\""
> done
## IAM User name : user-001
Update path from "/bp/aaa/" to "/bp/zzz/"
## IAM User name : user-002
Update path from "/bp/aaa/" to "/bp/zzz/"
## IAM User name : user-003
Update path from "/bp/aaa/" to "/bp/zzz/"
実行後の IAM ユーザーの一覧画面です。/bp/aaa/
のパスを持っていた IAM ユーザーのみ変更されています。
以上が IAM ユーザーのパスを一括変更するコマンド実行例です。
さいごに
複数の IAM ユーザーのパスを一括変更したい状況があったため、コマンドを検討して試してみました。list-users
コマンドのオプションが充実していたので、比較的簡単に実現できました。list-users
コマンドのオプションには、パスの完全一致以外にもプリフィックスの一致でフィルタする path-prefix
もあり、他の条件でも実現できそうです。
以上、このブログがどなたかのご参考になれば幸いです。