【ChatGPT】複数のAWSアカウントで共通のIAMユーザ名のパスワードを一括変更

  • 2023年3月26日
  • 2023年3月26日
  • AWS, IT
AWS

こんにちはますのです。
今回は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
エラーログを吐かせてみるとprofile読み込みタイミングでコケている様子です。
プロファイル名の最後で改行されているため、被疑箇所としてChatGPTさんへ再質問してみます。
The config profile (account1
) could not be found

最終:パスワード更新可能なコード発行に成功する

ChatGPTさんにエラー内容を相談して最終的なコード発行に成功しました。

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
最初のChatGPT案から修正している箇所
  • USER_NAME=”example_user”
  • NEW_PASSWORD=”new_password”
  • CLI実行時の変数呼び出し時に「ダブルクォーテーション」を付与(例:”$NEW_PASSWORD”)
    • 変数に記号を格納する場合は設定必須の箇所。
    • 変数内に記号を入れない場合は特に気にしないでも良い箇所。
  • パスワード変更オプション:–no-password-reset-requiredに修正。
    • –password-reset-required:変更処理後の初回ログイン時にパスワードリセット必須
    • –no-password-reset-required:変更処理後の初回ログイン時にパスワードリセット不要

profile_list.txtのプロファイル名について

profile_list.txtの中身は、「コマンド:aws configure」などで設定した際のcredentialsやconfigファイルから確認します。「~/.aws/credentials or config」を参照することで各AWSアカウントに応じたプロファイル名が設定されているため、下記の引用を参考に設定します。

参考:AWS CLI の名前付きプロファイル
※下記例であれば、profile_list.txtに「default」「user1」を記載します。

[default] aws_access_key_id=AKIAIOSFODNN7EXAMPLE
aws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY

[user1] aws_access_key_id=AKIAI44QH8DHBEXAMPLE
aws_secret_access_key=je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY

ChatGPTで全解決は難しい

プログラミングに苦手意識のあるわたしにとってはありがたい存在になりそうです。
ただし全てを任せられるというわけではないようです。

調べながら進めることに変わりはないですが、イチから作ることが苦手な場合はサポートの一種として仲良くしていければいいなぁという所感になります。

一応検証をしながら出来ることを確認していますが、作成したシェルの利用については自己責任にてお願いします。

最新情報をチェックしよう!