Compute Engine インスタンスから Cloud Storage にアクセスする

Posted: , Modified:   Google-Cloud-Platform Python Qiita

本稿は Qiita 投稿記事 のバックアップです.

はじめに

GCE インスタンスから Cloud Storage にアクセスしたい.プロジェクト内部からのアクセスなので OAuth 2.0 を直接用いた方法 より簡単なサービスアカウントを用いる.

認証

始めに,メタデータサーバからアクセストークンを取得する.

import json
import urllib2

METADATA_SERVER = "http://169.254.169.254/computeMetadata/v1/instance/service-accounts"
SERVICE_ACCOUNT = "default"

req = urllib2.Request("{0}/{1}/token".format(METADATA_SERVER, SERVICE_ACCOUNT))
req.add_header("Metadata-Flavor", "Google")

data = json.load(urllib2.urlopen(req))

token = data["access_token"]
token_type = data["token_type"]

トークンを用いたアクセス

Cloud Storage へのアクセスは受け取ったトークンを使う.

オブジェクトの取得

from apiclient import discovery

sp = discovery.build("storage", "v1")
req = sp.objects().get_media(bucket=<BUCKET>, object=<PATH>)
req.headers["Authorization"] = "{0} {1}".format(token_type, token)
res = req.execute()

サンプルコードでは oauth2_client.AccessTokenCredentials を使っていたが,上記の方法でもアクセスできる.

チャンク形式でオブジェクトのアップロード

from apiclient import discovery
from apiclient.http import MediaIoBaseUpload

sp = discovery.build("storage", "v1")
# fp: アップロードするデータ, mimetype: MIME type
media_body = MediaIoBaseUpload(fp, mimetype, resumable=True)

req = sp.objects().insert(bucket=<BUCKET>, body=dict(name=<PATH>), media_body=media_body)
req.headers["Authorization"] = "{0} {1}".format(token_type, token)
req.execute()

参考