fastAPI で1分間にNリクエストがきたら Error 429 Too Many Requests を発生させる

May 21, 2024, 4:37 AM
おうちDCは、リソースが限られています。何も設定しないと、ひたすらユーザーをまたせた挙句に、504 Gateway Timeout を発生させてしまいます。
ならば、予めアクセスの上限を設けて、429 Too Many Requests を素早く返してあげる方が良いかと思いますので、その設定についてまとめます。

slowapi のインストール

$ pipenv install slowapi

main.py の設定

私は fastAPI を使うときは、main.py という名前でファイルを作っていますが、別のファイル名の場合は、そちらを編集してください。

ライブラリの読み込み

from slowapi import Limiter
from slowapi.errors import RateLimitExceeded
from slowapi.util import get_remote_address
from slowapi.middleware import SlowAPIMiddleware
from starlette.responses import JSONResponse

Limiterの設定

app = FastAPI() より下に書いてください
limiter = Limiter(key_func=get_remote_address)
app.state.limiter = limiter
app.add_middleware(SlowAPIMiddleware)

RateLimitExceeded 例外ハンドラの追加

@app.exception_handler(RateLimitExceeded)
async def rate_limit_exceeded_handler(request: Request, exc: RateLimitExceeded):
return JSONResponse(
status_code=429,
content={"detail": "Too many requests"},
)

ルーター設定

@app.get("/")
@limiter.limit("6/minute")
async def root(request: Request):
 pass
上記は、1分間に6回以上アクセスが来た場合に 429 エラーを発生させます。


Locust で おうちDCで運用中の Next.js ウェブアプリの負荷テストを実施するLocust で おうちDCで運用中の Next.js ウェブアプリの負荷テストを実施する
Kubernetes ネームスペース(namespace)周りのまとめ