全力で怠けたい

怠けるために全力を尽くしたいブログ。

Redash のログインページにアクセスすると `429 Too Many Requests` になるときにやったことのメモ。

サービスの運営で Redash を使っているんだけど、ブラウザーでログインページにアクセスすると 429 Too Many Requests が表示されるときにやったことのメモ。

ログインページにアクセスすると 429 Too Many Requests

ブラウザーで Redash のログインページにアクセスすると 429 Too Many Requests の表示になるようだった。 50 per 1 hour とも表示しているので API のレートリミットにひっかかってるとかっぽい。

f:id:ebc_2in2crc:20200502020005p:plain:w300

一応 curl でアクセスしてみるけどやっぱり 429 が返ってきているようだった。

$  curl --head http://localhost/login
HTTP/1.1 429 TOO MANY REQUESTS
Server: nginx/1.9.10
Date: Fri, 01 May 2020 17:02:34 GMT
Content-Type: text/html
Content-Length: 141
Connection: keep-alive

やったこと

見てみた

Redash の discuss にずばりな 429 Too Many Requests ってのがあって、そこを見てみると authentication.py がログインページのアクセス制限をしているっぽい。

@routes.route(org_scoped_rule("/login"), methods=["GET", "POST"])
@limiter.limit(settings.THROTTLE_LOGIN_PATTERN)
def login(org_slug=None):

settings.THROTTLE_LOGIN_PATTERNinit.pyREDASH_THROTTLE_LOGIN_PATTERN 環境変数の値を突っ込んでるので REDASH_THROTTLE_LOGIN_PATTERN 環境変数の値をいじればログインページへのアクセス制限を調整できそう。

THROTTLE_LOGIN_PATTERN = os.environ.get("REDASH_THROTTLE_LOGIN_PATTERN", "50/hour")

実際にやったこと

THROTTLE_LOGIN_PATTERN 環境変数の設定

ログインページのアクセス数が制限を超過しているのが原因なのだけど、ログインページのアクセス数を減らすことは難しそうだったので雑に制限を緩めることにした。 redash.env ファイルに REDASH_THROTTLE_LOGIN_PATTERN=1000/hour を追加して Redash を再起動したらログインページにアクセスするとちゃんとログインページが表示して、しつこくリロードしても 429 Too Many Requests は出なくなった。

アクセス情報を保存している Redis のキーを消す

Redash が運用中で再起動ができないとかって状況のときもあると思うけど、そんなときは Redash がアクセス情報を保存している Redis のキーを消しちゃえばログインページにアクセスできるようになる。 急場しのぎにすぎないけど覚えておいて損はなさそう。

$ redis-cli keys *redash.login*
1) "LIMITER/xxx.xxx.xxx.xxx/redash.login/50/1/hour"
$ redis-cli del "LIMITER/xxx.xxx.xxx.xxx/redash.login/50/1/hour"
(integer) 1

参考サイト