FLARES LLC
FLARES LLC

Technical document

GCS署名付きURLで直接アップロードする設計

大きなファイルをアプリサーバー経由でアップロードすると、サーバー負荷が増えます。署名付きURLを使うと直接アップロードできますが、確定処理と権限管理を設計する必要があります。 署名付きURLアップロードは、サーバー負荷を下げる便利な方式ですが、予約、検証、確定の状態管理を設計しないと危険です。
ストレージ / アップロード約10分公開日 2026年7月5日更新日 2026年7月5日
GCS署名付きURLで直接アップロードする設計のアイキャッチ

Summary

この文書の要点

  • 署名付きURL発行前にユーザー権限とファイル条件を確認する。
  • アップロード前に仮レコードを作り、完了後に確定する。
  • アップロード前にDBへ予約レコードを作り、完了後にサイズ、MIME、checksumを検証する。
  • 署名付きURLは短命にし、用途、ユーザー、ファイルIDを紐付けて発行する。

どこが設計の難所か

直接アップロードは効率的ですが、署名付きURLを発行すると、そのURLを持つクライアントが一定時間アップロードできます。保存先やファイル条件を制限しないと、意図しないオブジェクトが置かれる可能性があります。

ブラウザからのアップロードは途中で中断されます。アップロード成功後にアプリDBの登録が失敗することもあります。DBとGCSの整合性を後から回復できる設計が必要です。

GCSへブラウザから直接アップロードすると、アプリサーバーを経由しないため大きなファイルに向きます。一方で、サーバーが実際のファイル内容を見ないまま完了扱いにすると、権限外アップロードや不正な形式を見逃します。

境界をどう切るか

APIでアップロード予定を作成し、ユーザー権限、ファイル名、サイズ、MIMEタイプを確認してから署名付きURLを返します。クライアントはGCSへ直接アップロードし、完了後にAPIへ確定を通知します。

設計では、アップロード予約、署名付きURL発行、クライアントアップロード、完了通知、検証、利用可能化を分けます。署名付きURLはファイルIDと利用者に紐付け、期限と許可メソッドを限定します。

実装で効く細部

DBには仮ファイルレコードを作り、状態を`pending`、`uploaded`、`confirmed`、`expired`のように管理します。オブジェクトキーはサーバー側で生成し、クライアントに自由入力させません。確定時にGCSのメタデータを確認します。

Cloud Run側では、予約時にstorage_keyを生成し、GCS署名付きURLを発行します。完了通知後にGCS metadataを取得し、サイズ、content-type、generationをDBと照合してからavailableへ遷移させます。

  • 元ファイル名をobject keyに使わず、推測できないIDで保存する。
  • 完了通知を信用せず、GCS上の実体とmetadataをサーバー側で確認する。
  • 期限切れや途中失敗の予約レコードを掃除するジョブを用意する。

壊れ方を観測する

検証では、期限切れURL、MIMEタイプ不一致、アップロード後の確定失敗、仮レコード放置、権限外ユーザーの確定を確認します。大容量ファイルやモバイル回線での中断も見ます。

検証では、期限切れURL、別ユーザーのURL利用、サイズ超過、MIME偽装、完了通知なしのファイルを確認します。GCSのgenerationを使い、同じkeyの上書きが想定外に起きないことも見ます。

捨てた選択肢とトレードオフ

直接アップロードはサーバー負荷を下げますが、フローは複雑になります。小さなファイルだけならアプリサーバー経由の方が単純です。ファイルサイズや頻度を見て採用を判断します。

直接アップロードはスケールしやすい一方、状態管理が増えます。小さいファイルだけならアプリ経由アップロードの方が単純な場合もあります。ファイルサイズ、セキュリティ、実装コストで方式を選ぶべきです。

現場に残す判断軸

GCS署名付きURLは、アップロード経路を効率化する道具です。仮登録、確定、未確定掃除まで含めて設計することで、DBとストレージのずれを抑えられます。

署名付きURLは、アップロード経路を開ける仕組みです。安全に使うには、URL発行前後のDB状態とGCS実体の検証をセットで設計する必要があります。

Technical documents

技術文書を増やしていきます。

AI、クラウド、業務アプリ開発、要件定義、運用設計に関する考え方を、今後も文書として整理します。

技術文書一覧へ