1. 概要
サーバーレス移行ステーション シリーズの Codelab(ご自分のペースで進められる実践型のチュートリアル)と関連動画は、主にレガシー サービスからの移行を 1 つ以上行うことで、Google Cloud サーバーレスのデベロッパーがアプリケーションをモダナイズできるよう支援することを目的としています。これにより、アプリの移植性が向上し、オプションと柔軟性が高まるため、幅広い Cloud プロダクトとの統合やアクセスが可能になり、新しい言語リリースへのアップグレードが容易になります。このシリーズは、当初は初期の Cloud ユーザー、主に App Engine(標準環境)のデベロッパーを対象としていましたが、Cloud Functions や Cloud Run などの他のサーバーレス プラットフォームや、該当する場合は他のプラットフォームも対象とするほど幅広くなっています。
以前は、言語バージョンをアップグレードする前に、デベロッパーは Datastore や Memcache などの App Engine の以前の「バンドル サービス」から移行する必要がありました。これは、2 つの難しい作業を連続して行う必要がありました。第 2 世代の App Engine サービスで多くの主要なバンドル サービスを利用できるようにすることで、デベロッパーはバンドル サービス(のほとんど)を引き続き使用しながら、アプリを最新のランタイムに移植できるようになりました。この Codelab では、Datastore バンドル サービス(App Engine NDB ライブラリ経由)の使用を維持しながら、サンプルアプリを Python 2 から 3 にアップグレードする手順について説明します。このチュートリアルで説明するように、ほとんどのバンドル サービスを使用するには、コードの軽微な更新のみが必要です。ただし、より大規模な変更が必要なものもあります。これについては、フォローアップ モジュールと Codelab である「パート 2」で説明します。
GCP コンソールの
- サンプル App Engine アプリを Python 2 から 3 に移植する
- App Engine SDK を含めるようにアプリの構成を更新する
- Python 3 などの第 2 世代ランタイムでバンドル サービスをサポートするアプリに SDK コードを追加する
必要なもの
- 有効な GCP 請求先アカウントを持つ Google Cloud プロジェクト
- 基本的な Python スキル
- 一般的な Linux コマンドに関する実践的な知識
- App Engine アプリの開発とデプロイに関する基礎知識
- 正常に機能するモジュール 1 App Engine アプリ(その Codelab を完了する [推奨]、またはリポジトリからアプリをコピーする)
アンケート
このチュートリアルをどのように使用されますか?
Python のご利用経験はどの程度ありますか?
Google Cloud サービスの使用経験はどの程度ありますか?
2. 背景情報
元の App Engine サービスは 2008 年にリリースされ、デベロッパーがアプリケーションをグローバルにビルドしてデプロイするのに便利な一連の以前の API(現在はバンドル サービスと呼ばれています)が付属していました。これらのサービスには、Datastore、Memcache、Task Queue があります。便利な一方で、ユーザーは App Engine に関連付けられた独自の API を使用するとアプリの移植性が低下することを懸念し、アプリの移植性を高めることを望んでいました。こうしたバンドル サービスの多くが独立してスタンドアロンの Cloud プロダクトとなったこともあり、App Engine チームは 2018 年に次世代プラットフォームをリリースしました。
Python 2 デベロッパーは Python 3 へのアップグレードを熱望しています。バンドル サービスを使用する 2.x アプリは、アプリを 3.x に移植する前に、これらのサービスから移行する必要がありました。これは、連続して強制移行を行うことを意味し、困難な移行になる可能性がありました。この移行を支援するため、App Engine チームは 2021 年秋に過去への「ワームホール」を導入しました。これにより、次世代ランタイムで実行されているアプリは、これらのバンドル サービスの多くにアクセスできます。このリリースには、元のランタイムで利用可能なすべてのサービスが含まれているわけではありませんが、Datastore、Task Queue、Memcache などの主要なサービスは利用できます。
この Codelab では、バンドルされたサービスの使用を維持しながらアプリを Python 3 にアップグレードするために必要な変更について説明します。目標は、アプリを最新のランタイムで実行できるようにすることです。これにより、3.x へのアップグレードの妨げになるのではなく、バンドル サービスから Cloud のスタンドアロンの同等サービスまたはサードパーティの代替サービスに独自のタイムラインで移行できるようになります。バンドル サービスからの移行は必須ではなくなりましたが、移行することで、ワークロードに適したプラットフォームに移行したり、前述のように最新の言語リリースにアップグレードしながら App Engine を使い続けたりするなど、アプリをホストできる場所の移植性と柔軟性が向上します。
モジュール 1 の Python 2 サンプルアプリは、App Engine NDB を介して Datastore バンドル サービスを利用します。アプリは、モジュール 1 の Codelab で完了した webapp2 から Flask へのフレームワークの移行をすでに完了していますが、Datastore の使用はそのままです。
このチュートリアルでは、次の手順について説明します。
- セットアップ / 事前作業
- 構成の更新
- アプリケーション コードを変更する
3. セットアップ/事前作業
このセクションでは、次の方法を説明します。
- Cloud プロジェクトを設定する
- ベースライン サンプルアプリを入手する
- ベースライン アプリを(再)デプロイして検証する
これらの手順により、動作するコードから開始できます。
1. プロジェクトをセットアップする
モジュール 1 の Codelab を完了している場合は、同じプロジェクト(とコード)を再利用することをおすすめします。または、新しい Cloud プロジェクトを作成するか、別の既存のプロジェクトを再利用します。プロジェクトに App Engine サービスが有効になっているアクティブな請求先アカウントがあることを確認します。
2. ベースライン サンプルアプリを入手する
この Codelab の前提条件の 1 つは、機能するモジュール 1 App Engine アプリを用意することです。モジュール 1 Codelab を完了する(推奨)か、リポジトリからモジュール 1 アプリをコピーします。ご自分のコードと Google で用意したコードのいずれを使用される場合も、モジュール 1 のコードから開始します。この Codelab では、各ステップを順を追って説明します。最後に、モジュール 7 のリポジトリ フォルダ「FINISH」にあるコードに似たコードが完成します。
- 開始: モジュール 1 フォルダ(Python 2)
- 終了: Module 1b フォルダ(Python 3)
- リポジトリ全体(クローン作成または ZIP ファイルのダウンロード)
モジュール 1 のどのアプリを使用しても、フォルダは次のようになります(lib フォルダも含まれる場合があります)。
$ ls README.md appengine_config.py requirements.txt app.yaml main.py templates
3. ベースライン アプリを(再)デプロイする
Module 1 アプリを(再)デプロイする手順は次のとおりです。
libフォルダが存在する場合は削除し、pip install -t lib -r requirements.txtを実行してlibを再作成します。Python 2 と 3 の両方がインストールされている場合は、代わりにpip2コマンドを使用する必要があります。gcloudコマンドライン ツールをインストールして初期化し、その使用方法を確認してください。- 発行する
gcloudコマンドごとにPROJECT_IDを入力したくない場合は、gcloud config set projectPROJECT_IDを使用して Cloud プロジェクトを設定します。 gcloud app deployを使用してサンプルアプリをデプロイする- モジュール 1 アプリが期待どおりに動作し、最新のアクセスが問題なく表示されることを確認します(下図を参照)。

