【初心者向け】ローカルPCのPythonからCloud Storageに画像ファイルをアップロードする方法

今回はローカルPCで実行されているPythonスクリプトから、GCPにあるCloud Storageに画像ファイルをアップロードする方法を紹介します。

Cloud Storageにファイルをアップロードする方法

全体的な流れ

最初に大まかな流れを説明します。

  1. Cloud Storageにアクセスできるサービスアカウントを作成する
  2. 作成したサービスアカウントの認証情報をダウンロードする
  3. Pythonスクリプトで認証情報を読み取り、Cloud Storageにファイルをアップロードする

Cloud Storageとは

Cloud StorageとはGCPのオブジェクトストレージになります。無期限5GBの無料枠があります。

Google DriveとCloud Storageの違い

Google DriveとCloud Storageは何が違うのでしょうか。

Google Driveはファイルストレージというものであり、フォルダ内のファイルという形式で階層的に整理して保存するストレージになります。

一方でCloud Storageはオブジェクトストレージというものであり、保管場所となるクラウド空間にはフォルダの階層構造ではなくフラットな状態で保管されています。

ただしブラウザ上ではフォルダ階層で表示されているので、オブジェクトストレージだから利用しづらいということは特にありません。

サービスアカウントとは

サービスアカウントとは、ユーザーではなくアプリケーションや仮想マシンで使用される特別なアカウントです。
例えば今回であれば、「画像ファイルをアップロードするPythonアプリケーション自体」が使用するアカウントがサービスアカウントとなります。
このサービスアカウントにGoogle Cloudの管理を行える権限を与えておくことで、PythonアプリケーションはGoogle Cloudにファイルをアップロードできるようになるという仕組みです。

Cloud Storageにファイルをアップロードする実行手順

サービスアカウントを作成する

まずはサービスアカウントを作成するために、以下のリンクから認証情報ページを開きます。

認証情報

認証情報を作成ボタンを押し、サービスアカウントを選択します。

適当なサービスアカウント名(storage-service)を入力して作成して続行ボタンを押します。

ロールを選択からCloud Storage-ストレージ管理者を選択します。

ロール

デフォルト状態ではサービスアカウントはGCP上の他サービスにアクセスすることはできません。

今回のようにロールを選択することによってサービスアカウントはCloud Storageストレージを管理できるようになります。

使用したいサービスに応じて、該当するサービスの権限のみをサービスアカウントに与える、という考え方になります。

設定に問題がなければ、以下のように新しいサービスアカウントができているはずです。
作成されたサービスアカウントを選択します。

キータブを選択し、鍵を追加から新しい鍵を作成を選択します。

JSONを選択して作成ボタンを押します。

秘密鍵がローカルにダウンロードされます。後ほど利用するのでファイルはなくさないようにしてください。

Cloud Storageにバケットを作成する

次はCloud Storage側の準備をします。以下からCloud Storageを開きます。

Cloud Storage

作成ボタンを押します。

適当なバケット名を入力します。
全てのGCP環境においてユニークな被らない名前にする必要があります。
今回はとりあえず日付や時刻など入れておけば被ることが減ると思われます。

もし以下画面が表示されたら確認を押します。

バケットが作成されました。バケット名は後ほど利用します。

Pythonから画像ファイルをアップロードする

必要なパッケージをインストールします。

>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を問題なく実行できた場合は、バケットを確認すると新しいファイルができていることが確認できます。

ファイルを選択すると、以下のように正しく画像がアップロードできていることがわかります。

参考:PythonからCloud Storageのファイルをダウンロードする

今回はアップロードを紹介しましたが、ダウンロードも簡単にできます。
アップロードでは以下のように記述していた部分を、

# 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に画像ファイルをアップロードする方法を紹介しました。
最初はサービスアカウントの考え方を理解するのに苦労するかもしれませんが、手順通りに実行するのは意外と簡単だったのではないでしょうか。
ご意見やご質問がありましたらお気軽によろしくお願いします。コメントお待ちしております!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA