なんだかんだと時間がかかったので、自分用のメモも兼ねて。
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 追記)