App Engine フレキシブル環境で Python アプリを作成する

リージョン ID

REGION_ID は、アプリの作成時に選択したリージョンに基づいて Google が割り当てる省略形のコードです。一部のリージョン ID は、一般的に使用されている国や州のコードと類似しているように見える場合がありますが、このコードは国または州に対応するものではありません。2020 年 2 月以降に作成されたアプリの場合、REGION_ID.r は App Engine の URL に含まれています。この日付より前に作成されたアプリの場合、URL のリージョン ID は省略可能です。

詳しくは、リージョン ID をご覧ください。

このクイックスタートでは、ショート メッセージを表示するアプリを作成してデプロイする方法を説明します。このクイックスタートのサンプル アプリケーションは、app.yaml ファイルでランタイム バージョンとオペレーティング システムを指定することで、Python のサポート対象のバージョンで使用できます。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Build API.

    Enable the API

  5. Install the Google Cloud CLI.
  6. To initialize the gcloud CLI, run the following command:

    gcloud init
  7. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  8. Make sure that billing is enabled for your Google Cloud project.

  9. Enable the Cloud Build API.

    Enable the API

  10. Install the Google Cloud CLI.
  11. To initialize the gcloud CLI, run the following command:

    gcloud init

追加の前提条件

  1. プロジェクトで App Engine アプリケーションを初期化し、そのリージョンを選択します。

    gcloud app create --project=[YOUR_PROJECT_ID]
    

    表示された指示に従って、App Engine アプリケーションを配置するリージョンを選択します。

  2. ローカルマシンに次のものをインストールします。

    • 次のコマンドを実行して、Python 用の App Engine 拡張機能が含まれている gcloud コンポーネントをインストールします。

      gcloud components install app-engine-python
      

  3. Python 開発用に環境を準備します。ご使用のシステムに最新バージョンの Python、pip、その他関連ツールをインストールしておくことをおすすめします。手順については、Python 開発環境の設定ガイドをご覧ください。

App Engine のロケーション

App Engine はリージョナルです。つまり、アプリを実行するインフラストラクチャは特定のリージョンに配置され、そのリージョン内のすべてのゾーンで冗長的に利用できるように Google が管理しています。

レイテンシ、可用性、耐久性の要件を満たすことが、アプリを実行するリージョンを選択する際の主な要素になります。一般的には、アプリのユーザーに最も近いリージョンを選択できますが、App Engine が使用可能なロケーションと、アプリが使用するその他の Google Cloud プロダクトおよびサービスのロケーションを考慮する必要があります。使用するサービスが複数のロケーションにまたがっていると、アプリのレイテンシだけでなく、料金にも影響する可能性があります。

設定したアプリのリージョンは変更できません。

すでに App Engine アプリケーションを作成している場合は、次のいずれかの方法でそのリージョンを表示できます。

このクイックスタートでは、App Engine にデプロイ可能な Flask ウェブ フレームワークを使用して作成された、最新の Python 3 アプリについて説明します。このサンプルでは Flask を使用していますが、上記の要件を満たすウェブ フレームワークも使用可能です。代わりに使用できるフレームワークとしては、DjangoPyramidBottleweb.py などが挙げられます。

Hello World アプリをダウンロードする

App Engine 用の Hello World アプリが用意されており、Google Cloud へのアプリのデプロイをすぐに試すことができます。

  1. Hello World サンプルアプリ リポジトリのクローンをローカルマシンに作成します。

    git clone https://github.com/GoogleCloudPlatform/python-docs-samples
    

    または、zip 形式のサンプルをダウンロードして、ファイルを抽出します。

  2. サンプルコードが含まれているディレクトリに移動します。

       cd python-docs-samples/appengine/flexible/hello_world
    

ローカルマシン上で Hello World を実行する

ローカルのパソコンで Hello World アプリを実行するには:

Mac OS / Linux

  1. 分離された Python 環境を作成します。
    python3 -m venv env
    source env/bin/activate
  2. 現在のディレクトリにサンプルコードが含まれていない場合は、hello_world サンプルコードが含まれるディレクトリに移動します。その後、依存関係をインストールします。
    cd YOUR_SAMPLE_CODE_DIR
    pip install -r requirements.txt
  3. アプリケーションを実行します。
    python main.py
  4. ウェブブラウザに次のアドレスを入力します。
    http://localhost:8080

    Cloud Shell を使用する場合は、代わりにツールバーの [ウェブでプレビュー] をクリックし、[ポート 8080 上でプレビュー] を選択します。

ウィンドウ

PowerShell を使用して Python パッケージを実行します。

  1. インストールされた PowerShell を探します。
  2. PowerShell へのショートカットを右クリックし、管理者として PowerShell を起動します。
  3. 分離された Python 環境を作成します。
    python -m venv env
    .\env\Scripts\activate
  4. プロジェクト ディレクトリに移動し、依存関係をインストールします。現在のディレクトリにサンプルコードが含まれていない場合は、hello_world サンプルコードが含まれるディレクトリに移動します。その後、依存関係をインストールします。
    cd YOUR_SAMPLE_CODE_DIR
    pip install -r requirements.txt
  5. アプリケーションを実行します。
    python main.py
  6. ウェブブラウザに次のアドレスを入力します。
    http://localhost:8080

