Boto クライアント ライブラリ プラグイン

このチュートリアルでは、XML API を使用して基本的な Cloud Storage オペレーションを行うシンプルな Python プログラムについて説明します。このドキュメントは、Console クイックスタートに示されている Python や Cloud Storage のコンセプトやオペレーションに精通している方を対象としています。

Cloud Storage クライアント ライブラリの使用

通常は、Python 用 Cloud Storage クライアント ライブラリを使用して、Cloud Storage バケットとオブジェクトのオペレーションを行う必要があります。Cloud Storage クライアント ライブラリは柔軟性がより高いため、Cloud Storage ガイド内のコードサンプルでは、Cloud Storage クライアント ライブラリを使用しています。特に XML API や boto ライブラリを通じて Cloud Storage と通信する場合は、このガイドを使用してください。

環境設定

このチュートリアルを開始する前に、次の作業を行う必要があります。

  1. パソコンにスタンドアロン版の gsutil をインストールする
  2. boto ライブラリと gcs-oauth2-boto-plugin をインストールする

    boto は、Cloud Storage のインターフェースとして使用されるオープンソースの Python ライブラリです。 gcs-oauth2-boto-plugin は、boto auth plugin フレームワークで使用する認証プラグインです。認証プラグインは、Google Cloud Storage で使用することができる OAuth 2.0 を採用しています。

    boto ライブラリや oauth2 プラグインの設定方法は、使用しているシステムによって異なります。次のセットアップ例をガイダンスとして使用します。これらのコマンドでは、pip をインストールし、その後、pip を使用して他のパッケージをインストールします。最後の 3 つのコマンドは、インストールを検証する 2 つのモジュールのインポート検証を示します。

    Debian と Ubuntu

    wget https://bootstrap.pypa.io/get-pip.py
    sudo python get-pip.py
    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install gcc python-dev python-setuptools libffi-dev libssl-dev
    sudo pip install virtualenv
    virtualenv venv
    source ./venv/bin/activate
    (venv)pip install gcs-oauth2-boto-plugin
    (venv)python
    >>>import boto
    >>>import gcs_oauth2_boto_plugin
    

    CentOS、RHEL、Fedora

    wget https://bootstrap.pypa.io/get-pip.py
    sudo python get-pip.py
    sudo yum install gcc openssl-devel python-devel python-setuptools libffi-devel
    sudo pip install virtualenv
    virtualenv venv
    source ./venv/bin/activate
    (venv)pip install gcs-oauth2-boto-plugin
    (venv)python
    >>>import boto
    >>>import gcs_oauth2_boto_plugin
    
  3. boto の構成ファイルを設定し、OAuth 2.0 を使用する

    boto 構成ファイルを作成して、サービス アカウントやユーザー アカウントの認証情報を使用することができます。サービス アカウントの認証情報は、サービスまたはアプリケーションに代わって認証する際に使用する推奨認証タイプです。ユーザー アカウントの認証情報は、特定のユーザー(人)に代わってリクエスト認証を行う推奨認証タイプです。この 2 種類の認証タイプについて、詳しくはサポート対象の認証タイプをご覧ください。

    サービス アカウント

    サービス アカウントの認証情報を使用する場合:

    1. 既存のサービス アカウントを使用するか、新規サービス アカウントを作成して必要な秘密鍵をダウンロードします。必ず PKCS12 形式の秘密鍵を取得してください。デフォルトのままでは、新しい鍵を作成するときに JSON 形式の秘密鍵がダウンロードされます。
    2. サービス アカウントを使用して .boto ファイルを構成します。それには、gsutil で次のコマンドを使用します。
      gsutil config -e

      コマンドを入力すると、サービス アカウントのメールアドレスや、サービス アカウントの秘密鍵(.p12)の場所を求められます。gsutil コマンドを実行しているパソコン上に対象の秘密鍵があることを必ず確認してください。

    ユーザー アカウント

    ユーザー アカウントの資格情報を使用する場合:

    1. .boto ファイルがない場合は作成します。それには、gsutil で次のコマンドを使用します。

      gsutil config
    2. アプリケーションの既存クライアント ID を使用するか、新しいクライアント ID を作成します。

    3. .boto ファイルを編集します。[OAuth2] セクションにおいて、client_idclient_secret の値を生成した値に指定します。

    4. gsutil config コマンドを再度実行し、クライアント ID と入力した秘密に基づき、更新トークンを生成します。

      .boto のバックアップができないことを表すエラー メッセージが表示された場合は、バックアップ構成ファイル .boto.bak を削除するか、ファイル名を変更してください。

    5. 更新トークンの代替ロジックを構成します。

      gcs-oauth2-boto-plugin では、アプリケーションの認証情報を使用する際、auth トークンを生成する代替ロジックが必要です。サービス アカウントを使用する場合は必要ありません。

      代替ロジックを有効にするには次のオプションがあります。

      1. .boto 構成ファイルに client_idclient_secret を設定します。この設定は推奨されているだけでなく、新しい .boto 構成ファイルで gsutil を使用する場合は必須です。
      2. 環境変数 OAUTH2_CLIENT_IDOAUTH2_CLIENT_SECRET を設定します。
      3. 次の例に示されているとおりに、SetFallbackClientIdAndSecret 関数を使用します。

