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が用意してるコマンドがあるのでこれを本番環境で実行すればいい。 ```bash php artisan livewire:configure-s3-upload-cleanup ``` Livewire 3.5.4時点ではここに理由が不明な不具合がある。 S3側のライフサイクルルールを見るとコマンド実行直後はプレフィックスが`livewire-tmp`で設定されているけど、少し待ってから見るとなぜか`tmp/`に勝手に変更されている。 自動で削除するはずの一時ファイルが削除されないのでずっと残り続けて無駄な費用が発生。 Livewireが原因でないならS3側なので対応としては`config/livewire.php`を公開して一時ファイルの保存場所を変更。これなら勝手に`tmp/`に変わっても影響なく削除される。 ```php '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側を変えるしかない。