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

Python 3 標準ランタイムへの移行

2020 年 1 月 1 日より、Python コミュニティは Python 2.7 の更新、バグの修正、セキュリティの問題の修正を行いません。App Engine スタンダード環境の Python 2 ランタイムで実行中のアプリは、できるだけ早く Python 3 ランタイムに移行することをおすすめします。詳細については、Google Cloud での Python 2 のサポートをご覧ください。

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 サービスがない

Python 3 ランタイムから、App Engine スタンダード環境には Memcache や Task Queues などの App Engine バンドル サービスが含まれなくなりました。代わりに Google Cloud が提供するスタンドアロン プロダクトが、Python 2 ランタイムのほとんどのバンドル サービスに相当します。Google Cloud で個別のプロダクトとして提供されないバンドル サービス(画像処理、検索、メッセージングなど)については、この移行ガイドに記載されているサードパーティ プロバイダまたはその他の回避策を使用できます。

バンドルされた App Engine サービスを削除すると、Python 3 ランタイムでは汎用的な方法で完全な Python 開発を行うことができます。Python 3 ランタイムでは、完全に移植可能な標準の Python アプリを作成し、App Engine を含む任意の標準 Python 環境で実行できます。

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

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

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

移行プロセスの概要

次の段階的な移行アプローチをおすすめします。これにより、プロセス全体を通じてアプリケーションが常に機能し、テストが可能となります。

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

    この手順を完了すると、Python 2 アプリは google.appengine API を使用しなくなります。

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

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

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

  3. Python 3 ランタイム用の App Engine 構成ファイルを準備します。app.yaml の構成設定には、以下のような重要な変更がいくつかあります(ただし、これらに限定されません)。

    • アプリはスレッドセーフであると見なされます。スレッドセーフではないアプリの場合は、app.yaml ファイルを変更して、費用を大幅に増やさないようにする必要があります。
    • app.yaml ファイルは、スクリプトへのリクエストをルーティングしなくなりました。代わりに、アプリ内ルーティングでウェブ フレームワークを使用し、app.yaml のすべての script ハンドラを更新または削除してください。
  4. Python 3 環境でアップグレードしたアプリをテストしてデプロイします。

    Python 3 環境でアップグレードしたアプリを実行するまで、表示されない互換性の問題の修正にかなりの時間が必要になります。

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