レート制限パターン

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 キーベース制限      ↑ ユーザーベース制限

レイヤーごとに異なる粒度でレート制限を適用する。

レート制限パターンの理解を深めるには関連書籍が参考になる。

関連用語