今回はローカルPCで実行されているPythonスクリプトから、GCPにあるCloud Storageに画像ファイルをアップロードする方法を紹介します。
Cloud Storageにファイルをアップロードする方法
最初に大まかな流れを説明します。
- Cloud Storageにアクセスできるサービスアカウントを作成する
- 作成したサービスアカウントの認証情報をダウンロードする
- Pythonスクリプトで認証情報を読み取り、Cloud Storageにファイルをアップロードする
Cloud StorageとはGCPのオブジェクトストレージになります。無期限5GBの無料枠があります。
サービスアカウントとは、ユーザーではなくアプリケーションや仮想マシンで使用される特別なアカウントです。
例えば今回であれば、「画像ファイルをアップロードするPythonアプリケーション自体」が使用するアカウントがサービスアカウントとなります。
このサービスアカウントにGoogle Cloudの管理を行える権限を与えておくことで、PythonアプリケーションはGoogle Cloudにファイルをアップロードできるようになるという仕組みです。
Cloud Storageにファイルをアップロードする実行手順
まずはサービスアカウントを作成するために、以下のリンクから認証情報ページを開きます。
認証情報を作成ボタンを押し、サービスアカウントを選択します。
適当なサービスアカウント名(storage-service)を入力して作成して続行ボタンを押します。
ロールを選択からCloud Storage-ストレージ管理者を選択します。
設定に問題がなければ、以下のように新しいサービスアカウントができているはずです。
作成されたサービスアカウントを選択します。
キータブを選択し、鍵を追加から新しい鍵を作成を選択します。
JSONを選択して作成ボタンを押します。
秘密鍵がローカルにダウンロードされます。後ほど利用するのでファイルはなくさないようにしてください。
次はCloud Storage側の準備をします。以下からCloud Storageを開きます。
作成ボタンを押します。
適当なバケット名を入力します。
全てのGCP環境においてユニークな被らない名前にする必要があります。
今回はとりあえず日付や時刻など入れておけば被ることが減ると思われます。
もし以下画面が表示されたら確認を押します。
バケットが作成されました。バケット名は後ほど利用します。
必要なパッケージをインストールします。
>pip install --upgrade google-cloud-storage
ソースコードは以下になります。
import os
from google.cloud import storage
os.environ["GOOGLE_APPLICATION_CREDENTIALS"]='YOUR_SERVICE_ACCOUNT_KEY_PATH.json'
# GCS connect
client = storage.Client()
bucket = client.get_bucket('STORAGE_NAME')
# GCP file upload
blob = bucket.blob('UPLOADED_FILE_PATH.jpg')
blob.upload_from_filename(filename='UPLOAD_FILE_PATH.jpg')
- YOUR_SERVICE_ACCOUNT_KEY_PATH.json
サービスアカウントの手順でダウンロードした秘密鍵のファイルパスを指定します。 - STORAGE_NAME
Cloud Storageの手順で作成したバケット名(ex. storage-220923)を記載します。 - UPLOADED_FILE_PATH.jpg
アップロードするファイルにおいて、Cloud Storage側で構成したいファイルパスを記載します。
img/image.jpgなどのディレクトリ構成を取っても大丈夫です。
今回はアップロードするファイルパス(UPLOADED_FILE_PATH.jpg)と同じで良いでしょう。 - UPLOAD_FILE_PATH.jpg
アップロードするファイルパスを記載します。
Pythonを問題なく実行できた場合は、バケットを確認すると新しいファイルができていることが確認できます。
ファイルを選択すると、以下のように正しく画像がアップロードできていることがわかります。
今回はアップロードを紹介しましたが、ダウンロードも簡単にできます。
アップロードでは以下のように記述していた部分を、
# GCP file upload
blob = bucket.blob('UPLOADED_FILE_PATH.jpg')
blob.upload_from_filename(filename='UPLOAD_FILE_PATH.jpg')
ダウンロードでは以下のように変更するだけです。
# GCS file download
blob = bucket.blob(file_name)
blob.download_to_filename(filename=file_name)
まとめ
今回はローカルPCのPythonからGCP Cloud Storageに画像ファイルをアップロードする方法を紹介しました。
最初はサービスアカウントの考え方を理解するのに苦労するかもしれませんが、手順通りに実行するのは意外と簡単だったのではないでしょうか。
ご意見やご質問がありましたらお気軽によろしくお願いします。コメントお待ちしております!