4. 構成を更新する
各手順を正常に実行して、ウェブアプリが動作することを確認したら、このアプリを Python 3 に移植する準備が整いました。構成から開始します。
requirements.txt に SDK を追加する
App Engine Python 3 ランタイムでは、サードパーティ ライブラリを使用する際のオーバーヘッドが大幅に削減されます。必要なのは、それらを requirements.txt に記載することだけです。Python 3 でバンドル サービスを使用するには、App Engine SDK パッケージ appengine-python-standard を追加します。SDK パッケージは、モジュール 1 の Flask に参加します。
flask
appengine-python-standard
app.yaml を更新する
次の手順に沿って、構成の変更を app.yaml ファイルに適用します。
runtimeディレクティブをサポートされている Python 3 リリースに置き換えます。たとえば、Python 3.10 の場合はpython310を指定します。- Python 3 ではどちらのディレクティブも使用されないため、
threadsafeディレクティブとapi_versionディレクティブの両方を削除します。 - このアプリにはスクリプト ハンドラのみがあるため、
handlersセクションを完全に削除します。アプリに静的ファイル ハンドラがある場合は、handlersでそのままにします。 - Python 3 ランタイムは、Python 2 ランタイムのように組み込みのサードパーティ ライブラリをサポートしていません。アプリの
app.yamlにlibrariesセクションがある場合は、そのセクション全体を削除します。(必要なパッケージは、組み込みでないライブラリと同様にrequirements.txtに記載するだけで済みます)。このサンプルアプリにはlibrariesセクションがないため、次のステップに進みます。 trueに設定されたapp_engine_apisディレクティブを作成して使用します。これは、上記のrequirements.txtに App Engine SDK パッケージを追加することに対応しています。
app.yaml に必要な変更の概要:
変更前:
runtime: python27
threadsafe: yes
api_version: 1
handlers:
- url: /.*
script: main.app
変更後:
runtime: python310
app_engine_apis: true
その他の構成ファイル
すべてのサードパーティ パッケージは requirements.txt にのみ記載すればよいので、appengine_config.py に特別なものがない限り、appengine_config.py は不要です。削除してください。同様に、すべてのサードパーティ ライブラリはビルドプロセス中に自動的にインストールされるため、コピーやベンダー化は不要です。つまり、pip install コマンドも lib フォルダも不要になるため、削除します。要約:
appengine_config.py個のファイルを削除lib個のフォルダを削除しますか?
これで、必要な構成変更はすべて完了しました。
5. アプリケーション コードを変更する
Python 3 ランタイム環境で利用可能なバンドル サービスの大部分にアクセスするには、ウェブサーバー ゲートウェイ インターフェース(WSGI)アプリケーション オブジェクトを main.py でラップする短いコードが必要です。ラッパー関数は google.appengine.api.wrap_wsgi_app() です。これを使用するには、インポートして WSGI オブジェクトをラップします。main.py で Flask の必要な更新を反映するために、以下の変更を行います。
変更前:
from flask import Flask, render_template, request
from google.appengine.ext import ndb
app = Flask(__name__)
変更後:
from flask import Flask, render_template, request
from google.appengine.api import wrap_wsgi_app
from google.appengine.ext import ndb
app = Flask(__name__)
app.wsgi_app = wrap_wsgi_app(app.wsgi_app)
他の Python フレームワークの WSGI ラッピングの例については、ドキュメントをご覧ください。
この例は、Python 3 のほとんどのバンドル サービスにアプリがアクセスできるようにするうえで有効ですが、Blobstore や Mail などのサービスでは追加のコードが必要です。これらのサンプルについては、別の移行モジュールで説明します。
これで、App Engine バンドル サービスの使用をモジュール 1 サンプルアプリに追加するために必要な変更はすべて完了しました。アプリケーションはすでに Python 2 と 3 と互換性があるため、構成ですでに行った変更以外に、Python 3 に移植するための追加の変更はありません。最後のステップ: この変更されたアプリを次世代の App Engine Python 3 ランタイムにデプロイし、更新が成功したことを確認します。
6. 概要/クリーンアップ
このセクションでは、アプリをデプロイし、意図したとおりに動作することと、出力に反映されることを確認して、この Codelab を終了します。アプリの検証が完了したら、クリーンアップを行い、次のステップを検討します。
アプリケーションをデプロイして検証する
gcloud app deploy を使用して Python 3 アプリをデプロイし、アプリが Python 2 と同じように動作することを確認します。機能に変更はないため、出力はモジュール 1 のアプリと同じになります。

