Open2
ユーザーにS3(互換)ストレージへの「1回きりのアップロード」を許可する の裏話

書いた経緯
3年半ほど前に自分用につくったストリーミングサービス(非公開)で、この手法を使ったのを思い出したので。
当時WasabiというS3互換のストレージサービスを使っていたのもあって検索したけどこれといったソリューションが見つからず、自力でひらめいた(既出だと思うけど)のがこれだった。
もしかしたらまだそんなに知られてないかもしれないと思ったので今更書いてみた。
この手法は、マルチパートアップロードさえサポートしていればどのS3互換のストレージサービスでも使えるのが利点。また、オブジェクトをコピーしたり移動する必要もない。

ストリーミングサービスの思い出
アップロードされた音楽ファイルをWebブラウザが再生できるような形式に変換する必要があった。
構成としては、
- バックエンド: モノリシックなVPSでDocker ComposeでNode.js、PostgreSQL、HAProxyを動かす
- 当時まだD1はなかった
- フロントエンド: Vue.jsでPWAに対応したSPAを作りCloudflare Pagesで展開
- 音楽データストレージ: Wasabi
- 当時まだR2はなかった
- 音楽データ配信用のCDN: Workers
- 認証してWasabiからデータを取ってくるだけ
- クライアント側のキャッシュを活用したかったので、データのURLを固定化したかった
- ここでクライアント側の認証(JWTの入ったCookie)を、その時々で計算したプリサインドURLに変換してた
- 画像や音楽データの変換: Google Cloud Run / AWS Lambda
- 元ファイルの容量に応じて呼び分け
といった形。
アップロードはワークロードが頻繁に変わるので(特に利用者が少ないと)、VPSやEC2のようにインスタンスを事前に割り当てるよりも、オンデマンドで呼び出せるもののほうが有利。
というわけでユーザーからの入力を一旦オブジェクトストレージに置く必要があったんですね。
ちなみに今回のようなサービスに関する著作権法上の懸念点については、それを解説する文化庁の資料がある。