【AWS CLI + MFA対応】CSVファイルで複数のIAMユーザーを一括作成する方法【Bashスクリプト付き】

## はじめに
AWSで多数のIAMユーザーを作成する場合、マネジメントコンソールで一人ずつ登録するのは非常に手間です。本記事では、**CSVファイルとBashスクリプトを活用して、AWS CLIで複数のIAMユーザーを一括作成する方法**を丁寧に解説します。

さらに、**MFA（多要素認証）を有効にした環境にも対応**しており、セキュリティを保ちつつ効率的にユーザーを作成できます。実際に使えるスクリプト付きなので、すぐに業務に導入可能です。

## 🔹この記事の流れ（目次）

1. [環境の準備（AWS CLI + MFA）](#1-環境の準備aws-cli--mfa)
2. [CSVファイルの作成と整形](#2-csvファイルの作成と整形)
3. [IAMグループの作成](#3-iamグループの作成)
4. [BashスクリプトでIAMユーザーを一括作成](#4-bashスクリプトでiamユーザーを一括作成)
5. [スクリプトの実行方法](#5-スクリプトの実行方法)
6. [まとめ](#6-まとめ)

## 1. AWS CLIとMFAセッションの準備


### ✔︎AWS CLI をインストール

まだインストールしていない場合は、公式ドキュメントを参照してください：

👉https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html


###  ✔︎MFAプロファイルの設定とセッション取得

```bash
aws configure --profile mfa-session
```

次に、MFA デバイスのシリアル番号とトークンコードを使って一時的な認証情報を取得：
```bash
aws sts get-session-token \
  --serial-number arn:aws:iam::<アカウントID>:mfa/<MFAデバイス名> \
  --token-code 123456 \
  --profile default
  ```

この出力を ~/.aws/credentials に mfa-session プロファイルとして保存します：
```bash
[mfa-session]
aws_access_key_id = ASIA...
aws_secret_access_key = ...
aws_session_token = ...
 ```
## 2.  IAMユーザー情報をCSVファイルで準備
###  ✔︎サンプルCSVの構成

```bash
UserName,GroupName
takahashi,Sales
miyamoto,Sales
takayama,Sales
```
ファイル名例：users.csv

###  ✔︎改行・フォーマットの整形（Mac用sedコマンド）
```bash
sed -i '' 's/\r//' users.csv
sed -i '' 's/,,*$//' users.csv
```

## 3. IAMグループの作成とポリシー設定
### ✔︎グループ作成コマンド
ユーザーをグループにまとめて管理することで、ポリシーの適用やアクセス権限の制御が一括で行えるようになります。
```bash
aws iam create-group --group-name <グループ名> --profile mfa-session
```
例えば、Sales グループを作成する場合：
```bash
aws iam create-group --group-name Sales --profile mfa-session
```
### ✔︎ ポリシーのアタッチ（任意）
必要に応じて、グループにポリシーをアタッチしましょう。たとえば、AmazonS3ReadOnlyAccess ポリシーをアタッチするには：

```bash
aws iam attach-group-policy \
  --group-name Sales \
  --policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess \
  --profile mfa-session
  ```

## 4. BashスクリプトでIAMユーザーを一括作成
CSVファイルを読み込み、ユーザー作成・グループ追加・初期パスワードの設定を一括で行うスクリプトを作成します。

#### ✔︎ スクリプトの内容（create_iam_users.sh）
```bash
#!/bin/bash

# Set the input CSV file
INPUT_FILE="users.csv"

# Skip the header and loop through the file
tail -n +2 "$INPUT_FILE" | while IFS=',' read -r USERNAME GROUP

do
  USERNAME=$(echo "$USERNAME" | tr -d '\r' | xargs)
  GROUP=$(echo "$GROUP" | tr -d '\r' | xargs)

  echo "Creating IAM user: $USERNAME"

  # Create the user
  aws iam create-user --user-name "$USERNAME"

  # (Optional) Add the user to a group
  if [ -n "$GROUP" ]; then
    aws iam add-user-to-group --user-name "$USERNAME" --group-name "$GROUP"
  fi

  # (Optional) Create a login profile with a random password
  PASSWORD=$(openssl rand -base64 16 | tr -d '=+/[:space:]' | head -c 10)$(openssl rand -hex 2 | tr -d '[:space:]')'!'
  aws iam create-login-profile \
    --user-name "$USERNAME" \
    --password "$PASSWORD" \
    --password-reset-required

  echo "User $USERNAME created with password: $PASSWORD"
  echo "---"
done
```

### ✔︎ スクリプトに実行権限を付与
```bash
chmod +x create_iam_users.sh
```
## 5. スクリプトの実行と出力確認
### ✔︎ 必要なファイルを準備
以下のファイルが同じディレクトリに存在していることを確認してください：

users.csv（ユーザー名とグループ名を含むCSVファイル）

create_iam_users.sh（スクリプトファイル）

### ✔︎ スクリプトを実行
```bash
AWS_PROFILE=mfa-session ./create_iam_users.sh
```
### ✔︎ 実行結果のサンプル出力
```text
Creating IAM user: takahashi
{
    "User": {
        "Path": "/",
        "UserName": "takahashi",
        "UserId": "AIDATCKAMO66SOCGFASKS",
        "Arn": "arn:aws:iam::211125303229:user/kai_tran",
        "CreateDate": "2025-04-23T10:02:31+00:00"
    }
}
{
    "LoginProfile": {
        "UserName": "takahashi",
        "CreateDate": "2025-04-23T10:02:38+00:00",
        "PasswordResetRequired": true
    }
}
User takahashi created with password: CSE1Joo3mKed0f!
```
## 6. まとめ：CSVとCLIでIAMユーザー管理を自動化しよう
本記事では、AWS CLIとBashスクリプトを活用して、CSVファイルから複数のIAMユーザーを一括作成する方法を解説しました。

### 🔑 本記事のポイント
* AWS CLIのセットアップからMFAセッションの構成までを解説

* CSVファイルによるユーザー情報の管理で作業の再利用性を向上

* IAMグループへの追加や、初期パスワードの自動設定もスクリプトで対応



これにより、IAMユーザーの一括管理が手作業に比べて圧倒的に効率化され、セキュリティも担保された運用が実現できます。

## おわりに
IAMユーザーの管理は、AWS環境における運用とセキュリティの基盤です。
GUI操作では煩雑になりがちな作業も、CLIとスクリプトを活用すれば再現性と効率性が大幅に向上します。

この記事が皆さんの業務の助けになれば幸いです！