こんにちは。
チーム開発はコミュニケーション
只野です。
開発がある程度終わり、顧客テスト用で本番環境で動かしていた「laravel11 + Jetstream + Livewire」の環境で「ファイルアップロードできません!」と連絡が来ました。
インフラ構成としてはロードバランサーでhttps化して、その後ろに2台httpで動いてるアプリを配置して負荷分散している構成だ。
この構成がLaravelの場合、プロトコルの問題で、証明書付きURLが正しく発行されなかったりでファイルアップロードが失敗するパターンもあるが、今回は設定を正しくしてそもそも動いていた環境なので、この線ではない。
現象を見るために開発ツールを使ってクライアントから動きを見てみると、「/livewire/upload-file」というURLが403エラーで帰ってきていた。これはLivewireが裏で動かしている共通のファイルアップロード処理のURLだ。
ここまでわかれば必ず原因はどこかにあると調べ始めて数時間…
「さっぱりわからない。」
「何もしてないけど壊れた!」
今まで動いてて急に動かなくなるんだもん。そりゃわからんよ。ってな話ですわ。
しょうがないからLaravelにログ仕込んで、ロードバランサーにログ仕込んで、ファイルアップロード動かしてはログ見てを繰り返したところ。
明らかに怪しいログを発見。
Livewireのファイルアップロード処理は標準実装すると下記のような感じでのURLでajax通信で一時ファイルが作られる。
“https://tadablo.com/livewire/upload-file?expires=1753677195&signature=03f365418fd1c47b720f71f52a62ffd338dd7207c3bbfb453”
そんで該当URLのロードバランサーのログを見たところ
ロードバランサ―の野郎が勝手に403エラーで返却してやがった!
なにやってんだ!
どうりでLaravel側のログには何も書かれないわけだ。
そんで対応だが、どうやらロードバランサーに紐づいてるWAFでこの辺りのブロックはしているらしいので、WAFにルールを追加する必要がある。
ルールは下記のように追加
WAF追加条件
条件ルールは2個作成して許可ルールにする。
追加ルールは優先順位を一番上にする※ここ重要
条件1
- 条件のタイプ=URLパス
- マッチタイプ=正規表現
- 条件文字=^/livewire/upload-file$
条件2
- 条件のタイプ=HTTPメソッド
- マッチタイプ=文字列に完全に一致
- 条件文字=POST
これでめでたし解決。
誰かが「WAF使わないとぽちっとな!」の連絡が来なかったから発見が遅れたのだろう。
WAFとかの詳しい機能はGoogle先生に聞いてください。