LoginSignup
4
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-12-10

はじめに

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()

参考

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4