機械学習エンジニアの備忘録

関西の若手技術者です。仕事では主にデータ解析などをしています。趣味で作るものは仕事に関係あったりなかったり。pythonや機械学習まわりのことを備忘録的に書き留めてこうと思います。 記事に修正点/改善点等あればコメントください。

【GoogleCloudPlatform】pythonでGCSバケットのデータを読み出す/書き出す

なんだかんだと時間がかかったので、自分用のメモも兼ねて。

GCP上のインスタンスで、GCS (Google Cloud Storage)のバケット内データを読み書きするpythonコードです。

pythonコードは Anacondaの jupyter notebookで実行しています。

前準備:インストール

まず google cloud をインストール $ pip install google-cloud $ pip install google-cloud-storage (2019/01/30修正)

データの読み出し

from google.cloud import storage as gcs

bucket_name = バケット名
fname = ファイル名
project_name = プロジェクト名

#プロジェクト名を指定してcliaentを作成
client = gcs.Client(project_name)
#バケット名を指定してbucketを取得
bucket = client.get_bucket(bucket_name)
#Blobを作成
blob = gcs.Blob(fname, bucket)
content = blob.download_as_string()

データの書き出し

from google.cloud import storage as gcs

bucket_name = バケット名
fname = ファイル名
project_name = プロジェクト名

#プロジェクト名を指定してcliaentを作成
client = gcs.Client(project_name)
#バケット名を指定してbucketを取得
bucket = client.get_bucket(bucket_name)
#Blobを作成
#2019/01/30修正
blob = gcs.Blob(fname, bucket)
blob.upload_from_string('test')

403エラーが出る場合

VMインスタンスを動かしているPJとは別のPJのGCSにアクセスしようとすると、以下のようなエラーが出た。

  • エラーメッセージ
Forbidden: 403 GET https://www.googleapis.com/download/storage/hogehoge: google_service_account_name@developer.gserviceaccount.com does not have storage.objects.get access to bucket_name/file_name.
  • 原因 どうやらVMインスタンスに紐づくGoogleサービスアカウントの権限の問題のよう。(Googleサービスアカウントについては、このページを参考にさせていただきました。)

  • 解決策 GCSのあるPJのIAMの権限設定で、エラーメッセージに表示されているサービスアカウントの権限設定を追加する。 (ひとまずアカウントをPJの編集者に設定してアクセス可能であることを確認しました。)