Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

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 = プロジェクト名

#プロジェクト名を指定してclientを作成
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 = プロジェクト名

#プロジェクト名を指定してclientを作成
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の編集者に設定してアクセス可能であることを確認しました。)
    上記に加えて、バケットについても管理者権限が必要なようです。 (2019/07/03 追記)

Gri_Gra
若手技術者です。仕事では主にデータ解析とかやっています。趣味で作るものは仕事に関係あったりなかったり。pythonや機械学習まわりのことを備忘録的に書き留めてこうと思います。 記事に修正点/改善点等あればコメントください。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away