AWS CLIを使ったIAMユーザ一括登録

IAM

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS CLIを利用したbashスクリプトでIAMユーザを一括登録する方法をご紹介します。

概要

AWSの操作をするためにはAWSへとアクセスする権限が必要です。AWSへとアクセスする人に対して権限を付与するためにはIAM Userを利用するのが一般的な方法です。 IAM Userを作成するにはManagement Consoleから操作することもできますが、その数が5人とか10人とかになってくるとなかなか面倒大変な作業になります。

そこでbashスクリプトを書いて登録を出来る限り登録を自動化してみました。動作確認は私の手元のMac OS X 10.11で行っています。

処理概要

  • ユーザ名を列挙したテキストファイルを保存しておく
  • 作成したIAM Userは、ひとつのIAM Groupに所属させる
  • コマンドラインオプションで、アクセスキーとManagement Consoleへのパスワードを発行するかどうかを切り替える
  • 作成したクレデンシャルはCSVとして保存する

実装

users.txtという名前で、IAMユーザ名を書いたファイルを保存しておきましょう。以下のような形式になります。

~ $ cat users.txt
foo@example.com
bar@example.com

以下が本体のシェルスクリプトです。

#!/bin/bash

set -e

usage_exit() {
        echo "Usage: $0 [-a] [-p]" 1>&2
        echo "-a: create API key for each user." 1>&2
        echo "-p: create Login password for each user." 1>&2
        exit 1
}

#ユーザ名を記載したファイル名
file=users.txt
# 所属させるグループを指定する
group=admin-group
#パスワード生成に使用するコマンド
password_command="pwgen -N 1 -c -n -s -y 8"

while getopts aph OPT
do
    case $OPT in
        a)  CREATE_ACCESSKEY=true
            ;;
        p)  CREATE_PASSWORD=true
            ;;
        h)  usage_exit
            ;;
        \?) usage_exit
            ;;
    esac
done

cat $file | while read username; do
  aws iam create-user --user-name ${username}
  aws iam wait user-exists --user-name ${username}
  aws iam add-user-to-group --group-name ${group} --user-name ${username}

  if [ "${CREATE_ACCESSKEY}" = "true" ]; then
      result=$(aws iam create-access-key --user-name ${username})
      accesskey=$(echo ${result} | jq -r '.AccessKey.AccessKeyId')
      secretkey=$(echo ${result} | jq -r '.AccessKey.SecretAccessKey')
      echo "${username},${accesskey},${secretkey}" > ${username}_accesskey.csv
  fi

  if [ "${CREATE_PASSWORD}" = "true" ]; then
      account_id=$(aws sts get-caller-identity | jq -r '.Account')
      signin_url="https://${account_id}.signin.aws.amazon.com/console"
      password=$(eval ${password_command})
      aws iam create-login-profile --user-name $username --password ${password} --password-reset-required
      echo "${username},${password},${signin_url}" > ${username}_password.csv
  fi
done

処理のポイントはいくつかあるのですが、まずaws iam wait user-existsを利用している点です。AWSのAPIを利用していると、前の処理で作成したはずのリソースが存在しておらずエラーになることがまれにあります。EC2インスタンスを作成した直後にタグ付けしようとした時などに発生します。AWS CLIに存在するwaitを利用することによって、作業対象のリソース、今回はIAMユーザが確実に作成されたことを確認してから後続処理に移るようにしています。

次に、パスワード生成部分ではパスワードコマンドを指定するようにしています。これは、このスクリプトを動作させるOSによってコマンドが変わってくるからです。筆者はMac OS Xで検証しましたのでpwgenを利用しましたが、一部のLinuxディストリビューションではpwgenではなくmkpasswdが利用できるので、動作させる環境に応じて書き換えてご利用下さい。また、AWSアカウントのパスワードポリシーに応じてオプションは自由に設定して下さい。

動作確認

最後に、このスクリプトの動作確認をしておきましょう。

$ ./register.sh -a -p
{
    "User": {
        "UserName": "foo@example.com",
        "Path": "/",
        "CreateDate": "2016-07-07T00:36:15.405Z",
        "UserId": "AIDAJBK57ZSKGLXLWSNFW",
        "Arn": "arn:aws:iam::0123456789012:user/foo@example.com"
    }
}
{
    "User": {
        "UserName": "bar@example.com",
        "Path": "/",
        "CreateDate": "2016-07-07T00:36:23.968Z",
        "UserId": "AIDAIP24IMZEWXG22T7XC",
        "Arn": "arn:aws:iam::0123456789012:user/bar@example.com"
    }
}

$ /bin/ls *.csv
bar@example.com_accesskey.csv bar@example.com_password.csv  foo@example.com_accesskey.csv foo@example.com_password.csv

アクセスキーとパスワードが発行されていました。

まとめ

AWS CLIをつかって一括でIAMユーザ登録する方法をご紹介しました。実際のプロジェクトでは、様々な制約によりこのスクリプトをそのまま利用することはできないかもしれませんが、ご紹介した要素の中に活用できる部分があると思いますので、ぜひご活用下さい。