🐡

Laravel8で429エラーが出たときの対処法

2021/07/14に公開

自分が参考にしようとしていた記事が古くて、設定が少し変わっていたこともあり記事にしてみました。
Laravel8で429エラーが出た場合に、APIリクエスト制限を緩和する方法を試しました。

Kernel.phpでAPIリクエスト制限がされているか確認

まずはちゃんとAPIリクエスト制限がされているか確認します。ここが有効になっていないのに設定をいろいろいじっても何も意味がありません。

app/Http/Kernel.php'throttle:api' という記述があるか確認してください。
なかったら付け加えてください。

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        // \Illuminate\Session\Middleware\AuthenticateSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],

    'api' => [
        'throttle:api', // ←←← これがあるか確認
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
];

RouteServiceProvider.phpで制限を緩和する

app/Providers/RouteServiceProvider.php を見てください。

configureRateLimitingというメソッドの中に記述されています。
これは1分間に60回のリクエストという制限がかかれています。

protected function configureRateLimiting()
{
    RateLimiter::for('api', function (Request $request) {
        return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip());
    });
}

例えばこれを1分間に100回までという風に少し緩和してみます。

protected function configureRateLimiting()
{
    RateLimiter::for('api', function (Request $request) {
        return Limit::perMinute(100)->by(optional($request->user())->id ?: $request->ip());
    });
}

1時間に1万回という時間単位にしたい場合は perMinute の部分を perHour にしてあげれば良さそうです。

protected function configureRateLimiting()
{
    RateLimiter::for('api', function (Request $request) {
        return Limit::perHour(10000)->by(optional($request->user())->id ?: $request->ip());
    });
}

これでAPIリクエスト回数が緩和されました!

429エラーでお悩みの方はぜひやってみてください!

Discussion