Storage 用 Cloud クライアント ライブラリへの移行

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 を使用できます。

    均一なバケットレベルのアクセスがニーズを満たしている場合は、この単純なシステムを新しく作成するバケットに使用することをおすすめします。既存のバケットを、均一なバケットレベルのアクセスを使用するように変換することはできますが、ストレージ オブジェクトへのアクセスのアプリによる保護手段を大幅に変更する必要がある場合があります。

コードサンプル

移行を開始する前に

Cloud Storage の権限について

デフォルトでは、アプリのデフォルトのサービス アカウントには、プロジェクトのバケットに対する読み取りと書き込みの権限があります。また、移行前と移行後の両方で、作成したオブジェクトに対してすべての権限があります。

Cloud Storage バケットとオブジェクトへのアクセスを保護するために別のサービス アカウントまたはユーザー アカウントを使用した場合は、移行前と移行後も同じアカウントと認証方法の使用を継続してください。

移行プロセスの概要

App Engine クライアント ライブラリの代わりに Cloud Storage 用の Cloud クライアント ライブラリを使用するように Python アプリを移行するには、次を行います。

  1. Cloud Storage 用の Cloud クライアント ライブラリをインストールします。

  2. Cloud クライアント ライブラリを使用するようにコードを更新します。

  3. 更新をテストします。

  4. App Engine にアプリをデプロイします。

Cloud Storage 用 Cloud クライアント ライブラリのインストール

App Engine でアプリを実行するときに、Cloud Storage の Cloud クライアント ライブラリを使用できるようにするには、次を行います。

  1. app.yaml ファイルと同じフォルダに requirements.txt ファイルを作成し、次の行を追加します。

     google-cloud-storage==1.24.1
    

    Cloud Storage クライアント ライブラリの 1.24.1 バージョンは Python 2.7 アプリをサポートしているため、使用をおすすめします。

  2. アプリの 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 エラーが表示されます。

  3. サードパーティ ライブラリの保存先ディレクトリ(例: lib/)を作成します。次に、pip install を使用して、ディレクトリにライブラリをインストールします。例:

      pip install -t lib -r requirements.txt
      

  4. 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

シンプルなコードサンプルディレクトリ モードのエミュレートのサンプルをご覧ください。

次のページまたは前のページのオブジェクトのリストを表示するには、Client.list_blobs が返すイテレータ オブジェクトの pages プロパティを使用します。

ストレージに書き込む blob.upload_from_file
blob.upload_from_filename
blob.upload_as_string

コードサンプルを参照してください。

ACL を指定する 定義済み ACL を適用するには、バケットの作成またはオブジェクトの作成時に、predefined_acl パラメータを使用します。

より精密に制御するには、bucket.acl.reload() または blob.acl.reload() を使用して、現在定義されている ACL を取得します。次に、ACL メソッドを使用して、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 アプリのテストの詳細については、アプリケーションのテストとデプロイをご覧ください。

アプリのデプロイ

アプリをデプロイする準備ができたら、以下を行います。

  1. App Engine でアプリをテストします。

  2. アプリがエラーなしで実行されている場合、トラフィック分割を使用して、更新したアプリのトラフィックを徐々に増やします。更新したアプリへのトラフィックを増やす前に、問題が発生していないか細かくモニタリングして確認してください。