GenU でユーザを大量にセルフサインアップさせるときに注意すること
GenU とは
generative-ai-use-cases-jp (GenU)は GitHub の aws-samples で公開されている生成 AI アプリケーションのサンプル実装です。オープンソースライセンスで提供されており、アプリケーションを無料でご自身の AWS アカウント上に構築ができます。
ユーザを同時かつ大量にセルフサインアップさせようとして事故る
GenU ではデフォルトでは Cognito をアプリケーションのユーザ管理の仕組みとして採用されています。
ある日、GenU を数千名規模で広く展開したいということで、Cognito のセルフサインアップ機能を利用して、利用者の方々にサインアップを依頼したところ以下のエラーが表示されました。

Cognito ではセルフサインアップ時にEメールアドレスの有効性を確認するため認証コードがEメールアドレス宛に送られますが、Cognito の機能でEメールを送信する場合、1日に送信できる最大数は50通と制限されています。Cognito のコンソールの画面にも以下のように記載されています。

Cognito のデフォルトのEメールアドレスは、開発を開始するに際しての一時的なものとして使用します。1日に最大50通のEメールを送信するために使用できます。
つまり、Cognito がもつEメールアドレスの送信機能は開発時の一時的な利用を想定しており、本番利用では SES で検証済みのアイデンティティを使用してEメールを送ることが推奨されています。
代替案を考える
とはいっても、今日から使い始めてもらい場合、SES を利用すると最初は Sandbox 環境に入り、プロダクション化させるにはサポートケースの起票が必要なため、少し都合が悪いです。
そこで、管理者側で Cognito のEメール送信の上限に引っかからないようにしつつ、ユーザを作成する方法を試します。
具体的には、以下のシェルスクリプトを実行します。addresses.txt には登録したいEメールアドレスが各行に列挙されています。user-pool-id や region, temporary-password は適宜書き換えましょう。
while read email || [ -n "$email" ]; do
aws cognito-idp admin-create-user \
--user-pool-id ap-northeast-1_xxxxxxx \
--username "$email" \
--user-attributes Name=email,Value="$email" Name=email_verified,Value=true \
--temporary-password "XXXXXXXXX" \
--message-action SUPPRESS \
--region ap-northeast-1 \
--no-cli-pager
done < addresses.txt
user1@example.com
user2@example.com
user3@example.com
これにより、Eメール確認済みの Cognito ユーザを管理者側で作成しつつ、ユーザには一時的なパスワードを使用して初回ログインをさせることができます。
初回ログイン時は以下のような画面に遷移され、一時パスワードからご自身のパスワードへ強制的に変更が求められるため、個々人にパスワード管理を任せることができます。

まとめ
本記事では、GenU で Cognito を使っている場合に、Eメール送信の上限を回避して管理者側でユーザを作成する方法をご紹介しました。
上記でも触れていますが、本番環境ではEメール送信はSESを利用することを推奨しています。
広く展開する際には、計画的にデプロイを進めましょう!
Discussion