開発経緯
チームに新しい人が加わった時に、いちいちAWSのユーザ登録をし、その情報を新規メンバーに送るのが面倒であるため、簡略化したい
概要
Teraaform上のコマンドの実行のみでAWS上にIAMユーザを追加できるようにする
作成したIAMユーザの情報をテキストファイルとして格納し、スラックで通知することでログイン情報を自動取得する
アーキテクチャ図
ディレクトリ構成
├── README.md
├── backend.tf # teraformのStateやVersionを管理
├── iam_user.tf # 新規ユーザを作成し、ログイン情報をファイル形式へ変換
├── output.tf # アウトプット状況に基づいて、ログインに必要なパスワードを生成
├── provider.tf # providerを設定
└── s3.tf # 新たに作成されたyユーザのログイン情報を{ユーザ名}.txtとして格納
S3にユーザ情報が保存されるまでの思考過程
ユーザを追記したら、そのログイン情報が勝手にS3にアップロードされる必要がある
情報を管理するために、S3に保存するためには、一旦ファイル形式で格納しておくことが必要
- localfileでファイル名とコンテントを記入することで、指定フォルダにファイルが可能になる
- また今回はファイルの形式も指定しているが、他にもCSV形式などで指定することも可能
今回は以下の情報をIAMから撮ってきてlocalfileに格納したresource "local_file" "user_info" { for_each = aws_iam_user.test_new_user filename = "${pathexpand("./")}/${each.value.name}_user_info.txt" content = <<EOF IAM User Name: ${each.value.name} Password: ${aws_iam_user_login_profile.test-login-profile[each.key].password} Login URL: <https://wevox-login.signin.aws.amazon.com/console> EOF }
Lamdaによるアップロードを検知する
- lambdaに関して
- イベント発生時に、コードを実行し、リソースを自動的に管理するもの
- なんらかのイベントの発生に伴い、あらかじめ設定した処理が行われるもの
file_key = record['s3']['object']['key'] response = s3.get_object(Bucket=bucket_name, Key=file_key) content = response['Body'].read().decode('utf-8') message = f"新しいIAMユーザ '{file_key}' が追加されました。\\n\\nログイン情報:\\n{content}"
Slackへのログイン情報通知
- Incoming webhoolsの使用に関して
- 以下の設定に伴って、Slack=urlを取得することで、スクリプトからの通知が可能になる
- https://qiita.com/ik-fib/items/b4a502d173a22b3947a0
- PythonのHTTPリクエストに関して
- 参考 https://techblog.tver.co.jp/entry/h-abe/lambda-slack-tool
- get,,postリクエストを送信するもの
参考文献
以下の記事を参考にさせていただきました。
・ https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_user_group_membership