バンドルされた App Engine サービスの移行の概要

Google Cloud では、Python 2 ランタイムのバンドル サービスの一部と同様の機能を提供するスタンドアロン プロダクトを使用できます。Google Cloud で個別のプロダクトとして提供されないバンドル サービス(画像処理、検索、メッセージングなど)については、サードパーティ プロバイダまたはその他の回避策をおすすめします。

このページでは、バンドルされている各サービスの移行パスについて説明します。

Google Cloud の権限について

移行されるアプリとそれが使用する Google Cloud サービスは同じサンドボックス環境で動作しないため、各サービスにアクセスするにはアプリを承認する必要があります。たとえば、Datastore モードの Firestore(Datastore)または Cloud Tasks とやり取りするには、アプリはこれらのサービスへのアクセス権を持つアカウントの認証情報を提供する必要があります。

デフォルトでは、App Engine スタンダード ランタイムのアプリにより、App Engine デフォルト サービス アカウントの認証情報が提供されます。これには、アプリと同じプロジェクト内のデータベースにアクセスする権限があります。

次のいずれかの条件に当てはまる場合は、認証情報を明示的に提示する別の認証方法を使用する必要があります。

  • アプリと Memorystore データベースが異なる Google Cloud プロジェクトに属する。

  • デフォルトの App Engine サービス アカウントに割り当てられているロールが変更されている。

代替認証の方法については、サーバー間の本番環境アプリケーションの認証の設定をご覧ください。

ローカル開発用の認証

アプリをローカルで開発またはテストするには、サービス アカウントを使用することをおすすめします。プロジェクトのあらゆることに対して幅広い権限を有しているため、App Engine のデフォルトのサービス アカウントは使用しないでください。代わりに、特定の開発作業とテスト作業に必要な最小限の権限を持つサービス アカウントを作成して使用してください。

サービス アカウントを設定してアプリに接続する手順については、サービス アカウントの資格情報を手動で取得して提供するをご覧ください。

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

Python アプリから Google Cloud サービスを使用する最も簡単な方法は、サービスの Python クライアント ライブラリをインストールすることです(Google Cloud サービスにより、JSON REST とその他のインターフェースも提供されます)。App Engine ランタイムにクライアント ライブラリをインストールする手順は、Python 2 アプリと Python 3 アプリで異なります。

Python 2 アプリ用ライブラリのインストール

Python 2 ランタイムで動作するアプリが使うライブラリをインストールするには:

  1. サードパーティ ライブラリの保存先ディレクトリ(例: lib/)を作成します。

  2. app.yaml ファイルと同じフォルダに requirements.txt ファイルを作成し、クライアント ライブラリの名前を追加します。

    たとえば、Pub/Sub、Cloud Tasks のライブラリをインストールする場合は、次のファイルが使用されます。

    google-cloud-pubsub
    google-cloud-tasks
    
  3. pip install を使用して、作成したフォルダにライブラリをインストールします。例:

    pip install -t lib -r requirements.txt
    
  4. アプリの 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 エラーが表示されます。

  5. まだ作成されていない場合は、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)
    

    必ず pkg_resources モジュールを使用して、アプリがクライアント ライブラリの適切なディストリビューションを使用するようにしてください。

    上記の例の appengine_config.py ファイルは、lib フォルダが現在の作業ディレクトリにあることを前提としています。lib が常に現在の作業ディレクトリにあることを保証できない場合は、lib フォルダのフルパスを指定します。例:

    import os
    path = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lib')
    
  6. アプリをデプロイします

App Engine は、appengine_config.py ファイルで指定されたディレクトリ内のすべてのライブラリを Python 2 ランタイムにアップロードします。

Python 3 アプリ用ライブラリのインストール

Python 3 ランタイムで動作するアプリが使うライブラリをインストールするには:

  1. アプリの requirements.txt ファイルにライブラリ名を追加します。例:

    google-cloud-ndb
    
  2. アプリをデプロイします

App Engine は、requirements.txt ファイルに記述されているすべてのライブラリを Python 3 ランタイムに自動的にアップロードします。

App Engine バンドル サービスの移行方法の概要

Blobstore

データを格納および取得するには、Cloud クライアント ライブラリを介して Cloud Storage を使用します。移行を開始するには、Strage 用 Cloud クライアント ライブラリへの移行をご覧ください。

Datastore

Python 2 アプリで NDB を使用して Datastore を操作する場合は、Cloud NDB ライブラリに移行します。Cloud NDB は主に Python 2 アプリの移行ツールとして使用することを目的としています。Python 3 アプリでは、Datastore モードのクライアント ライブラリを使用することをおすすめします。

詳細は下記のページをご覧ください。

画像

画像の配信には、Cloud Storage から行う方法、直接配信する方法、サードパーティのコンテンツ配信ネットワーク(CDN)を使用する方法があります。

画像のサイズ変更、変換、操作を行うには、Pillow や ImageMagick の Python インターフェースなどの画像処理ライブラリを使用します。こうしたサードパーティ ライブラリを使用するには、ライブラリを依存関係として追加し、ライブラリの API を呼び出すようにコードを更新します。

また、App Engine Images サービスでは、サービス提供 URL を使用して画像のサイズ変更を処理することで、アプリケーションへの動的リクエストを回避する機能も提供されます。同様の機能は、サイズが変更された画像を事前に生成し、Cloud Storage にアップロードして配信することでも実現できます。または、画像のサイズ変更機能が用意されているサードパーティ コンテンツ配信ネットワーク(CDN)サービスを利用することもできます。

ロギング

Cloud Logging を使用するように、アプリを更新することをおすすめします。Cloud Logging では、ログ エクスプローラのログの表示、ログのダウンロード、重大度によるメッセージのフィルタリング、特定のリクエストとのアプリ メッセージの関連付けなどの機能がサポートされています。別の方法では、構造化された特定のデータを JSON オブジェクト内に持つログメッセージを書き込むことで、こうした機能を有効にできます。

詳細については、Cloud Logging への移行をご覧ください。

メール

メールを送信するには、SendGridMailgunMailjet などのサードパーティのメール プロバイダを使用します。これらのサービスはいずれも、アプリケーションからメールを送信するための API を提供しています。

Memcache

Python 2 アプリで Memcache を明示的に使用する場合は、キャッシュ サービスとして Memorystore for Redis を使用することをおすすめします。詳細については、Memcache から Memorystore への移行をご覧ください。

モジュール

アプリケーションが実行しているサービスの情報を取得および変更するには、環境変数と App Engine Admin API を組み合わせて使用します。

サービス情報 アクセス方法
現在のアプリケーション ID GAE_APPLICATION 環境変数
現在のプロジェクト ID GOOGLE_CLOUD_PROJECT 環境変数
現在のサービス名 GAE_SERVICE 環境変数
現在のサービス バージョン GAE_VERSION 環境変数
現在のインスタンス ID GAE_INSTANCE 環境変数
デフォルトのホスト名 Admin API の apps.get メソッド
サービスのリスト Admin API の apps.services.list メソッド
特定のサービスのバージョンのリスト Admin API の apps.services.versions.list メソッド
特定のサービスのデフォルト バージョン(トラフィック分割を含む) Admin API の apps.services.get メソッド
特定のバージョンで実行中インスタンスのリスト Admin API の apps.services.versions.instances.list メソッド
Python 3 ランタイムでアプリケーションが実行しているサービスに関するデータの詳細については、Python 3 ランタイム環境をご覧ください。

名前空間

Namespaces API では、テナントごとに一意の名前空間文字列を指定するだけで、マルチテナント アプリでテナント間でデータを分割できました。

Datastore は直接マルチテナンシーをサポートしていますが、他の Google Cloud サービスはサポートしていません。マルチテナントのアプリで他の Google Cloud サービスを使用する場合は、手動でマルチテナンシーを処理する必要があります。完全に分離されたサービス インスタンスを設定するには、Cloud Resource Manager API を使用してプログラムで新規プロジェクトを作成し、すべてのプロジェクトのリソースにアクセスできます。

OAuth

App Engine OAuth サービスを使用して OAuth 2.0 トークンを確認する代わりに、OAuth 2.0 APIoauth2.tokeninfo メソッドを使用します。

Compute Engine 上で Elasticsearch のような全文検索データベースをホストし、サービスからアクセスします。

タスクキュー

pull キューを Pub/Sub に移行し、push キューを Cloud Tasks に移行します。アプリが pull キューと push キューの両方を使用している場合は、最初に pull キューを移行して、Cloud Tasks での予期しない動作を防ぎます。

これらの移行の詳細については、次のページをご覧ください。

URL 取得

デフォルトでは、Python 2.7 ランタイムは、URL 取得サービスを使用して送信 HTTP(S) リクエストを処理します。標準の Python ライブラリを使用してリクエストを発行する場合も同様です。

非同期リクエストを行うなど、アプリが URL Fetch API を直接使用する場合は、標準の Python ライブラリ(リクエスト ライブラリなど)に移行することをおすすめします。

詳細については、送信リクエストの移行をご覧ください。

ユーザー認証

Users API の代わりに、次のような HTTP ベースの任意の認証メカニズムを使用します。