【Livewire】AWSでロードバランサー使ったらファイルアップロードできなくなった件。

こんにちは。

チーム開発はコミュニケーション

只野です。

開発がある程度終わり、顧客テスト用で本番環境で動かしていた「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先生に聞いてください。

 

コメントを残す

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