Python 2 は、コミュニティによるサポートを終了しました。Python 2 アプリを Python 3 に移行することをおすすめします。

Python 3 ランタイムへの移行

Python 3 ランタイムに移行すると、最新の言語機能を使用するだけでなく、慣用的なコードでより移植性の高いアプリを構築できます。Python 3 ランタイムでは、Python Software Foundation が提供する最新バージョンのオープンソース Python インタープリタが使用されます。Python 3 ランタイムで構築したアプリでは、requirements.txt ファイルに依存関係を宣言することで、Python の豊富なパッケージやフレームワークを使用できます(C コードを使用するものも利用できます)。

ランタイム移行プロセスの概要

ランタイムを移行する場合は、次のような段階的なアプローチをおすすめします。これにより、プロセス全体を通じてアプリケーションを機能させ、テスト可能な状態を維持できます。

  1. Python 2 と Python 3 の両方に対応するようにアプリをアップグレードします。

    このアップグレードをサポートするソリューションがいくつかあります。たとえば、SixPython-FuturePython-Modernize などを使用します。

    移行プロセスの詳細な手順については、Python Software Foundation ドキュメントのサイトで Porting Python 2 Code to Python 3 をご覧ください。

  2. アプリで使用する App Engine バンドル サービスに対して、次のいずれかの実装戦略を選択します。

    1. Python 2 アプリの App Engine バンドル サービスをバンドルされていない Google Cloud サービス、サードパーティのサービス、その他のおすすめの代替サービスに移行します。

    2. 引き続き Python 3 アプリで App Engine バンドル サービスを使用します。このアプローチでは、移行サイクルの後半でバンドルされていないサービスに移行できます。

    各サービスを移行した後で、必ずアプリをテストしてください。

  3. Python 3 ランタイム用に App Engine 構成ファイルを準備します。app.yaml の構成設定に影響する重要な変更がいくつかあります。

    • アプリはスレッドセーフとみなされるようになりました。アプリケーションがスレッドセーフでない場合は、app.yamlmax_concurrent_requests を 1 に設定する必要があります。この設定により、スレッドセーフなアプリで必要な数を上回る数のインスタンスが作成され、不要なコストが発生する可能性があります。
    • app.yaml ファイルでは、スクリプトへのリクエストがルーティングされなくなりました。代わりに、アプリ内ルーティングでウェブ フレームワークを使用し、app.yaml のすべての script ハンドラを更新または削除する必要があります。この処理を Flask フレームワークで行う方法については、GitHub の App Engine 移行ガイドのコードサンプルをご覧ください。

      この構成ファイルや他の構成ファイルを変更する方法については、構成ファイルのセクションをご覧ください。

  4. アップグレードしたアプリを Python 3 環境でテストしてデプロイします。

    すべてのテストに合格したら、アップグレードしたアプリを App Engine にデプロイします。ただし、トラフィックが新しいバージョンに自動的にルーティングされないようにします。トラフィック分割を使用して、Python 2 ランタイムのアプリから Python 3 ランタイムのアプリにトラフィックを段階的に移行します。問題が発生した場合は、問題が解決するまですべてのトラフィックを安定バージョンに転送します。

Python 2 アプリを Python 3 に変換する方法については、その他のリソースをご覧ください。

Python 2 ランタイムと Python 3 ランタイムの主な違い

移行中に行う必要がある変更のほとんどは、Python 2 ランタイムと Python 3 ランタイムの次のような違いによるものです。

Python 2 と Python 3 の互換性の問題

Python 3 が 2008 年に初めて発表された時点で、Python に対して下位互換性のない複数の変更が行われています。print ステートメントから print() 関数に変更するなど、コードの軽微な更新だけで対処できる変更もありますが、バイナリデータ、テキスト、文字列を扱う方法の更新など、コードに大幅な更新が必要な変更もあります。

Python 標準ライブラリを含む一般的な多くのオープンソース ライブラリも、Python 2 から Python 3 への移行に伴い変更されています。

Python 3 ランタイムでの App Engine バンドル サービス

移行の労力と複雑さを軽減するため、App Engine スタンダード環境では Python 3 ランタイムで多くの App Engine バンドル サービスと API にアクセスできます(Memcache など)。Python 3 アプリは、言語固有のライブライを介してバンドル サービスの API を呼び出すことができ、Python 2 ランタイムとほぼ同じ機能にアクセスできます。

App Engine バンドル サービスと同様の機能を提供する Google Cloud プロダクトを使用することもできます。バンドルされていない Google Cloud プロダクトへの移行を検討することをおすすめします。これにより、継続的な改善と新機能を活用できるようになります。

Google Cloud で個別のプロダクトとして提供されないバンドル サービス(画像処理、検索、メッセージングなど)については、推奨のサードパーティ プロバイダまたはその他の回避策を使用できます。

構成ファイル

App Engine スタンダード環境の Python 3 ランタイムでアプリを実行する前に、App Engine で使用する構成ファイルの一部を変更する必要があります。

動的コンテンツのリクエストを転送するために必要なウェブ フレームワーク

Python 2 ランタイムでは、app.yaml ファイルで URL ハンドラを作成して、特定の URL または URL パターンがリクエストされたとき実行するアプリを指定できます。

Python 3 ランタイムでは、アプリが app.yaml で URL ハンドラを使用するのでなく、代わりに Flask や Django などのウェブ フレームワークを使用して動的コンテンツのリクエストを転送する必要があります。静的コンテンツの場合は、アプリの app.yaml ファイルで引き続き URL ハンドラを作成できます。

テスト

dev_appserver に依存するよりも、Python に対して汎用的なテスト方法を使用することをおすすめします。たとえば venv を使用すれば、分離されたローカル Python 3 環境を作成できます。標準的な任意の Python テスト フレームワークを使用して、単体テスト、統合テスト、システムテストを作成できます。サービスのデベロッパー版を設定するか、多くの Google Cloud プロダクトで用意されているローカル エミュレータを使用することもできます。

必要に応じて、Python 3 をサポートするプレビュー版の dev_appserver を使用できます。このテスト機能の詳細については、ローカル開発用サーバーの使用をご覧ください。

デプロイ

appcfg.py を使用したデプロイは、Python 3 でサポートされていません。アプリのデプロイには gcloud コマンドライン ツールを使用します

ロギング

Python 3 ランタイムでのロギングは、Cloud Logging のロギング標準に従います。Python 3 ランタイムでは、アプリログがリクエストログにバンドルされなくなり、別のレコードに分離されます。Python 3 ランタイムにおけるログの読み取りと書き込みの詳細については、ロギングガイドをご覧ください。

移行に関するその他のリソース

App Engine アプリをスタンドアロンの Cloud サービスまたは Python 3 ランタイムに移行する方法については、次の App Engine リソースをご覧ください。