Laravel9がステータスコード429を返す問題とその対策

はじめに

とある問題が発生し、ログを調べたところ、Laravel 9のAPIが見慣れないステータスコード429を返していました。

この記事では、ステータスコード429とは何か、どのような状況で発生するのか、そしてどのように対処すればよいのかを解説します。

ステータスコード429とは?

HTTPステータスコード「429 Too Many Requests」は、クライアントが一定期間内に許可されたリクエストの数を超過した場合に返されるエラーです。このエラーは、サーバーの負荷を軽減し、DoS攻撃や過剰なAPIアクセスからシステムを守るための防御手段として機能します。

Laravelではこの機能を「レート制限」で実装しており、これによってAPIやリソースへの過剰なアクセスを防ぐことができます。

参考

Laravelでのレート制限の仕組み

Laravelでは、特定のAPIルートやリソースに対して、一定時間内に許可されるリクエスト数を制限する「レート制限」が提供されています。この機能により、過剰な負荷を避け、安定したAPI提供が可能となります。制限に達した場合、クライアントにはHTTPステータスコード「429 Too Many Requests」が返されます。

Laravelのレート制限は、デフォルトでthrottleミドルウェアによって制御されます。たとえば、app/Http/Kernel.phpで以下のように定義されています。

'api' => [
    // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
    'throttle:api',
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],

この’throttle:api’は、APIルートに対してデフォルトのレート制限を適用するもので、通常1分間に60リクエストが許可されています(ただし、バージョンや設定によって異なる場合があります)。

Laravelでのステータスコード429の対策

1. レート制限の調整

デフォルトのレート制限が厳しすぎる場合、これを緩和することができます。throttleミドルウェアによるレート制限は、アプリケーションの要件に合わせて簡単に調整できます。

たとえば、APIルートに対して1分間に60リクエストを許可していた設定を、1分間に100リクエストに変更したい場合は、app/Http/Kernel.phpで以下のように設定を変更します。

'api' => [
    'throttle:100,1',  // 1分間に100リクエストに緩和
    \Illuminate\Routing\Middleware\SubstituteBindings::class,
],

この設定では、1分間に100リクエストが許可されるようになっています。throttleの第1引数は最大リクエスト数、第2引数は時間(分)を表します。

2. カスタムレート制限の設定

より柔軟なレート制限を実現したい場合、カスタムのレート制限を設定することが可能です。例えば、特定のユーザーに対して異なるレート制限を適用したり、特定のエンドポイントでのみ制限を変更したりできます。

カスタムレート制限を設定するには、RouteServiceProvider.phpで以下のように編集します。

    /**
     * Configure the rate limiters for the application.
     *
     * @return void
     */
    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(100)->by(optional($request->user())->id ?: $request->ip());
        });
    }

この例では、APIエンドポイントに対して1分間に100リクエストの制限が設定されています。byメソッドは、ユーザーIDが利用可能な場合はユーザーIDに基づいて制限を適用し、それがない場合はクライアントのIPアドレスに基づいて制限を適用します。これにより、異なるユーザーやIPごとに独立したレート制限が管理されます。

さらに、ユーザーの役割や時間帯、特定のリクエストタイプに応じて異なる制限を設けることも可能です。これにより、例えば管理者は高いレート制限を持ち、一般ユーザーには標準的な制限を設ける、といった柔軟な運用が実現できます。

まとめ

ステータスコード「429 Too Many Requests」は、Laravelのレート制限により発生します。デフォルト設定では、通常1分間に60回以上のリクエストを送信するとこのエラーが返されますが、これらの制限は簡単にカスタマイズできます。

レート制限はAPIの安定運用にとって重要な機能です。負荷を軽減し、DoS攻撃を防ぐための対策として活用することで、システム全体のパフォーマンスを維持できます。必要に応じてレート制限を緩和したり、特定の条件に合わせたカスタマイズを行い、最適な設定を目指しましょう。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください