メインコンテンツにスキップ

Cognitoサインアップ時の「Rate limit exceeded」

タグ: 🏷 AWS ,Cognito

はじめに

Amazon Cognitoは、簡単かつ安全にユーザー認証・認可機能を追加できるサービスです。しかし、開発の過程で「rate limit exceeded, please try again later」というエラーに遭遇することがあります。

このエラーは、Cognitoが定めるAPIリクエストの上限(レートリミット)を超えた場合に発生します。このエラーが発生する具体的な意味と原因、そしてその対処法について示します。

エラーの意味

「rate limit exceeded, please try again later」というメッセージは、文字通り「リクエスト数が上限を超えました。後でもう一度お試しください」という意味です。

Cognitoは、サービスの安定性と公平性を保つために、特定の時間内に単一のIPアドレスやアカウントから受け付けるAPIリクエストの数に制限を設けています。サインアップ(SignUp API)処理もこの対象であり、短時間に大量のサインアップリクエストを送信すると、このエラーが返されます。

原因

Cognitoの「デフォルトメールプロバイダー」を利用している場合、1日に送信できる確認コードメールが50通に制限されていることが原因でした。

この上限を超えると、Cognitoはメールの送信を停止し、結果として新規ユーザーがサインアップを完了できなくなります。

Cognitoは、ユーザープール作成時にメール送信方法を選択できます。デフォルトではCognito自体がメールを送信する「デフォルトメールプロバイダー」が設定されていますが、これには以下のような制限があります。

  • 1日のメール送信上限: 1AWSアカウント、1リージョンあたり50通
  • 件名の文字数上限: 140文字
  • 本文の文字数上限: 20,000文字

この制限は、確認コードだけでなく、パスワードリセットなどの通知メールも含まれます。

詳細は、以下のAWS公式ドキュメントに記載されています。

Amazon Cognito のクォータ - Amazon Cognito

このクォータは、Amazon Cognito ユーザープールでデフォルトの E メール機能を使用している場合にのみ適用されます。E メールの配信ボリュームがより高い場合は、Amazon SES の E メール設定を使用するようにユーザープールを設定します。この制限は毎日 0900 UTC にリセットされます。

解決策

開発環境や小規模なテストではデフォルトのメールプロバイダーでも問題ありませんが、本番環境や大規模なテストを行う場合は、メール送信の制限が緩やかなAmazon Simple Email Service (SES) を利用することが推奨されます。

Cognitoのユーザープール設定から、メール送信プロバイダーをSESに変更することで、SESの送信クォータに基づいたメール送信が可能になります。これにより、より多くのユーザーに対応できるようになります。

ただ、SESはドメインが必要だったりするので、Route53などの費用がかかります。なので、お試しでCognitoの試験をするならlimit解除を待つのが得策だと思います。