Cloud Storage は、動画や画像ファイルなどの大きいデータ オブジェクトをアプリケーションに提供し、大きいデータファイルをアップロードできるようにします。Python 2 ランタイムでは、App Engine に Cloud Storage のオブジェクトの書き込みと読み取り用の独自のクライアント ライブラリが用意されています。この App Engine ライブラリは、Python 3 ランタイムなどの新しい App Engine ランタイムでは使用できません。
Python 2 アプリで GoogleAppEngineCloudStorageClient
ライブラリを使用する場合は、アプリを Python 3 ランタイムで実行する前に Cloud Storage の Cloud クライアント ライブラリに移行する必要があります。アプリを移行する必要があるのは、新しいクライアント ライブラリのみです。既存の Cloud Storage バケットのすべてのデータ オブジェクトと権限は変更されず、新しいクライアント ライブラリを使用して既存のバケットにアクセスできます。
App Engine クライアント ライブラリと Cloud クライアント ライブラリの比較
類似点:
Cloud クライアント ライブラリは、App Engine クライアント ライブラリで有効化された Cloud Storage のすべての機能をサポートしています。たとえば、オブジェクトの読み取り、書き込み、削除、一覧表示が可能です。移行に必要な作業は、コードを少し変更することだけです。
Cloud クライアント ライブラリは、バケットのラベル付け、古いバージョンのオブジェクトの取得など、追加の機能もサポートします。
相違点:
App Engine ライブラリでは、オブジェクトのリストを取得する関数は非同期で動作します。Cloud クライアント ライブラリには、オブジェクトを一覧表示するための非同期関数はありませんが、ページングを使用して、少数のオブジェクトを反復処理できます。
App Engine クライアント ライブラリでは、バケットとオブジェクトへのアクセスを制御するためにアクセス制御リスト(ACL)を使用する必要があります。ただし、Cloud Storage と Cloud クライアント ライブラリには、バケットとオブジェクトへのアクセスを制御する方法が 2 つあります。1 つは ACL、もう 1 つは均一なバケットレベルのアクセスです。均一なバケットレベルのアクセスでは、すべての Cloud リソースでよりシンプルで一貫したアクセス制御を提供します。
App Engine クライアント ライブラリで使用したすべての ACL は、Cloud クライアント ライブラリに移行した後も既存のバケットにそのまま適用され、必要に応じて引き続き ACL を使用できます。
均一なバケットレベルのアクセスがニーズを満たしている場合は、この単純なシステムを新しく作成するバケットに使用することをおすすめします。既存のバケットを、均一なバケットレベルのアクセスを使用するように変換することはできますが、ストレージ オブジェクトへのアクセスのアプリによる保護手段を大幅に変更する必要がある場合があります。
コードサンプル
App Engine API を使用した基本的なストレージ操作
Cloud Storage の Cloud クライアント ライブラリを使用した基本的なストレージ操作
移行を開始する前に
まだ設定済みでない場合は、Google Cloud と互換性のある Python バージョンを使用するよう Python 開発環境を設定して、独立した Python を作成するためのテストツールをインストールします。
Cloud Storage の権限について
デフォルトでは、アプリの自動作成されるデフォルトのサービス アカウントには、プロジェクトのバケットに対する読み取りと書き込みの権限があります。また、移行前と移行後の両方で、作成したオブジェクトに対してすべての権限があります。
Cloud Storage バケットとオブジェクトへのアクセスを保護するために別のサービス アカウントまたはユーザー アカウントを使用した場合は、移行前と移行後も同じアカウントと認証方法の使用を継続してください。
移行プロセスの概要
App Engine クライアント ライブラリの代わりに Cloud Storage 用の Cloud クライアント ライブラリを使用するように Python アプリを移行するには、次を行います。
Cloud Storage 用の Cloud クライアント ライブラリをインストールします。
Cloud クライアント ライブラリを使用するようにコードを更新します。
更新をテストします。
App Engine にアプリをデプロイします。
Cloud Storage 用 Cloud クライアント ライブラリのインストール
App Engine でアプリを実行するときに、Cloud Storage の Cloud クライアント ライブラリを使用できるようにするには、次を行います。
app.yaml
ファイルを更新します。- Cloud クライアント ライブラリを使用する場合は、
grpcio
ライブラリとsetuptools
ライブラリの最新バージョンを追加します。 ssl
ライブラリは Cloud Storage で必要なため、追加します。
app.yaml
ファイルの例を次に示します。runtime: python27 threadsafe: yes api_version: 1 libraries: - name: grpcio version: 1.0.0 - name: setuptools version: 36.6.0 - name: ssl version: latest
クライアント ライブラリの中には、SSL ライブラリを必要としないものもあります。クライアント ライブラリに必要な SSL ライブラリが含まれていない場合は、アプリがリクエストを受信したとき、ログ エクスプローラに SSL エラーが表示されます。
- Cloud クライアント ライブラリを使用する場合は、
Cloud Storage 用の Cloud クライアント ライブラリを依存関係のリストに追加して、
requirements.txt
ファイルを更新します。google-cloud-storage==1.24.1
Cloud Storage クライアント ライブラリの 1.24.1 バージョンは Python 2.7 アプリをサポートしているため、使用をおすすめします。
次に
pip install -t lib -r requirements.txt
を実行して、アプリで使用可能なライブラリのリストを更新します。Python 2 アプリで組み込みライブラリまたはコピーされたライブラリを使用している場合、そのパスを
appengine_config.py
ファイル内に指定する必要があります。import pkg_resources from google.appengine.ext import vendor # Set PATH to your libraries folder. PATH = 'lib' # Add libraries installed in the PATH folder. vendor.add(PATH) # Add libraries to pkg_resources working set to find the distribution. pkg_resources.working_set.add_entry(PATH)
上記の例の
appengine_config.py
ファイルは、lib
フォルダが現在の作業ディレクトリにあることを前提としています。lib
が常に現在の作業ディレクトリにあることを保証できない場合は、lib
フォルダのフルパスを指定します。次に例を示します。import os path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
Cloud クライアント ライブラリを使用するようにコードを更新
Cloud Storage クライアントの作成
Cloud Storage で Cloud クライアント ライブラリを使用するには、Client
オブジェクトを作成します。クライアントには、Cloud Storage への接続に必要な認証情報やその他のデータが含まれています。次に例を示します。
from google.cloud import storage
client = storage.Client()
前述のデフォルトの認可シナリオでは、Cloud Storage クライアントに、プロジェクトのバケットとオブジェクトの操作が認可された App Engine のデフォルト サービス アカウントの認証情報が含まれています。このデフォルトのシナリオで作業していない場合は、アプリケーションのデフォルト認証情報(ADC)をご覧ください。
Cloud クライアント ライブラリのメソッドの使用
次の表は、特定の Cloud Storage 機能の実装時に使用する Cloud クライアント ライブラリのメソッドをまとめたものです。
Cloud Storage の機能 | Cloud クライアント メソッド |
バケット内のオブジェクトを一覧表示する | Client.list_blobs
シンプルなコードサンプルとディレクトリ モードのエミュレートのサンプルをご覧ください。 次のページまたは前のページのオブジェクトのリストを表示するには、 |
ストレージに書き込む | blob.upload_from_file
blob.upload_from_filename
blob.upload_from_string
コードサンプルを参照してください。 |
ACL を指定する | 定義済み ACL を適用するには、バケットの作成またはオブジェクトの作成時に、predefined_acl パラメータを使用します。より精密に制御するには、 |
ストレージから読み取る | blob.download_to_file
blob.download_to_filename
blob.download_as_string
コードサンプルをご覧ください。 |
オブジェクトを削除する |
blob.delete
コードサンプルをご覧ください。 |
オブジェクトをコピーする | bucket.copy_blob
コードサンプルをご覧ください。 |
オブジェクトのメタデータを読み取る | blob.propertyname
と blob.metadata コードサンプルをご覧ください。 |
アップデートのテスト
ローカル環境でアプリの更新をテストできますが、すべての Cloud Storage リクエストはインターネット経由で実際の Cloud Storage バケットに送信する必要があります。App Engine も Cloud Storage も Cloud Storage エミュレータを提供していません。
Python 2 アプリのテストについて詳しくは、ローカルの開発用サーバーの使用をご覧ください。
Python 3 アプリのテストの詳細については、アプリケーションのテストとデプロイをご覧ください。
アプリのデプロイ
アプリをデプロイする準備ができたら、以下を行います。
アプリがエラーなしで実行されている場合、トラフィック分割を使用して、更新したアプリのトラフィックを徐々に増やします。更新したアプリへのトラフィックを増やす前に、問題が発生していないか細かくモニタリングして確認してください。