はじめに
CognitoのユーザープールにはAPIリクエストのクォータが存在します。例えばユーザー認証で利用するUserAuthenticationはデフォルト120RPS※です。数千〜数万人規模の利用者数が見込まれる場合は、ピークタイムの同時利用者数に対し、クォータ制限が問題ないかの影響調査を実施する必要があります。
この上限に対し、API Gatewayのキャッシュを使って同一トークンの認可判定回数を削減することは、実運用で有効な対策の1つとなります。
※ 各クォータはリージョン/アカウント単位。上限緩和が可能であるクォータが存在するものの、本サービスは上限緩和のクライテリアが高い点に注意が必要である。
参考:
Amazon Cognito のクォータ
API Gateway での REST API のキャッシュ設定
認可結果キャッシュとは何か
API GatewayのAuthorizerは、認可結果を一定時間キャッシュできます。
デフォルトで5分、authorizerResultTtlInSeconds を0とすると無効、最大1時間までキャッシュ可能です。キャッシュが有効な間は、同一トークンに対するリクエストが増えてもAuthorizerの再実行を抑制でき、CognitoのAPI呼び出しを減らすことが可能となります。
API Gatewayにおけるキャッシュのサポート状況
REST APIとHTTP APIでの対応状況についてドキュメントを確認後、実際に動作を確認しました。
REST API
- キャッシュ設定の手順が明確に記載されているのはLambda Authorizerのみ。実機でも問題ないことを確認しました。
- Cognito Authorizerでは認可結果のサポート有無が不明瞭。実機で検証した結果、キャッシュが効いていないことが判明しました。
HTTP API
- Lambda AuthorizerでTTLを指定したキャッシュが明記されており、実機でも問題ないことを確認しました。
- Cognito Authorizerは認可結果のキャッシュがサポートされていないことが明記されています。
参考:
AWS::ApiGateway::Authorizer
The TTL in seconds of cached authorizer results. If it equals 0, authorization caching is disabled. If it is greater than 0, API Gateway will cache authorizer responses. If this field is not set, the default value is 300. The maximum value is 3600, or 1 hour.
API Gateway Lambda オーソライザーを使用する
AWS::ApiGatewayV2::Authorizer
The time to live (TTL) for cached authorizer results, in seconds. If it equals 0, authorization caching is disabled. If it is greater than 0, API Gateway caches authorizer responses. The maximum value is 3600, or 1 hour. Supported only for HTTP API Lambda authorizers.
注意点
-
REST API + Cognito Authorizerは認可キャッシュがサポート外であること。
- HTTP API + Cognito Authorizerが認可キャッシュがサポート外であることが明記されているにもかかわらず、REST API + Cognito Authorizerはドキュメント上は不明瞭な状態である。実機検証およびAWSサポートへの確認により仕様であることは確認済みであるため、機能要望として担当部署へのフィードバック済み。
-
キャッシュは認可判定を遅延させる要因となるためトレードオフがあること。
- 失効・権限変更が反映されるまでTTL分の遅延が発生する。
- 監査要件が厳しい場合はTTLを短縮化するか、BFF側で補完する必要がある。
-
クォータ増枠は申請制
- まずは設計上の工夫※で対処し、それでも足りない場合に増枠申請を検討するのが現実的である。※キャッシュ、リクエスト集約、トークン再利用、リトライ処理等
まとめ
- API Gatewayで認可結果のキャッシュを利用することはRPS抑制の有効策である。
- API Gatewayで認可結果のキャッシュを利用するならLambda Authorizerが必須である。
- TTL設計は安全性と負荷軽減のトレードオフであり、実測ベースで最適化が必要である。