【ツール活用|豆知識】APIを守る砦!k6を用いた「レート制限」の自動テスト術

導入: なぜレート制限のテストが重要なのか

APIを公開する際、特定のクライアントによる過剰なアクセスからシステムを守ることは、サービスの可用性を維持するために不可欠です。もしレート制限が正しく機能していなければ、一部のユーザーのバグや悪意あるリクエストによってサーバーがダウンし、他の正当なユーザーまでサービスを利用できなくなる恐れがあります。本稿では、最新の負荷テストツール「k6」を使用して、APIが期待通りに HTTP 429 エラーを返却するかを確認するテスト手法を解説します。

基礎知識: レート制限とHTTP 429

レート制限(Rate Limiting)とは、一定期間内にユーザーが実行できるリクエスト数を制限する仕組みです。この制限を超えたリクエストに対して、サーバーはHTTP 429 (Too Many Requests) ステータスコードを返却します。これは「リクエストが多すぎるため、現在は受け付けられない」ことを示す標準的なレスポンスです。テストでは、この429が正しく返却されるか、またその際バックエンドの負荷が適切に制御されているかを確認します。

実装/解決策

テストでは「短時間で大量のリクエストを送り、制限が発動するタイミングを観測する」というシナリオを構築します。k6を使用すれば、JavaScriptで簡単にテストコードを記述でき、並行リクエストの制御も柔軟に行えます。以下の手順で検証を行います。
1. APIのレート制限設定値を確認する(例: 1分間に10リクエスト)。
2. k6でその上限を超える負荷をシミュレーションする。
3. レスポンスのステータスコードを集計し、429が返っていることをアサーション(判定)する。

サンプルプログラム

以下のコードは、1秒間に20リクエストを送信し、制限を超えた場合に正しく429が返るかを検証するk6スクリプトです。

import http from 'k6/http';
import { check } from 'k6';

// テストの設定
export const options = {
  vus: 10, // 仮想ユーザー数
  duration: '5s', // テスト実行時間
};

export default function () {
  const url = 'https://api.example.com/data';
  const res = http.get(url);

  // ステータスコードが200または429であることを期待する
  check(res, {
    'ステータスが200または429であること': (r) => r.status === 200 || r.status === 429,
    '制限超過時は429が返ること': (r) => r.status === 429 ? r.status === 429 : true,
  });
}

応用・注意点

現場でテストを行う際には、以下の点に注意してください。
1. テスト環境の隔離: 負荷テストは本番環境や共有の開発環境で行うと、他のエンジニアに迷惑がかかる可能性があります。必ず専用の隔離された環境で実行してください。
2. 誤検知の回避: ネットワークの遅延により、期待通りのタイミングで429が返らないことがあります。テストが失敗する場合は、許容範囲(マージン)を考慮したアサーションを記述しましょう。
3. ログの確認: 429が返った際、サーバー側で適切に「拒否ログ」が出力されているかも併せて確認してください。これにより、将来的なトラブルシューティングが容易になります。

コメント

タイトルとURLをコピーしました