Webアプリケーションを自前サーバー(VPS)で運用する際、一番のネックになるのが「大容量ファイルの取り扱い」です。 例えば、数百MBもある財務データなどをVPSに直接アップロードしようとすると、メモリを圧迫し、最悪の場合はサーバーがダウンしてしまう危険性があります。
そこで今回は、ファイルの保存先としてGoogle Cloud Storage(GCS)を採用し、VPSの負荷を劇的に下げるインフラ基盤の準備手順をご紹介します。
特に、GCP初心者から中級者が必ずと言っていいほどつまずく「デフォルトで保護(サービスアカウントキー発行時の組織ポリシーエラー)」の解除方法についても詳しく解説していますので、ぜひ参考にしてください。
1. なぜVPS単体ではなく、GCS(クラウド)を連携させるのか?
今回構築するアーキテクチャ最大の目的は、「重いデータをサーバー(VPS)に触れさせないこと」です。
通常、ユーザーがファイルをアップロードすると「ブラウザ → サーバー → ストレージ」という経路をたどります。しかし、今回はGCSの「署名付きURL(Signed URL)」という仕組みを利用し、「ブラウザ → GCS」へ直接データを送り込みます。
これにより、メモリの少ないVPS環境でも、WordPressなどの既存システムと共存させながら、SaaSのような重いデータ処理を伴うWebアプリを安定して稼働させることが可能になります。
2. プロジェクトの準備とGCSバケットの作成
まずは、データの保管庫となるGCSの準備を進めます。
- プロジェクトの作成: Google Cloudコンソール(またはFirebaseコンソール)から、新しいプロジェクトを作成します。
- バケットの作成: GCSのメニューから「バケットの作成」をクリックします。
- バケット名: 今回は例として
finance-data-puffin-2026としました。全世界で一意である必要があります。 - リージョン: レイテンシ(通信の遅延)を最小限にするため、日本の大阪リージョン(または東京リージョン)を選択します。
- バケット名: 今回は例として
3. 【最大の壁】「デフォルトで保護」ポリシーを解除する
バケットが完成したら、次にアプリからGCSを操作するための「サービスアカウント」と「キー(鍵)」を発行します。 しかし現在、GCPではセキュリティ強化のため、デフォルトでキーの発行がブロックされる仕様になっています。ここでエラーにつまずく人が非常に多いです。
発生するエラー
サービスアカウントキーを作成しようとすると、「組織のポリシーにより、サービスアカウントキーの作成は許可されていません」といったエラー(デフォルトで保護)が表示され、JSONキーがダウンロードできません。
ポリシーの解除(上書き)手順
この制限を解除するには、以下の手順を踏みます。
- GCPコンソールの検索窓で「組織のポリシー」と検索し、メニューを開きます。
- ポリシーのリストの中から「サービス アカウント キーの作成を無効にする」(
constraints/iam.disableServiceAccountKeyCreation)を探してクリックします。 - 画面上部の「ポリシーを管理」をクリックします。
- 「親のポリシーを適用する」から「ポリシーをカスタマイズする(上書き)」に変更します。
- ルールの値を「オン(無効化を有効にする)」から「オフ(無効化しない=キー作成を許可する)」に変更して保存します。
数分待つとポリシーが反映され、無事にキーの発行ができるようになります。
4. サービスアカウントキー(JSON)の発行と厳重管理
制限が解除できたら、再度キーの発行を実行します。
- 「IAMと管理」>「サービスアカウント」へ移動。
- 対象のサービスアカウントの「キー」タブを開き、「鍵を追加」>「新しい鍵を作成」をクリック。
- JSONを選択して作成します。
【超重要】キーの管理について ダウンロードされたJSONファイルは、GCP上のリソース(今回ならGCSのバケット)を自由に操作できてしまう**「マスターキー(合鍵)」**です。 絶対にGitHubなどの公開リポジトリにアップロードしてはいけません。1Passwordなどのパスワードマネージャーを使用し、プロジェクトメンバー以外がアクセスできない場所に厳重に保管してください。
まとめ:インフラの土台作りが完了!
お疲れ様でした!これでクラウド側の準備は完璧です。
- 大阪リージョンでのGCSバケット作成
- 厄介な組織ポリシーの解除
- JSONキーの安全な発行と保管
この3ステップが完了したことで、あとはバックエンド(FastAPIなど)からこのJSONキーを読み込ませるだけで、GCSを自由に操作できるようになります。
次のステップでは、いよいよフロントエンド(React)とバックエンドを連携させ、ブラウザから直接GCSへ大容量ファイルをアップロードする機能の開発に進んでいきましょう!