Cloud Storage を使用する

Python ソースファイルの設定

このチュートリアルを開始するには、まず、任意のテキスト エディタを使用して新規 Python ファイルを作成します。次に、以下のディレクティブ、import 文、構成、定数の割り当てを追加します。

ここに表示しているコードでは、更新トークンを生成する代替ロジックとして SetFallbackClientIdAndSecret 関数を使用しています。代替ロジックを指定する別の方法については、アプリケーションの認証情報を使用するをご覧ください。サービス アカウントを使用して認証する場合は、代替ロジックは不要です。

#!/usr/bin/python

import boto
import gcs_oauth2_boto_plugin
import os
import shutil
import StringIO
import tempfile
import time

# URI scheme for Cloud Storage.
GOOGLE_STORAGE = 'gs'
# URI scheme for accessing local files.
LOCAL_FILE = 'file'

# Fallback logic. In https://console.cloud.google.com/
# under Credentials, create a new client ID for an installed application.
# Required only if you have not configured client ID/secret in
# the .boto file or as environment variables.
CLIENT_ID = 'your client id'
CLIENT_SECRET = 'your client secret'
gcs_oauth2_boto_plugin.SetFallbackClientIdAndSecret(CLIENT_ID, CLIENT_SECRET)

バケットの作成

このコードは、2 つのバケットを作成します。バケット名は全世界で一意である必要があるため(命名のガイドラインをご覧ください)、各バケット名にタイプスタンプを付与して、バケット名が一意になるようにしています。

これらのバケット名がすでに使用されている場合は、コードを変更して一意のバケット名を生成する必要があります。

now = time.time()
CATS_BUCKET = 'cats-%d' % now
DOGS_BUCKET = 'dogs-%d' % now

# Your project ID can be found at https://console.cloud.google.com/
# If there is no domain for your project, then project_id = 'YOUR_PROJECT'
project_id = 'YOUR_DOMAIN:YOUR_PROJECT'

for name in (CATS_BUCKET, DOGS_BUCKET):
  # Instantiate a BucketStorageUri object.
  uri = boto.storage_uri(name, GOOGLE_STORAGE)
  # Try to create the bucket.
  try:
    # If the default project is defined,
    # you do not need the headers.
    # Just call: uri.create_bucket()
    header_values = {"x-goog-project-id": project_id}
    uri.create_bucket(headers=header_values)

    print 'Successfully created bucket "%s"' % name
  except boto.exception.StorageCreateError, e:
    print 'Failed to create bucket:', e

バケットのリストの表示

バケットのリストを取得するには、storage_uri() を呼び出して BucketStorageUri オブジェクトをインスタンス化し、空の文字列を URI として指定します。次に、get_all_buckets() インスタンス メソッドを呼び出します。

uri = boto.storage_uri('', GOOGLE_STORAGE)
# If the default project is defined, call get_all_buckets() without arguments.
for bucket in uri.get_all_buckets(headers=header_values):
  print bucket.name

オブジェクトのアップロード

オブジェクトをアップロードするには、ローカル ファイルを参照するファイル オブジェクト(読み取り用にオープンされている)と、Cloud Storage 上の宛先オブジェクトを参照するストレージ URL オブジェクトを作成します。set_file_from_contents() インスタンス メソッドを呼び出し、ファイル ハンドルを引数として指定します。

# Make some temporary files.
temp_dir = tempfile.mkdtemp(prefix='googlestorage')
tempfiles = {
    'labrador.txt': 'Who wants to play fetch? Me!',
    'collie.txt': 'Timmy fell down the well!'}
for filename, contents in tempfiles.iteritems():
  with open(os.path.join(temp_dir, filename), 'w') as fh:
    fh.write(contents)

# Upload these files to DOGS_BUCKET.
for filename in tempfiles:
  with open(os.path.join(temp_dir, filename), 'r') as localfile:

    dst_uri = boto.storage_uri(
        DOGS_BUCKET + '/' + filename, GOOGLE_STORAGE)
    # The key-related functions are a consequence of boto's
    # interoperability with Amazon S3 (which employs the
    # concept of a key mapping to localfile).
    dst_uri.new_key().set_contents_from_file(localfile)
  print 'Successfully created "%s/%s"' % (
      dst_uri.bucket_name, dst_uri.object_name)

shutil.rmtree(temp_dir)  # Don't forget to clean up!

オブジェクトのリスト

バケット内のオブジェクトをすべて一覧表示するには、storage_uri() を呼び出し、バケットの URI と Cloud Storage の URI スキームを引数として指定します。次に、get_bucket() インスタンス メソッドを使用してオブジェクトのリストを取得します。

