はじめに
どーも!shihopowerです!
SAPの勉強をしていると、こんな状況になりませんか?
API Gatewayのスロットリング?リミット?トークンバケット?レート?バースト?……用語多すぎん??🤯
わたしもそうでした!模擬問題でAPI Gatewayが出てきたとき、知らない用語が多すぎて全然解けなかったので、AWS公式ドキュメントのみを参照しながら一つひとつ調べてまとめました。
同じくSAP対策中の方や、API Gatewayをちゃんと理解したい方の参考になれば幸いです!
忙しい人向け要約
- スロットリングとはリクエスト過多からバックエンドを守る仕組みのこと
- API Gatewayはトークンバケットアルゴリズムでスロットリングを実現している
- レート=1秒あたりの定常リクエスト数、バースト=瞬間的な最大リクエスト数、クォータ=日・週・月単位の累計リクエスト数の上限
- スロットリングは4つのレベルで階層的に適用され、上位レベルの上限は超えられない
-
メソッド=リソースパス+HTTP動詞の組み合わせ(例:
GET /pets)
目次
- スロットリングとは
- トークンバケットアルゴリズムとは
- レート・バースト・クォータの違い
- スロットリングの4つのレベル(階層構造)
- ステージ・API・メソッドとは
- アカウントレベルのリミット一覧
- まとめ
1. スロットリングとは
スロットリングとは、リクエストが多すぎることでAPIが圧倒されないよう保護する仕組みです。
You can configure throttling and quotas for your APIs to help protect them from being overwhelmed by too many requests.
(引用:Throttle requests to your REST APIs for better throughput in API Gateway)
リクエストが定常レートとバーストの上限を超えると、API Gatewayはスロットリングを開始し、クライアントは 429 Too Many Requests エラーを受け取ります。
また、スロットリングやクォータはベストエフォートで適用されるものであり、保証された上限ではなく「目標値」として捉える必要があります。
2. トークンバケットアルゴリズムとは
仕組み
API Gatewayはトークンバケットアルゴリズムを使ってスロットリングを実現しています。
API Gateway throttles requests to your API using the token bucket algorithm, where a token counts for a request.
(引用:Throttle requests to your REST APIs for better throughput in API Gateway)
仕組みをざっくりイメージすると以下のとおりです。
【トークンバケットのイメージ】
バケット(最大容量=バースト値)
┌─────────────────┐
│ 🪙 🪙 🪙 🪙 🪙 │ ← レートの速度でトークンが補充される
│ 🪙 🪙 🪙 🪙 🪙 │
└─────────────────┘
↓
リクエストが来るたびにトークンを1枚消費
バケットが空になったら → 429 Too Many Requests
- バケットにはトークンが蓄えられている
- リクエストが来るたびにトークンを1枚消費する
- トークンは「レート」の速度で補充され続ける
- バケットの最大容量が「バースト」にあたる
- バケットが空の状態でリクエストが来ると
429エラーを返す
なぜAPI Gatewayはトークンバケットアルゴリズムを採用しているのか
AWS News Blogには、採用理由が以下のように記載されています。
Using a Token Bucket allows you to have APIs that support a steady stream of requests with the capability to accommodate the occasional burst. You can use/think of throttling in two different ways. From the business side, it allows you to use a Usage Plan to control how many requests each of your customers can make. From the technical side, it allows you to insulate the services that are used to implement the APIs from excessive requests. This is especially important if those services are implemented outside of AWS and cannot scale to meet demand.
(引用:New – Usage Plans for Amazon API Gateway)
まとめると、採用理由は以下の2つです。
| 観点 | 理由 |
|---|---|
| 技術面 | 定常リクエストを処理しながら、一時的なバーストにも対応できる柔軟性があるから |
| ビジネス面 | 使用プランを通じて、顧客ごとのリクエスト数をコントロールできるから |
3. レート・バースト・クォータの違い
トークンバケットアルゴリズムにはレートとバーストという2つのパラメータがあります。さらにこれとは別にクォータという概念もあります。
レート(Rate)
You can specify a throttling rate, which is the rate, in requests per second, that tokens are added to the token bucket.
(引用:Throttle requests to your REST APIs for better throughput in API Gateway)
レートとは、1秒あたりにトークンバケットへトークンが補充される速度、すなわち定常状態で許容される1秒あたりのリクエスト数(RPS)です。
バースト(Burst)
You can also specify a throttling burst, which is the capacity of the token bucket.
(引用:Throttle requests to your REST APIs for better throughput in API Gateway)
バーストとは、トークンバケットの容量、すなわち瞬間的に許容される同時リクエスト数です。
クォータ(Quota)
Quota – Number of requests that can be made per day, week, or month.
(引用:New – Usage Plans for Amazon API Gateway)
クォータとは、日・週・月単位で実行できる累計リクエスト数の上限です。レートやバーストが「秒単位・瞬間的」な制御であるのに対し、クォータはより長い期間での累計を制限します。
3つの違いまとめ
| 設定値 | 制御の単位 | 意味 |
|---|---|---|
| レート(Rate) | 秒 | 1秒あたりのリクエスト数(定常RPS) |
| バースト(Burst) | 瞬間 | バケットの最大トークン数(同時リクエストの上限) |
| クォータ(Quota) | 日・週・月 | 期間内の累計リクエスト数の上限 |
具体例:使用プランでの設定イメージ
AWS News Blogでは、使用プランを「Bronze・Silver・Gold」のようなアクセスレベルや、「Student・Individual・Professional・Enterprise」のようなユーザーカテゴリに分けて設定できると説明されています。
You can create usage plans for different levels of access (Bronze, Silver, and Gold), different categories of users (Student, Individual, Professional, or Enterprise), and so forth.
(引用:New – Usage Plans for Amazon API Gateway)
たとえば、外部の開発者向けにAPIを提供するサービスを想定すると、以下のように3つの設定を組み合わせて使用プランを設計できます。
【使用プランの設定例】
■ Freeプラン(無料ユーザー向け)
レート : 10 RPS → 毎秒10リクエストまで定常的に処理
バースト: 20 リクエスト → 一時的なアクセス集中も20件まで許容
クォータ: 1,000 req/日 → 1日の合計リクエスト数は1,000件まで
■ Standardプラン(有料ユーザー向け)
レート : 100 RPS → 毎秒100リクエストまで定常的に処理
バースト: 200 リクエスト → 一時的なアクセス集中も200件まで許容
クォータ: 50,000 req/日 → 1日の合計リクエスト数は50,000件まで
■ Enterpriseプラン(法人ユーザー向け)
レート : 1,000 RPS → 毎秒1,000リクエストまで定常的に処理
バースト: 2,000 リクエスト → 一時的なアクセス集中も2,000件まで許容
クォータ: 制限なし → 累計リクエスト数の上限なし
このように、レートとバーストは「どれだけ速くリクエストできるか(瞬発力)」を、クォータは「1日にどれだけ使えるか(総量)」をそれぞれ独立してコントロールする設定です。
また、AWS News Blogでは使用プランによるスロットリングの活用について、ビジネス面と技術面の両方から説明されています。
From the business side, it allows you to use a Usage Plan to control how many requests each of your customers can make. From the technical side, it allows you to insulate the services that are used to implement the APIs from excessive requests.
(引用:New – Usage Plans for Amazon API Gateway)
| 観点 | 活用イメージ |
|---|---|
| ビジネス面 | プランごとに利用量を差別化し、上位プランほど多くリクエストできるようにする |
| 技術面 | バックエンド(LambdaやEC2など)が処理しきれる量に抑え、サービス全体を過負荷から守る |
4. スロットリングの4つのレベル(階層構造)
API Gatewayのスロットリングには4種類の設定レベルがあり、以下の優先順位で適用されます。上位レベルの上限を超える設定は下位レベルでは行えません。
API Gateway applies your throttling-related settings in the following order:
- Per-client or per-method throttling limits that you set for an API stage in a usage plan
- Per-method throttling limits that you set for an API stage
- Account-level throttling per Region
- AWS Regional throttling
(引用:Throttle requests to your REST APIs for better throughput in API Gateway)
【スロットリングの階層構造】
AWSリージョンレベル(変更不可・最上位)
└── アカウントレベル(デフォルト10,000 RPS・引き上げ申請可)
└── ステージ / APIレベル(使用プランで設定)
└── メソッド / クライアントレベル(最も細かい粒度)
| 優先順位 | レベル | 説明 | 変更可否 |
|---|---|---|---|
| 1位(最優先) | クライアント / メソッドレベル | 使用プランのAPIキーに紐づくクライアント・メソッド単位 | ✅ 可(アカウントレベル上限まで) |
| 2位 | ステージ / メソッドレベル | APIのステージ・メソッド単位で設定 | ✅ 可(アカウントレベル上限まで) |
| 3位 | アカウントレベル(リージョン単位) | アカウント内の全APIに適用 | ✅ 可(AWSサポートへ申請) |
| 4位(最上位) | AWSリージョンレベル | AWS全体で適用 | ❌ 不可 |
5. ステージ・API・メソッドとは
スロットリングの設定レベルに出てくる「ステージ」「API」「メソッド」が何を指すのか、それぞれ見ていきます。
ステージ(Stage)とは
A stage is a named reference to a deployment, which is a snapshot of the API. You use a Stage to manage and optimize a particular deployment. For example, you can configure stage settings to enable caching, customize request throttling, configure logging, define stage variables, or attach a canary release for testing.
(引用:Set up a stage for a REST API in API Gateway)
ステージとは、デプロイメント(APIのスナップショット)への名前付き参照です。prod(本番)や dev(開発)、beta といったデプロイ環境の単位にあたります。
ステージレベルのスロットリング設定は、そのステージに属するすべてのメソッドに適用されます。
APIレベルとは
These can be set at the API, or API method level.
(引用:Usage plans and API keys for REST APIs in API Gateway)
APIレベルとは、1つのAPI全体を対象とした設定の単位です。そのAPIの全ステージ・全メソッドに横断して適用されます。
メソッド(Method)とは
An API Gateway REST API is made up of resources and methods. A resource is a logical entity that an app can access through a resource path. A method corresponds to a REST API request that is submitted by the user of your API and the response returned to the user. A resource can have one or more operations that are defined by appropriate HTTP verbs such as GET, POST, PUT, PATCH, and DELETE. A combination of a resource path and an operation identifies a method of the API.
(引用:API Gateway use cases)
メソッドとは、リソースパスとHTTP動詞の組み合わせです。
【メソッドの例】
GET /pets → ペット一覧を取得する
POST /pets → ペットを新規登録する
PUT /pets/1 → ペット情報を更新する
DELETE /pets/1 → ペットを削除する
スロットリングの文脈では、Resource=/pets, Method=GET のように特定の組み合わせに対して個別の上限を設定することができます。
なぜメソッドレベルのスロットリングが必要なのか
ステージレベルのスロットリングは、そのステージ内の全メソッドに同じ上限を一律に適用します。しかし実際のAPIでは、メソッドによって負荷の特性が大きく異なります。
As an API developer, you can set the target limits for individual API stages or methods to improve overall performance across all APIs in your account.
(引用:Throttle requests to your REST APIs for better throughput in API Gateway)
メソッドレベルで個別に上限を設定することで、アカウント全体のAPIパフォーマンスを向上させることができます。
どういうときに使うのか
You can set additional throttling targets at the method level in Usage Plans. In the API Gateway console, these are set by specifying
Resource=<resource>,Method=<method>in the Configure Method Throttling setting.
(引用:Throttle requests to your REST APIs for better throughput in API Gateway)
使用プランでのメソッドレベルスロットリングの設定は、コンソールから以下のように行います。
(Optional) To turn on method-level throttling, do the following: Choose Method-level throttling, and then choose Add method. For Resource, select a resource from your API. For Method, select a method from your API. Enter a Rate and a Burst for your usage plan.
(引用:Set up usage plans for REST APIs in API Gateway)
具体的には、以下のようなケースでメソッドレベルのスロットリングが役立ちます。
【メソッドレベルスロットリングが役立つケースの例】
■ 負荷の大きいメソッドを他から守りたいとき
GET /reports → レポート生成など重い処理 → レートを低く設定して保護
GET /items → 軽い一覧取得 → レートを高く設定して快適に使える
■ 書き込み系と読み取り系で上限を分けたいとき
POST /orders → 注文登録(バックエンドのDB書き込みが重い) → レートを低めに設定
GET /orders → 注文一覧取得(読み取りのみ・軽い) → レートを高めに設定
■ 特定クライアントに特定メソッドだけ厳しく制限したいとき
APIキーAのGET /admin → 管理者向け操作 → バーストを小さく設定
このように、メソッドの処理コストや重要度に応じて細かくスロットリングを制御したいときにメソッドレベルの設定を活用します。
3つの関係まとめ
| レベル | 何を指すか | 設定の粒度 |
|---|---|---|
| APIレベル | 1つのAPI全体 | 全ステージ・全メソッドに横断して適用 |
| ステージレベル |
prod・dev などのデプロイ環境 |
そのステージに属する全メソッドに適用 |
| メソッドレベル |
GET /pets など個別のエンドポイント操作 |
最も細かい粒度で個別に適用 |
6. アカウントレベルのリミット一覧
スロットリングクォータ(リージョン単位)
Throttle quota per account, per Region across HTTP APIs, REST APIs, WebSocket APIs, and WebSocket callback APIs: 10,000 requests per second (RPS) with an additional burst capacity provided by the token bucket algorithm, using a maximum bucket capacity of 5,000 requests.
(引用:Amazon API Gateway quotas)
| 項目 | デフォルト値 | 引き上げ可否 |
|---|---|---|
| 定常リクエストレート(RPS) | 10,000 RPS | ✅ 可 |
| バーストキャパシティ(最大バケット容量) | 5,000 リクエスト | ❌ 不可 |
このスロットルはHTTP API・REST API・WebSocket API・WebSocket Callback APIすべてに横断して適用されます。
一部のリージョン(アフリカ(ケープタウン)、ヨーロッパ(ミラノ)、アジアパシフィック(ジャカルタ)など)では、デフォルト値が低く設定されています。
- 定常RPS:2,500
- バーストRPS:1,250
管理操作のクォータ(変更不可)
API自体の作成・デプロイ・管理操作にも固定のレート制限があります。代表的なものを以下に示します。
| 操作 | クォータ |
|---|---|
| CreateApiKey | 5 req/秒 |
| CreateDeployment | 1 req/5秒 |
| CreateDomainName | 1 req/30秒 |
| CreateRestApi(Regional/Private) | 1 req/3秒 |
| CreateRestApi(Edge最適化) | 1 req/30秒 |
| DeleteRestApi | 1 req/30秒 |
| PutRestApi | 1 req/秒 |
| 全操作の合計 | 10 req/秒(バースト 40 req/秒) |
7. まとめ
今回はAWS公式ドキュメントのみを参照して、API Gatewayのリミットとスロットリングを深掘りしました。
| 用語 | ひとことまとめ |
|---|---|
| スロットリング | リクエスト過多からバックエンドを守る仕組み |
| トークンバケット | トークンの補充と消費でリクエストレートを制御するアルゴリズム |
| レート | 1秒あたりのトークン補充速度=定常RPS |
| バースト | バケットの最大容量=瞬間的な最大リクエスト数 |
| クォータ | 日・週・月単位の累計リクエスト数の上限 |
| メソッド | リソースパス+HTTP動詞の組み合わせ(例:GET /pets) |
| ステージ |
prod・dev などのデプロイ環境の単位 |
スロットリングは4つのレベルで階層的に適用されます。上位レベルの上限を超えることはできないため、設定時は階層構造を意識することが大切です。
AWSリージョンレベル(変更不可)
└── アカウントレベル(引き上げ申請可)
└── ステージ / APIレベル
└── メソッド / クライアントレベル
最後まで読んでいただきありがとうございました!
参考
- Amazon API Gateway quotas
- Throttle requests to your REST APIs for better throughput in API Gateway
- New – Usage Plans for Amazon API Gateway(AWS News Blog)
- Building well-architected serverless applications: Regulating inbound request rates – part 1(AWS Compute Blog)
- REL05-BP02 Throttle requests(AWS Well-Architected Framework)
- Usage plans and API keys for REST APIs in API Gateway
- Set up a stage for a REST API in API Gateway
- Amazon API Gateway concepts
- API Gateway use cases