こんにちはますのです。
今回はChatGPTさんの力を借りて「AWSのIAMユーザパスワード変更を複数アカウントでまとめて処理」を実現しようと思います。
お仕事で手作業ゴリ押しで15分くらいで実施していましたが、CLIでシェルやバッチ組めば楽なんだよなぁとは常日頃に感じています。
しかし、調べて作るくらいならゴリ押しでいいか。とエンジニアらしからぬパワープレイをしています。
ChatGPTでわたしのパワープレイが解決出来るか、今回ついに重い腰をあげることにしました。
結論ですが、ChatGPTさんだけで一発解決とはいきませんでした。
土台を作って貰い、人間がエラー箇所を指摘して叩き直す必要があります。
ただ、ヒントを貰いながらスクリプトを作成出来る時短にはなるため、個人的には今後とも仲良くお付き合いしていきたい所存です。
やりたいこと
- AWSアカウントのIAMユーザのパスワード変更を実施する
- AWSアカウントは10以上である
- 対象のAWSアカウントを一括でまとめて更新を行いたい
要件まとめ
- AWSアカウントに設定しているIAMユーザとパスワードは全環境で共通
- SystemsManagerは利用できない環境
- AWS CLIは利用可能
- 対象のAWSアカウントは自由に増減できること
- パスワードには記号を必ず1つ以上含める
- パスワード変更後の初回ログインで、パスワード再設定は不要
今回はそんな思いをChatGPTさんに叶えてもらいましょう。
ChatGPTさんに聞いてみる
何回かチャットでやり取りを行い、まずは土台を作って貰いました。
#!/bin/bash
USER_NAME=<USER_NAME>
NEW_PASSWORD=<NEW_PASSWORD>
for account in account1 account2 account3 ... account20; do
aws --profile $account iam update-login-profile --user-name $USER_NAME --password $NEW_PASSWORD --password-reset-required
done
試行:【失敗】プロファイル名を別ファイルから読み込む
せっかくなのでプロファイル名は外部ファイルから読み込むようにしたいと考えます。
エンジニアっぽいことやってみたいですからね。
しかし失敗のご様子。
#!/bin/bash
USER_NAME=<USER_NAME>
NEW_PASSWORD=<NEW_PASSWORD>
# 外部ファイルからAWSアカウント名を読み込む
while read account; do
aws --profile $account iam update-login-profile --user-name $USER_NAME --password $NEW_PASSWORD --password-reset-required
done < accounts.txt
外部ファイル:accounts.txt
account1
account2
account3
...
account10
プロファイル名の最後で改行されているため、被疑箇所としてChatGPTさんへ再質問してみます。
The config profile (account1
) could not be found
最終:パスワード更新可能なコード発行に成功する
ChatGPTさんにエラー内容を相談して最終的なコード発行に成功しました。
回答:
whileループによってファイルを読み込む場合、末尾の改行が問題になることがあります。この場合、読み込むファイルを事前にtrコマンドで改行を取り除くことで問題を解決することができます。
#!/bin/bash
# 改行を除去するコマンドを定義する
strip_newline() {
echo "$1" | tr -d '\n'
}
# AWSプロファイル名が記述されたファイルを指定する
PROFILE_FILE="profile_list.txt"
# ユーザ名
USER_NAME="example_user"
# 新しいパスワード
NEW_PASSWORD="new_password"
# プロファイルファイルをループ処理する
while read -r profile; do
profile=$(strip_newline "$profile")
echo "Updating password for profile: $profile"
# AWS CLIを実行する
aws --profile "$profile" iam update-login-profile --user-name "$USER_NAME" --password "$NEW_PASSWORD" --no-password-reset-required
done < <(tr -d '\r' < "$PROFILE_FILE")
外部ファイル:profile_list.txt
account1
account2
account3
...
account10
- USER_NAME=”example_user”
- NEW_PASSWORD=”new_password”
- CLI実行時の変数呼び出し時に「ダブルクォーテーション」を付与(例:”$NEW_PASSWORD”)
- 変数に記号を格納する場合は設定必須の箇所。
- 変数内に記号を入れない場合は特に気にしないでも良い箇所。
- パスワード変更オプション:–no-password-reset-requiredに修正。
- –password-reset-required:変更処理後の初回ログイン時にパスワードリセット必須
- –no-password-reset-required:変更処理後の初回ログイン時にパスワードリセット不要
- パスワードリセットはしないため、リセット不要のオプションに書き換え。
- 参照:AWS CLI Reference(update-login-profile)
profile_list.txtのプロファイル名について
profile_list.txtの中身は、「コマンド:aws configure」などで設定した際のcredentialsやconfigファイルから確認します。「~/.aws/credentials or config」を参照することで各AWSアカウントに応じたプロファイル名が設定されているため、下記の引用を参考に設定します。
参考:AWS CLI の名前付きプロファイル
[default] aws_access_key_id=AKIAIOSFODNN7EXAMPLE
※下記例であれば、profile_list.txtに「default」「user1」を記載します。
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY [user1] aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
ChatGPTで全解決は難しい
プログラミングに苦手意識のあるわたしにとってはありがたい存在になりそうです。
ただし全てを任せられるというわけではないようです。
調べながら進めることに変わりはないですが、イチから作ることが苦手な場合はサポートの一種として仲良くしていければいいなぁという所感になります。
一応検証をしながら出来ることを確認していますが、作成したシェルの利用については自己責任にてお願いします。