レート制限パターン
API やサービスへのリクエスト数を制限し、過負荷やリソース枯渇を防ぐ設計パターン
API設計パターン
レート制限パターンとは
レート制限 (Rate Limiting) は、API やサービスへのリクエスト数に上限を設け、過負荷やリソース枯渇を防ぐ設計パターンである。DDoS 攻撃の緩和、公平なリソース配分、コスト制御に使われる。
主要なアルゴリズム
| アルゴリズム | 特徴 | 用途 |
|---|---|---|
| 固定ウィンドウ | 時間窓ごとにカウント | シンプルな API 制限 |
| スライディングウィンドウ | 直近 N 秒のカウント | より正確な制限 |
| トークンバケット | トークンを一定速度で補充 | バースト許容 |
| リーキーバケット | 一定速度でリクエストを処理 | 平滑化 |
API Gateway はトークンバケットアルゴリズムを使用する。ThrottlingRateLimit がトークン補充速度、ThrottlingBurstLimit がバケットサイズ。
DynamoDB でのレート制限
async function checkRateLimit(userId: string, limit: number): Promise<boolean> {
const now = Math.floor(Date.now() / 1000);
const windowKey = `${userId}:${Math.floor(now / 60)}`; // 1分ウィンドウ
const result = await db.update({
TableName: 'rate-limits',
Key: { pk: windowKey },
UpdateExpression: 'ADD #count :inc SET #ttl = :ttl',
ExpressionAttributeNames: { '#count': 'count', '#ttl': 'ttl' },
ExpressionAttributeValues: { ':inc': 1, ':ttl': now + 120 },
ReturnValues: 'ALL_NEW',
});
return result.Attributes!.count <= limit;
}
レスポンスヘッダー
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 42
X-RateLimit-Reset: 1711929600
HTTP/1.1 429 Too Many Requests
Retry-After: 30
多層防御
CloudFront (WAF) → API Gateway (スロットリング) → Lambda → DynamoDB
↑ IP ベース制限 ↑ API キーベース制限 ↑ ユーザーベース制限
レイヤーごとに異なる粒度でレート制限を適用する。
レート制限パターンの理解を深めるには関連書籍が参考になる。