uri = boto.storage_uri(DOGS_BUCKET, GOOGLE_STORAGE)
for obj in uri.get_bucket():
  print '%s://%s/%s' % (uri.scheme, uri.bucket_name, obj.name)
  print '  "%s"' % obj.get_contents_as_string()

オブジェクトのダウンロードとコピー

次のコードでは、DOGS_BUCKET 内のオブジェクトを読み取り、ユーザーのホーム ディレクトリと CATS_BUCKET の両方にコピーしています。また、同じインターフェースを使用して、ローカル ファイルと Cloud Storage のオブジェクトの両方にオペレーションを行っています。

dest_dir = os.getenv('HOME')
for filename in ('collie.txt', 'labrador.txt'):
  src_uri = boto.storage_uri(
      DOGS_BUCKET + '/' + filename, GOOGLE_STORAGE)

  # Create a file-like object for holding the object contents.
  object_contents = StringIO.StringIO()

  # The unintuitively-named get_file() doesn't return the object
  # contents; instead, it actually writes the contents to
  # object_contents.
  src_uri.get_key().get_file(object_contents)

  local_dst_uri = boto.storage_uri(
      os.path.join(dest_dir, filename), LOCAL_FILE)

  bucket_dst_uri = boto.storage_uri(
      CATS_BUCKET + '/' + filename, GOOGLE_STORAGE)

  for dst_uri in (local_dst_uri, bucket_dst_uri):
    object_contents.seek(0)
    dst_uri.new_key().set_contents_from_file(object_contents)

  object_contents.close()

ストリーミング転送

ストリーミング アップロードを実行するには、次のコードを使用します。

dst_uri = boto.storage_uri(<bucket> + '/' + <object>, 'gs')
dst_uri.new_key().set_contents_from_stream(<stream object>)

たとえば、次のコードは data_file という名前のファイルを同じ名前のオブジェクトにストリーミング アップロードします。

filename = 'data_file'
MY_BUCKET = 'my_app_bucket'
my_stream = open(filename, 'rb')
dst_uri = boto.storage_uri(MY_BUCKET + '/' + filename, 'gs')
dst_uri.new_key().set_contents_from_stream(my_stream)

ストリーミング ダウンロードを実行するには、次のコードを使用します。

import sys

src_uri = boto.storage_uri(<bucket> + '/' + <object>, 'gs')
src_uri.get_key().get_file(sys.stdout)

たとえば、次のコードは data_file という名前のオブジェクトのストリーミング ダウンロードを実行します。

downloaded_file = 'saved_data_file'
MY_BUCKET = 'my_app_bucket'
object_name = 'data_file'
src_uri = boto.storage_uri(MY_BUCKET + '/' + object_name, 'gs')
src_uri.get_key().get_file(sys.stdout)

オブジェクトの ACL の変更

次のコードでは、指定した Google アカウントに labrador.txt に対する FULL_CONTROL 権限を付与しています。valid-email-address を有効な Google アカウントのメールアドレスに忘れずに変更してください。

uri = boto.storage_uri(DOGS_BUCKET + '/labrador.txt', GOOGLE_STORAGE)
print str(uri.get_acl())
uri.add_email_grant('FULL_CONTROL', 'valid-email-address')
print str(uri.get_acl())

バケットやオブジェクトのメタデータの読み取り

このコードでは、バケットとオブジェクトに関連付けられているメタデータを読み取って表示します。

# Print ACL entries for DOGS_BUCKET.
bucket_uri = boto.storage_uri(DOGS_BUCKET, GOOGLE_STORAGE)
for entry in bucket_uri.get_bucket().get_acl().entries.entry_list:
  entry_id = entry.scope.id
  if not entry_id:
    entry_id = entry.scope.email_address
  print 'SCOPE: %s' % entry_id
  print 'PERMISSION: %s\n' % entry.permission

# Print object metadata and ACL entries.
object_uri = boto.storage_uri(DOGS_BUCKET + '/labrador.txt', GOOGLE_STORAGE)
key = object_uri.get_key()
print ' Object size:\t%s' % key.size
print ' Last mod:\t%s' % key.last_modified
print ' MIME type:\t%s' % key.content_type
print ' MD5:\t%s' % key.etag.strip('"\'') # Remove surrounding quotes
for entry in key.get_acl().entries.entry_list:
  entry_id = entry.scope.id
  if not entry_id:
    entry_id = entry.scope.email_address
  print 'SCOPE: %s' % entry_id
  print 'PERMISSION: %s\n' % entry.permission

オブジェクトやバケットの削除

このチュートリアルの最後の手順として、このコードでは、先ほど作成したオブジェクトとバケットを削除します。バケットを削除するにはそのバケット内が空である必要があるため、オブジェクトを先に削除しています。

for bucket in (CATS_BUCKET, DOGS_BUCKET):
  uri = boto.storage_uri(bucket, GOOGLE_STORAGE)
  for obj in uri.get_bucket():
    print 'Deleting object: %s...' % obj.name
    obj.delete()
  print 'Deleting bucket: %s...' % uri.bucket_name
  uri.delete_bucket()

トップへ戻る

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。