FlaskでCloud Storage (GCS) にファイルを保存する方法を徹底解説!
生徒
「Flaskで作ったアプリで、ユーザーがアップロードした画像を保存したいです。でも、自分のパソコンやサーバーに直接保存するのは良くないって聞いたのですが、本当ですか?」
先生
「はい、その通りです。サーバーの容量には限りがありますし、壊れた時にデータが消えてしまうリスクもあります。そこで、Google Cloud Storage(GCS)というクラウド上の大きな倉庫を使うのが一般的ですよ。」
生徒
「クラウド上の倉庫ですか!それなら安心してたくさんのファイルを預けられそうですね。設定は難しいのでしょうか?」
先生
「準備をしっかり行えば、初心者の方でも大丈夫です。Pythonのプログラムから魔法の杖を使って、Googleの倉庫へファイルを飛ばす方法を学んでいきましょう!」
1. Google Cloud Storage (GCS) とは何か?
まず、今回使う道具の正体を知っておきましょう。Google Cloud Storage(グーグル・クラウド・ストレージ)、略してGCSは、Googleが提供しているインターネット上の「ファイル保管箱」です。皆さんが普段使っているGoogleドライブの、プロフェッショナル版や開発者版だとイメージすると分かりやすいでしょう。
GCSの最大の特徴は、非常に頑丈で、かつ無限に近い容量があることです。自分のパソコン(ローカル環境)にファイルを保存すると、パソコンが壊れたらおしまいですが、GCSに預ければ世界中のどこからでも安全に取り出すことができます。Webアプリでユーザーの写真や動画を扱うときは、このGCSのような外部のオブジェクトストレージ(データを物体として扱う保管場所)を使うのが業界の常識となっています。
2. GCSを使うための「バケット」を作成しよう
GCSを利用するには、まず「バケット」というものを作る必要があります。バケットとは、ファイルをまとめて入れるための「バケツ」や「大きなフォルダ」のことです。Google Cloudの管理画面(コンソール)にログインして、このバケツを用意しましょう。
バケットを作るときには、名前を決めます。この名前は世界中でたった一つの名前にしなければなりません。誰かがすでに使っている名前は使えないので、自分の名前や日付を混ぜて工夫してみてください。また、データの保存場所(リージョン)を選びます。日本に住んでいる人向けのアプリなら「東京(asia-northeast1)」などを選ぶと、通信が速くなって快適です。設定が終われば、あなた専用のクラウド倉庫が完成します。
3. PythonからGCSを操作するためのライブラリを導入
FlaskというPythonの道具からGCSを操作するためには、専用の追加パーツをインストールする必要があります。これをライブラリと呼びます。今回は、Googleが公式に提供している「google-cloud-storage」というライブラリを使います。
パソコンの「黒い画面」(コマンドプロンプトやターミナル)を開いて、以下のコマンドを入力してください。これにより、PythonがGoogleの倉庫と通信するための翻訳機を手に入れることができます。
pip install google-cloud-storage flask
この一行を実行するだけで、あなたのパソコンに最新の通信ツールがダウンロードされます。プログラミング未経験の方にとって、この黒い画面の操作は緊張するかもしれませんが、一文字ずつ正しく打てば魔法のように環境が整います。
4. 秘密の鍵「サービスアカウント」を発行する
Googleの倉庫は誰でも勝手に入れるわけではありません。あなたのプログラムが「私は持ち主です」と証明するための秘密の鍵(認証情報)が必要です。これをサービスアカウントキーと呼びます。
管理画面からサービスアカウントを作成し、JSON(ジェイソン)という形式のファイルをダウンロードしてください。このファイルには、あなたの倉庫を開けるための大切な合言葉が書かれています。絶対に人に見せたり、インターネット上に公開したりしてはいけません。このファイルを自分のプログラムと同じフォルダに置いて、準備完了です。この鍵をPythonに読み込ませることで、ようやく通信が許可されます。
5. Flaskでファイルをアップロードする基本コード
お待たせしました!実際にファイルをGCSへアップロードするプログラムを書いてみましょう。まずは一番シンプルな、文字を書いたテキストファイルをクラウドへ飛ばす例です。
from google.cloud import storage
import os
# 鍵ファイルの場所を指定します
os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "your-key.json"
def upload_text_to_gcs(bucket_name, destination_blob_name, text):
# クライアント(通信の窓口)を作ります
storage_client = storage.Client()
# 指定したバケツを探します
bucket = storage_client.bucket(bucket_name)
# バケツの中の「どこに」「どんな名前で」保存するか決めます
blob = bucket.blob(destination_blob_name)
# 実際にテキストを保存します
blob.upload_from_string(text)
print(f"{destination_blob_name} が無事にアップロードされました!")
# 実行してみる
upload_text_to_gcs("my-new-bucket-2026", "hello.txt", "クラウドの世界へようこそ!")
このコードの中にあるblob(ブロブ)という言葉は、クラウド上に保存されるファイルそのものを指します。upload_from_stringという命令一つで、あなたのパソコンからGoogleの巨大なサーバーへデータが瞬時に移動します。これがクラウド連携の第一歩です。
6. ユーザーが選んだ画像をGCSに保存する方法
次は、Webアプリらしく、ブラウザの画面から選んだ画像を保存する機能を作ります。Flaskの機能を使って、ユーザーが「アップロード」ボタンを押した瞬間にGCSへ転送する仕組みです。
from flask import Flask, request
from google.cloud import storage
app = Flask(__name__)
@app.route('/upload', methods=['POST'])
def upload_image():
# 画面から送られてきたファイルを受け取ります
file = request.files['user_image']
if file:
client = storage.Client()
bucket = client.bucket("あなたのバケット名")
# ファイル名そのままの形でクラウドに保存します
blob = bucket.blob(file.filename)
# ファイルのデータそのものをアップロード!
blob.upload_from_file(file)
return "クラウドに画像を保存しました!"
return "ファイルがありません。"
if __name__ == "__main__":
app.run(debug=True)
このプログラムを使えば、自分のパソコンの容量を全く使わずに、世界中から送られてくる画像をどんどん保存できます。request.filesという命令が、ユーザーのスマホやPCから送られてきた画像をつかまえる役割をしています。
7. HTML画面を作ってアップロードを試そう
プログラムだけでは動きを確認しにくいので、簡単な見た目(HTML)も用意しましょう。FlaskはこのHTMLを表示させるのも得意です。以下のような画面を作れば、マウス操作でファイルをアップロードできるようになります。
<div class="card p-4 shadow-sm">
<h3 class="mb-3">クラウドへファイルを送ろう</h3>
<form action="/upload" method="post" enctype="multipart/form-data">
<input type="file" name="user_image" class="form-control mb-3">
<button type="submit" class="btn btn-primary">
<i class="bi bi-cloud-arrow-up"></i> アップロード開始
</button>
</form>
</div>
このHTMLの中にあるenctype="multipart/form-data"という部分は、画像を扱うときに必要な「おまじない」です。これがないと、画像が細かく分解されて送られず、うまく保存できません。初心者がよく忘れてしまうポイントなので、しっかり覚えておきましょう。
8. 保存したファイルをみんなに見せる設定
せっかくクラウドに保存した画像も、自分だけしか見られない設定だとWebアプリとしては不便です。GCSの設定で「公開アクセス」を許可するか、プログラムから「公開用のURL」を発行するように設定しましょう。
以下のコードを使えば、保存したファイルの場所を示すURLを取得できます。これをウェブサイトに貼り付ければ、誰でもその画像を見ることができるようになります。ただし、個人情報などは公開設定にしないよう、取り扱いには十分注意してくださいね。
def get_file_url(bucket_name, file_name):
client = storage.Client()
bucket = client.bucket(bucket_name)
blob = bucket.blob(file_name)
# 誰でも見られる公開URLを返します
return blob.public_url
# 例: https://storage.googleapis.com/バケット名/hello.png のようなURLが取得できます
このように、URLを発行することで、あなたのWebサイトに画像を埋め込むことができるようになります。GCSは非常に配信スピードが速いので、世界中の人が同時にあなたのサイトを見ても、画像がパッと表示されますよ。
9. 保存されたファイルを削除・管理する方法
クラウド倉庫は便利ですが、不要なファイルを放っておくと料金がかさんでしまいます。必要なくなったファイルを消す方法も知っておきましょう。これもPythonから一行で実行できます。管理画面で一つずつ手作業で消す必要はありません。
def delete_file(bucket_name, file_name):
client = storage.Client()
bucket = client.bucket(bucket_name)
blob = bucket.blob(file_name)
# クラウド上のファイルを削除します
blob.delete()
print(f"{file_name} を倉庫から片付けました。")
このように、FlaskとGCSを連携させれば、ファイルの「アップロード」「表示」「削除」という一連の流れをすべて自動化できます。パソコン操作に慣れていない方でも、一度この流れを作ってしまえば、あとはシステムが勝手に働いてくれます。クラウドの力を借りて、より高度で便利なWebアプリ作りに挑戦してみてください!