サンプルアプリからの「Hello World」というメッセージがページに表示されます。ターミナル ウィンドウで Ctrl+C キーを押してウェブサーバーを終了します。

Hello World を App Engine にデプロイして実行する

App Engine フレキシブル環境にアプリをデプロイする手順は次のとおりです。

  1. hello_world ディレクトリで次のコマンドを実行して、Hello World アプリをデプロイします。

    gcloud app deploy

    オプションのフラグをご覧ください。

    共通の gcloud コマンドフラグ

    • アプリのバージョンを一意に識別する ID を指定するには --version フラグを含めます。このフラグを含めない場合は自動的に生成されます。例: --version [YOUR_VERSION_ID]
    • gcloud ツールでデフォルトとして初期設定したものに代わる Google Cloud プロジェクト ID を指定するには、--project フラグを指定します。例: --project [YOUR_PROJECT_ID]

    例:

    gcloud app deploy --version pre-prod-5 --project my-sample-app

    コマンドラインからアプリをデプロイする方法について詳しくは、アプリのテストとデプロイをご覧ください。すべてのコマンドフラグの一覧については、gcloud app deploy リファレンスをご覧ください。

  2. ブラウザを起動し、https://PROJECT_ID.REGION_ID.r.appspot.com にアクセスしてアプリを表示します。

    gcloud app browse
    ここで PROJECT_ID は、Google Cloud プロジェクト ID です。

今回、Hello World メッセージが表示されるページは、App Engine インスタンスで実行されているウェブサーバーから配信されます。

これで完了です。App Engine フレキシブル環境に最初の App Engine アプリケーションをデプロイしました。

アプリケーションのデプロイでエラーが発生した場合は、トラブルシューティングのヒントをご覧ください。

クリーンアップの詳細については、以下の説明をご覧ください。また、活用できる次のステップへのリンクも併せてご確認ください。

クリーンアップ

課金されないようにするには、Google Cloud プロジェクトを削除してプロジェクト内のすべてのリソースへの課金を停止します。

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

次のステップ

プラットフォーム全体について学習する

App Engine アプリの開発とデプロイについて概要を理解した後は、Google Cloud の残りの部分についても確認します。すでに Google Cloud CLI がインストールされているため、Cloud SQL、Cloud Storage、Firestore などのプロダクトを操作するツールを使用できます。

App Engine フレキシブル環境について学習する

App Engine についてさらに理解を深めるためのトピックをご紹介します。

Hello World コードレビュー

Hello World は、サービスが 1 つだけ含まれ、バージョンも 1 つだけで、すべてのコードがアプリケーションのルート ディレクトリにあるという、最もシンプルな App Engine アプリケーションです。このセクションでは、このアプリの各ファイルを詳しく説明します。

main.py

Hello World アプリは 1 つのファイルからなる基礎的な Flask アプリです。

from flask import Flask


app = Flask(__name__)


@app.route("/")
def hello() -> str:
    """Return a friendly HTTP greeting.

    Returns:
        A string with the words 'Hello World!'.
    """
    return "Hello World!"


if __name__ == "__main__":
    # This is used when running locally only. When deploying to Google App
    # Engine, a webserver process such as Gunicorn will serve the app.
    app.run(host="127.0.0.1", port=8080, debug=True)

app.yaml

app.yaml ファイルには、アプリの次の構成が記述されます。

  • env: flex の設定。アプリで App Engine フレキシブル環境が使用されることが示されます。
  • アプリで使用するランタイムを指定します。runtime_version 設定を除外した場合、App Engine はアプリのデフォルトのバージョンとして最新の Python バージョンを使用します。

  • entrypoint は、App Engine にアプリの起動方法を指示します。このアプリは、Flask の開発用サーバー(ローカルで実行する場合に使用)の代わりに gunicorn を使用して Python アプリを処理します。$PORT 変数は、App Engine がアプリを起動したときに設定します。entrypoint の詳細については、アプリの起動をご覧ください。

# Copyright 2021 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

runtime: python
env: flex
entrypoint: gunicorn -b :$PORT main:app

runtime_config:
  operating_system: ubuntu22

# This sample incurs costs to run on the App Engine flexible environment.
# The settings below are to reduce costs during testing and are not appropriate
# for production use. For more information, see:
# https://cloud.google.com/appengine/docs/flexible/python/configuring-your-app-with-app-yaml
manual_scaling:
  instances: 1
resources:
  cpu: 1
  memory_gb: 0.5
  disk_size_gb: 10

requirements.txt

requirements.txt と Python パッケージ管理システム pip は、アプリケーションの依存関係を宣言し、インストールします。Hello World には、ウェブ フレームワークの Flask と WSGI サーバーの Gunicorn が必要です。

Flask==3.0.3; python_version > '3.6'
Flask==2.3.3; python_version < '3.7'
Werkzeug==3.0.3; python_version > '3.6'
Werkzeug==2.3.7; python_version < '3.7'
gunicorn==22.0.0

requirements.txt では、ローカルにも App Engine へのデプロイ時にもインストールされるライブラリを定義しています。