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 クライアント ライブラリを使用した基本的なストレージ操作
移行を開始する前に
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
ファイルと同じフォルダにrequirements.txt
ファイルを作成し、次の行を追加します。google-cloud-storage==1.24.1
Cloud Storage クライアント ライブラリの 1.24.1 バージョンは Python 2.7 アプリをサポートしているため、使用をおすすめします。
アプリの
app.yaml
ファイルで、libraries
セクションに必須の Google RPC ライブラリとsetuptools
ライブラリ、オプションの SSL ライブラリを指定します。libraries: - name: grpcio version: 1.0.0 - name: setuptools version: 36.6.0 - name: ssl version: latest
クライアント ライブラリの中には、SSL ライブラリを必要としないものもあります。クライアント ライブラリに必要な SSL ライブラリが含まれていない場合は、アプリがリクエストを受信したとき、ログ エクスプローラに SSL エラーが表示されます。
サードパーティ ライブラリの保存先ディレクトリ(例:
lib/
)を作成します。次に、pip install
を使用して、ディレクトリにライブラリをインストールします。例:pip install -t lib -r requirements.txt
app.yaml
ファイルと同じフォルダにappengine_config.py
ファイルを作成します。次のコードをappengine_config.py
ファイルに追加します。# 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')
ローカル開発では、Python 2 の virtualenv などの仮想環境に依存関係をインストールすることをおすすめします。
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 アプリのテストの詳細については、アプリケーションのテストとデプロイをご覧ください。
アプリのデプロイ
アプリをデプロイする準備ができたら、以下を行います。
アプリがエラーなしで実行されている場合、トラフィック分割を使用して、更新したアプリのトラフィックを徐々に増やします。更新したアプリへのトラフィックを増やす前に、問題が発生していないか細かくモニタリングして確認してください。