Firebase Admin SDKのgetAuth().getUsers()とGoogle Cloud APIレートリミットの対応
2024/07/31
masyus
業務でNode.jsにてバッチ処理を作り、Firebase Admin SDKをインストールしてFirebase Authenticationに記録されているユーザー情報を抽出するプログラムを書いたことがあります。
その際、バッチ処理につきgetAuth().getUsers()
をどの頻度で呼び出し続けても良いか(おそらく裏でGoogle CloudのAPIを呼び出している筈)が気になったため調べたのですが、今回はその調べ方について紹介いたします。
バージョン情報
- node: v20.11.1
- fierbase-admin: v12.2.0
Identity Toolkit API の上限を把握する
ざっとGoogle検索してまず辿り着いたのが、Firebase ドキュメントが提供している「Identity Toolkit API の上限」というページです。Firebase Admin SDKからのAuthenticationに関連するAPI呼び出しのレートリミットは、おおよそこのページにリストアップされています。
リストアップされているどのオペレーションが今回知りたいgetAuth().getUsers()
のレートリミットに対応するかですが、なんとなく
1 プロジェクトあたり GetAccountInfo 件* リクエスト 500,000 件/分
が該当しそうかも?というところまで掴めればひとまずOKです。このページからはこれ以上の情報が収集できなさそうなので、次はより当てがつけやすい調査をしていきます。
Firebase Admin SDKのソースコードを読む
次にFirebase Admin SDKのソースコードを実際に読んでいきましょう。Firebase Admin SDKのソースコードはGitHub上から確認することができます。
https://github.com/firebase/firebase-admin-node
このリポジトリ内で、getUsers()
でGitHub上のソースコードを検索してみます。GitHub画面上にある「Type / to search」という検索窓にてgetUsers(
と打ち込み、Enterを押して検索してみます。
この時、getUsers()
が引数を持つメソッドである可能性を踏まえ、敢えて後方の閉じ括弧を削ぎ落としたgetUsers(
で検索するのがポイントです。
getUsers()を特定する
https://github.com/search?q=repo%3Afirebase%2Ffirebase-admin-node+getUsers%28&type=code
↑が検索結果です。こちらによると、2024年7月現在は4ファイルが該当しました。
- etc/firebase-admin.auth.api.md
- src/auth/base-auth.ts
- test/integration/auth.spec.ts
- test/unit/auth/auth.spec.ts
ざっと眺めてみると、2.のsrc/auth/base-auth.tsにある
public getUsers(identifiers: UserIdentifier[]): Promise<GetUsersResult> {
が該当しそうです。他の3ファイルはそれぞれ
- (.*).mdはfirebase-admin.authの利用者向けの解説ファイル
- (.*).spec.tsはおそらくユニットテストのファイル
だと分かりますので、対象外として良いでしょう。
getAccountInfoByIdentifiers()の中身
次に、getUsers()
の中で何のAPIを呼び出しているかを把握します。base-auth.tsの337行目で
return this.authRequestHandler
.getAccountInfoByIdentifiers(identifiers)
というメソッドを呼び出しているので、その中身を確認していきます。
https://github.com/firebase/firebase-admin-node/blob/v12.2.0/src/auth/auth-api-request.ts#L1177
ざっと見た限り、このメソッドではAPI呼び出し処理が見つかりませんでした。おそらく1204行目にある
return this.invokeRequestHandler(this.getAuthUrlBuilder(), FIREBASE_AUTH_GET_ACCOUNTS_INFO, request);
をさらに辿る必要がありそうです。
ここで1点気にしておきたいのが、invokeRequestHandler()
の第二引数で渡しているFIREBASE_AUTH_GET_ACCOUNTS_INFO
という定数名です。Identity Toolkit APIの上限ページに記載されていた
プロジェクトあたり GetAccountInfo 件
の内容とマッチしていそうです。invokeRequestHandler()
は汎用的なメソッドのように見受けられるため、次はメソッドを辿るのではなくFIREBASE_AUTH_GET_ACCOUNTS_INFO
の定数を検索してみましょう。
FIREBASE_AUTH_GET_ACCOUNTS_INFOの中身
https://github.com/firebase/firebase-admin-node/blob/v12.2.0/src/auth/auth-api-request.ts#L667
export const FIREBASE_AUTH_GET_ACCOUNTS_INFO = new ApiSettings('/accounts:lookup', 'POST')
API呼び出し設定が見つかりました。/accounts:lookupのPOSTとありますので、コードの深掘りは一旦止めて次にGoogle検索で「Google Cloud accounts:lookup」のキーワードで検索してみます。
Google CloudのAPIドキュメントを特定する
https://cloud.google.com/identity-platform/docs/reference/rest/v1/accounts/lookup
ヒットしたのは↑のページです。HTTP Requestの項目を見ると
POST https://identitytoolkit.googleapis.com/v1/projects/{targetProjectId}/accounts:lookup
と解説されていますので、このAPI解説ページで間違いないでしょう。こちらのドキュメントの下部にResponse Bodyという解説があるのでそちらを読むと、
If successful, the response body contains an instance of GetAccountInfoResponse.
とあります。やはりGetAccountInfoが該当するようです。
結論: GetAccountInfoのレートリミットが該当する
即ち、
1 プロジェクトあたり GetAccountInfo 件* リクエスト 500,000 件/分
が該当するレートリミットであることが特定できました。Firebase Admin SDKの他のメソッドも同様に調べていけば、どのレートリミットが対応しているかを特定できそうです。