最後に
- モジュール 1b フォルダ(FINISH)の内容と照らし合わせて、必要に応じて調整します。
- アプリで
webapp2がまだ使用されている場合は、このページで モジュール 0main.pyと モジュール 1bmain.pyを比較し、モジュール 1 Codelab を実行してwebapp2から Flask への移行方法を学習します。
このたびは、Python 2 App Engine アプリを Python 3 に移植し、バンドル サービスの使用を維持するための第一歩を踏み出されたことをお祝い申し上げます。
クリーンアップ
全般
現時点で完了した場合は、課金が発生しないように App Engine アプリを無効にすることをおすすめします。ただし、さらにテストや実験を行う場合は、App Engine プラットフォームに無料割り当てがあります。この使用量枠を超えない限り、課金されることはありません。これはコンピューティングの料金ですが、関連する App Engine サービスの料金も発生する可能性があります。詳細については、料金ページをご覧ください。この移行に他の Cloud サービスが含まれる場合は、それらのサービスは別途請求されます。どちらの場合も、該当する場合は、以下の「この Codelab に固有」のセクションをご覧ください。
完全に開示すると、App Engine などの Google Cloud サーバーレス コンピューティング プラットフォームにデプロイすると、ビルドとストレージの費用がわずかに発生します。Cloud Build には独自の無料割り当てがあり、Cloud Storage にも独自の無料割り当てがあります。そのイメージの保存には、その割り当ての一部が使用されます。ただし、お住まいの地域でこのような無料枠が提供されていない可能性もあります。そのため、保存容量の使用状況を把握して、費用を最小限に抑えるようにしてください。確認する必要がある特定の Cloud Storage の「フォルダ」は次のとおりです。
console.cloud.google.com/storage/browser/LOC.artifacts.PROJECT_ID.appspot.com/containers/imagesconsole.cloud.google.com/storage/browser/staging.PROJECT_ID.appspot.com- 上記のストレージ リンクは、
PROJECT_IDと *LOC*ーションによって異なります。たとえば、アプリが米国でホストされている場合は「us」になります。
ただし、このアプリケーションや関連する移行 Codelab を続行せず、すべてを完全に削除する場合は、プロジェクトをシャットダウンしてください。
この Codelab に固有
以下のサービスは、この Codelab 固有のものです。詳細については、各プロダクトのドキュメントをご覧ください。
- App Engine Datastore サービスは Cloud Datastore(Datastore モードの Cloud Firestore)によって提供されます。これにも無料枠があります。詳細については、料金ページをご覧ください。
次のステップ
ここからいくつかの方向に進むことができます。
- バンドル サービスを使用するコードを更新する(より多くのコード変更が必要)
- バンドル サービスから Cloud スタンドアロン プロダクトに移行する
- App Engine から別の Cloud サーバーレス プラットフォームに移行する
Blobstore、Mail、Deferred などの他のバンドル サービスにアクセスするには、さらにコードの変更が必要です。App Engine の以前のバンドル サービスからの移行に焦点を当てた移行モジュールには、次のものがあります。
- モジュール 2: App Engine NDB から Cloud NDB
- モジュール 7 ~ 9: App Engine TaskQueue(push タスク)から Cloud Tasks
- モジュール 12 ~ 13: App Engine Memcache から Cloud Memorystore
- モジュール 15 ~ 16: App Engine Blobstore から Cloud Storage
- モジュール 18 ~ 19: App Engine TaskQueue(pull タスク)から Cloud Pub/Sub
App Engine は、Google Cloud の唯一のサーバーレス プラットフォームではなくなりました。小規模な App Engine アプリや、機能が制限されているアプリをスタンドアロンのマイクロサービスに変換したい場合や、モノリシック アプリを複数の再利用可能なコンポーネントに分割したい場合は、Cloud Functions への移行を検討する理由として十分です。コンテナ化がアプリケーション開発ワークフローの一部になっている場合(特に CI/CD(継続的インテグレーション/継続的デリバリーまたはデプロイ)パイプラインで構成されている場合)は、Cloud Run への移行を検討してください。これらのシナリオは、次のモジュールで取り上げます。
- App Engine から Cloud Functions に移行する: モジュール 11 をご覧ください。
- App Engine から Cloud Run に移行する: モジュール 4 で Docker を使用してアプリをコンテナ化するか、モジュール 5 でコンテナ、Docker の知識、
Dockerfileを使用せずにコンテナ化します。
別のサーバーレス プラットフォームへの切り替えは任意です。変更を行う前に、アプリとユースケースに最適なオプションを検討することをおすすめします。
次にどの移行モジュールを検討する場合でも、すべてのサーバーレス移行ステーションのコンテンツ(Codelab、動画、ソースコード [利用可能な場合])は、オープンソース リポジトリからアクセスできます。リポジトリの README には、考慮すべき移行と、移行モジュールの関連する「順序」に関するガイダンスも記載されています。
7. 参考情報
以下に、デベロッパーがこの移行モジュールまたは関連する移行モジュールや関連プロダクトをさらに詳しく調べるための追加リソースを示します。このコンテンツに関するフィードバックを送信できる場所、コードへのリンク、役立つ可能性のあるさまざまなドキュメントなどが含まれます。
Codelab に関する問題/フィードバック
この Codelab に問題が見つかった場合は、提出する前にまず問題を検索してください。新しい問題の検索と登録を行うためのリンク:
移行に関するリソース
モジュール 1(開始)とモジュール 1b(終了)のリポジトリ フォルダへのリンクを以下の表に示します。これらのフォルダには、すべての App Engine Codelab 移行のリポジトリからアクセスすることもできます。
Codelab | Python 2 | Python 3 |
なし | ||
モジュール 17(この Codelab) | なし | コード(mod1b-flask) |
オンライン リソース
このチュートリアルに関連する可能性のあるオンライン リソースは次のとおりです。
App Engine のバンドル サービス
- Python 3 次世代ランタイムでバンドル サービスにアクセスする
- モジュール 0 アプリ(Python 2)とモジュール 1b アプリ(Python 3)の並列比較
- App Engine SDK ウェブ フレームワーク WSGI オブジェクト ラッパーのサンプル
- 次世代ランタイムでの App Engine バンドル サービスのサポートの開始(2021 年)
App Engine の一般的なドキュメント
- App Engine のドキュメント
- Python 2 App Engine(標準環境)ランタイム
- Python 2 App Engine で App Engine の組み込みライブラリを使用する
- Python 3 App Engine(スタンダード環境)ランタイム
- Python 2 と 3 の App Engine(スタンダード環境)ランタイムの違い
- Python 2 から 3 への App Engine(スタンダード環境)移行ガイド
- App Engine の料金と割り当てに関する情報
- 第 2 世代の App Engine プラットフォームのリリース(2018 年)
- レガシー ランタイムの長期サポート
- ドキュメント移行サンプル リポジトリ
- コミュニティ提供の移行サンプル リポジトリ
その他のクラウド情報
- Google Cloud Platform での Python
- Google Cloud Python クライアント ライブラリ
- Google Cloud の「常時無料」枠
- Google Cloud SDK(
gcloudコマンドライン ツール) - Google Cloud に関するすべてのドキュメント
動画
ライセンス
この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。