PCS開発チーム

PCS開発チーム

Laravel Vapor+Amazon S3+Livewireファイルアップロードの不具合

  • Livewire 3.5.4

Livewireでファイルをアップロードする時は一時ファイルを作ってから本来の場所にファイルを移動する。この辺りはLivewireが自動で行っていることなので気にしなくていい。
https://livewire.laravel.com/docs/uploads#uploading-directly-to-amazon-s3

一時ファイルを作る場所はlocalでもS3に直接でもいい。ここでS3に直接を選択した場合、S3に一時ファイルがずっと残り続けることになるのでS3のライフサイクルルールで自動的に削除する設定が必要。Livewireが用意してるコマンドがあるのでこれを本番環境で実行すればいい。

php artisan livewire:configure-s3-upload-cleanup

Livewire 3.5.4時点ではここに理由が不明な不具合がある。
S3側のライフサイクルルールを見るとコマンド実行直後はプレフィックスがlivewire-tmpで設定されているけど、少し待ってから見るとなぜかtmp/に勝手に変更されている。
自動で削除するはずの一時ファイルが削除されないのでずっと残り続けて無駄な費用が発生。

Livewireが原因でないならS3側なので対応としてはconfig/livewire.phpを公開して一時ファイルの保存場所を変更。これなら勝手にtmp/に変わっても影響なく削除される。

        'directory' => 'tmp',   // Example: 'tmp'                      | Default: 'livewire-tmp'

追加 Vaporもtmpを使っている

https://docs.vapor.build/resources/storage.html#temporary-storage
ということはこれはLivewireのルールをVaporが上書きしてるのが原因かも。
「Vaporがライフサイクルルールを自動で設定している」なんて説明はどこにもないので気付くのは難しい。

正確なVapor側の動作は「既存ルールを全部削除してから新しいルールを作成」
ここでLivewireのルールが消えてる。
これをVaporでのデプロイ時に実行してるので勝手に上書きされるように見える。
ルールを削除してからデプロイしたら新しいルールが増えたのでVaporが原因で確定。

解決策は同じでLivewireでもtmpを使う。Vapor側が固定で何も変更できないのでLivewire側を変えるしかない。