😺

知らなかったCognitoの制限

2024/05/27に公開

こんにちは。昨年エンジニアとしてキャリアスタートし、1年ちょっと経ちました。普段はAWSを使ったアプリケーションの開発・保守をやっております。

ある日、お客さんから不具合の報告があり、ユーザーの管理に使用しているCognitoの制限が原因だったので、忘備と共有をかねて執筆させていただきます。

書くこと

  • Amazon Cognitoとは
  • プロジェクトから知ったCognitoの制限とその対応
  • その他の制限を色々調べる
  • モニタリングしようとしたら...

Amazon Cognitoとは

Webアプリケーションやモバイルアプリケーションに対して、ユーザーのサインアップやサインインのための開発を容易にする機能を提供するマネージドサービスです。また、ユーザープールというユーザーディレクトリを作成し、ユーザー情報を管理することもできます。
https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/what-is-amazon-cognito.html

Cognitoの制限・対策

ここから不具合の原因となったCognitoの制限を2つ紹介します。

「ユーザー一覧画面に全員表示されないんだけど」

と、お客さんに言われてしまいました。一部のユーザーが画面に表示されず、APIのレスポンスを見ても、データが一部含まれていませんでした。。。

制限「ユーザー一覧取得は60人まで」

AWS SDKを使用してユーザーを取得していたのですが、一度にレスポンスできるユーザー数は60でした。ユーザープールに60人より多く登録されていたため、何人か表示できていませんでした。
https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_ListUsers.html

対策「ページネーショントークンを使う」

ページネーショントークンは、同じパラメータを使用して追加のAPIリクエストで提示できる識別子です。レスポンスするときに、ユーザーデータに続きがあるときにトークンを返してくれます。次のリクエスト時にページネーショントークンを含めると、続きからユーザーデータを返してくれます。

↓TypeScriptでこんな感じで使いました。

async findAllUsers() {
  const users = await this.cognitoClient.listUsers({ UserPoolId }).promise();
  if (users.Users === undefined) return;

  // cognitoのユーザーは60件ずつしか取得できないため、60件以上の場合はページネーションを行う
  while (users.PaginationToken !== undefined) {
    const nextUsers = await this.cognitoClient
      .listUsers({
        UserPoolId,
        PaginationToken: users.PaginationToken,
      })
      .promise();
    users.Users = users.Users.concat(nextUsers.Users || []);
    users.PaginationToken = nextUsers.PaginationToken;
  }
  return users;
}

これで無事に全ユーザーを取得することができました。

「今度はユーザーが登録できないんだけど」

と、お客さんに言われてしまいました。。。

制限「AWSアカウント毎に送信できる1日のEメールの数は50通まで」

ユーザープールの設定で、CognitoでEメールを送信する設定になっており、50通の制限に達してたことでユーザーの作成に失敗したようです。

対策「SESでメールを送信する設定にする」

コンソール上に選択肢がありますが、SESでメールを送信する設定にします。送信元には検証済みのメールアドレスを指定します。Cognitoのデフォルトメールは1日50件しか送信できませんが、SESを使えば1日50,000件まで送信できます。

その他の制限

今回は上記の2つに引っかかりましたが、ついでに他にどんな制限があるのか調べてみたので、いくつかピックアップします。

  • ユーザープールあたりのユーザー数: 最大40,000,000(引き上げ可)
  • ユーザープールあたりのアプリケーションクライアント数: 最大1,000(引き上げ可)
  • ユーザープールあたりのグループ数: 最大10,000(引き上げ不可)
  • トークンの有効期限: IDトークン、アクセストークンは最大24時間、更新トークンは最大10年間(引き上げ可)
  • ユーザープールあたりのアイデンティティプロバイダー数: 最大300(引き上げ可)
    • Amazon Cognitoユーザープールに統合できる外部認証プロバイダー(例:Google、Facebook、Amazon、SAML IdPなど)

https://docs.aws.amazon.com/ja_jp/cognito/latest/developerguide/quotas.html

クォータの使用状況を追跡しようとしたけど...

AWSではService Quotasというサービスが提供されており、以下のようなことができます。

  • 特定のクォータの値を確認できる
  • モニタリング情報を表示できる
  • クォータの引き上げをリクエストできる
  • CloudWatch アラームを設定できる

モニタリング情報を表示できる機能を使用してSESが送信したメールの数をモニタリングしようと思ったら、現時点では利用不可のようです、、、(1日50,000件いけるし、まあいいか。。。)

最後に、Cognitoのユーザープールのサービスクォータを覗いてみると、レート系のモニタリングは結構できそうです。

まとめ

Amazon Cognitoのいろいろな制限を紹介しました。どなたかの役に立てれば幸いです。

NCDCエンジニアブログ

Discussion