Python での Hello Cloud Run

1. はじめに

96d07289bb51daa7.png

Cloud Run は、マネージド型のコンピューティング プラットフォームで、HTTP リクエスト経由で呼び出し可能なステートレス コンテナを実行できます。Knative オープンソース プロジェクトを基に構築されているため、プラットフォーム間でワークロードを移植できます。Cloud Run はサーバーレスです。インフラストラクチャ管理が一切不要なため、最も重要な作業であるアプリケーションの構築に集中できます。

このチュートリアルの目標は、シンプルなウェブ アプリケーションを作成して Cloud Run にデプロイすることです。

2. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell の起動

Google Cloud はノートパソコンからリモートで操作できますが、このチュートリアルでは、クラウド上で動作するコマンドライン環境である Cloud Shell を使用します。

Cloud Shell をアクティブにする

  1. Cloud Console で、[Cloud Shell をアクティブにする] 853e55310c205094.png をクリックします。

3c1dabeca90e44e5.png

Cloud Shell を初めて起動する場合は、内容を説明する中間画面が表示されます。中間画面が表示されたら、[続行] をクリックします。

9c92662c6a846a5c.png

Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。

9f0e51b578fecce5.png

この仮想マシンには、必要なすべての開発ツールが読み込まれます。5 GB の永続的なホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワークのパフォーマンスと認証が大幅に向上しています。この Codelab での作業のほとんどはブラウザを使って行うことができます。

Cloud Shell に接続すると、認証が完了し、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。

  1. Cloud Shell で次のコマンドを実行して、認証されたことを確認します。
gcloud auth list

コマンド出力

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Cloud Shell で次のコマンドを実行して、gcloud コマンドがプロジェクトを認識していることを確認します。
gcloud config list project

コマンド出力

[core]
project = <PROJECT_ID>

上記のようになっていない場合は、次のコマンドで設定できます。

gcloud config set project <PROJECT_ID>

コマンド出力

Updated property [core/project].

3. API を有効にする

Cloud Shell から、Artifact Registry、Cloud Build、Cloud Run の各 API を有効にします。

gcloud services enable \
  artifactregistry.googleapis.com \
  cloudbuild.googleapis.com \
  run.googleapis.com

これにより、次のような成功メッセージが出力されます。

Operation "operations/..." finished successfully.

これで、アプリケーションを記述する準備が整いました。

4. アプリケーションを作成する

このステップでは、HTTP リクエストに応答する Flask ベースのシンプルな Python アプリケーションを構築します。

作業ディレクトリ

Cloud Shell を使用して helloworld-python という名前の作業ディレクトリを作成し、そのディレクトリに切り替えます。

mkdir ~/helloworld-python
cd ~/helloworld-python

main.py

main.py という名前のファイルを作成します。

touch main.py

お好みのコマンドライン エディタ(nano、vim、emacs)を使用するか、Cloud Shell エディタ ボタンをクリックして、ファイルを編集します。

10af7b1a6240e9f4.gif

Cloud Shell エディタでファイルを直接編集するには、次のコマンドを使用します。

cloudshell edit main.py

main.py

from flask import Flask, request

app = Flask(__name__)


@app.get("/")
def hello():
    """Return a friendly HTTP greeting."""
    who = request.args.get("who", default="World")
    return f"Hello {who}!\n"


if __name__ == "__main__":
    # Development only: run "python main.py" and open http://localhost:8080
    # When deploying to Cloud Run, a production-grade WSGI HTTP server,
    # such as Gunicorn, will serve the app.
    app.run(host="localhost", port=8080, debug=True)

このコードでは、HTTP GET リクエストに対してわかりやすいメッセージで応答する基本的なウェブサービスを作成します。

requirements.txt

requirements.txt という名前のファイルを追加して、依存関係を定義します。

touch requirements.txt

Cloud Shell エディタでファイルを直接編集するには、次のコマンドを使用します。

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/flask
Flask==3.0.2

# https://pypi.org/project/gunicorn
gunicorn==21.2.0

Procfile

最後に、Procfile という名前のファイルを追加して、アプリケーションの提供方法を指定します。

touch Procfile

Cloud Shell エディタでファイルを直接編集するには、次のコマンドを使用します。

cloudshell edit Procfile

Procfile

web: gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app

すべてのファイルが作業ディレクトリの下にあることを確認します。

ls

以下のファイルが一覧表示されます。

main.py  Procfile  requirements.txt

アプリケーションをデプロイする準備が整いましたが、まずテストを行いましょう。

5. アプリケーションをテストする

アプリケーションをテストするには、仮想環境を作成します。

virtualenv venv

仮想環境をアクティブにします。

source venv/bin/activate

依存関係をインストールします。

pip install -r requirements.txt

次のような確認メッセージが表示されます。

...
Successfully installed Flask ... gunicorn ...

アプリケーションを開始します。

python main.py

ログによると、開発モードになっていることがわかります。

 * Serving Flask app 'main'
 * Debug mode: on
   WARNING: This is a development server.
   Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Running on http://localhost:8080
   Press CTRL+C to quit
...

Cloud Shell ウィンドウで、Web Preview アイコンをクリックして Preview on port 8080 を選択します。

6c9ff9e5c692c58e.gif

ブラウザ ウィンドウが開き、「Hello World!」というメッセージが表示されます。

+ アイコンをクリックして、ローカルで実行されているアプリケーションにウェブ リクエストを送信することで、別の Cloud Shell セッション(新しいターミナルタブ)を開くこともできます。

curl localhost:8080

次のような回答が返されます。

Hello World!

完了したら、メインの Cloud Shell セッションに戻り、CTRL+C を指定して python main.py コマンドを停止します。

仮想環境を終了します。

deactivate

最後に、仮想環境ディレクトリを削除します。

rm -r venv/

アプリケーションが期待どおりに機能します。デプロイしてみましょう。

6. Cloud Run にデプロイする

Cloud Run はリージョナルです。つまり、Cloud Run サービスを実行するインフラストラクチャは特定のリージョンに配置され、そのリージョン内のすべてのゾーンで冗長的に利用できるように Google によって管理されます。デプロイに使用するリージョンを定義します。次に例を示します。

REGION="europe-west9"

作業ディレクトリにいることを確認します。

ls

以下のファイルが一覧表示されます。

main.py  Procfile  requirements.txt

アプリケーションを Cloud Run にデプロイします。

gcloud run deploy helloworld-python \
  --source . \
  --platform managed \
  --region $REGION \
  --allow-unauthenticated
  • デフォルトのリージョンは、gcloud config set run/region $REGION コマンドで定義できます。
  • また、gcloud config set run/platform managed コマンドを使用して、デフォルトで Cloud Run を管理することもできます。
  • --allow-unauthenticated オプションは、サービスを公開します。未認証のリクエストを回避するには、代わりに --no-allow-unauthenticated を使用します。

初回は、Artifact Registry リポジトリの作成を求めるプロンプトが表示されます。Enter をタップして以下を確認します。

Deploying from source requires an Artifact Registry Docker repository to store
built containers. A repository named [cloud-run-source-deploy] in region [REGION]
will be created.

Do you want to continue (Y/n)?

これにより、Artifact Registry リポジトリへのソースコードのアップロードと、コンテナ イメージのビルドが開始されます。

Building using Buildpacks and deploying container ...
* Building and deploying new service... Building Container.           
  OK Creating Container Repository...
  OK Uploading sources...
  * Building Container... Logs are available at ...

デプロイが完了するまで待ちます。成功すると、コマンドラインにサービス URL が表示されます。

...
OK Building and deploying new service... Done.
  OK Creating Container Repository...
  OK Uploading sources...
  OK Building Container... Logs are available at ...
  OK Creating Revision... Creating Service.
  OK Routing traffic...
  OK Setting IAM Policy...
Done.
Service [SERVICE]... has been deployed and is serving 100 percent of traffic.
Service URL: https://SERVICE-PROJECTHASH-REGIONID.a.run.app

サービス URL は、次のコマンドで取得できます。

SERVICE_URL=$( \
  gcloud run services describe helloworld-python \
  --platform managed \
  --region $REGION \
  --format "value(status.url)" \
)
echo $SERVICE_URL

次のような画面が表示されます。

https://helloworld-python-PROJECTHASH-REGIONID.a.run.app

ウェブブラウザでこのサービス URL を開くと、アプリケーションを使用できます。

c836b93e5601e2cf.gif

Cloud Shell からアプリケーションを呼び出すこともできます。

curl $SERVICE_URL?who=me

期待どおりの挨拶が表示されるはずです。

Hello me!

これで、これで、アプリケーションが Cloud Run にデプロイされました。Cloud Run は、受信したリクエストを処理するためにコンテナ イメージを自動的に水平方向にスケーリングします。リクエスト数が減少すると、スケールダウンします。料金は、リクエストの処理中に使用した CPU、メモリ、ネットワークに対してのみ発生します。

7. クリーンアップ

サービスが使用されていない場合、Cloud Run の料金は発生しませんが、コンテナ イメージを Artifact Registry に保存すると課金される場合があります。リポジトリまたは Cloud プロジェクトを削除して、料金が発生しないようにできます。Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。

コンテナ イメージ リポジトリを削除するには:

gcloud artifacts repositories delete cloud-run-source-deploy \
  --location $REGION

Cloud Run サービスを削除するには:

gcloud run services delete helloworld-python \
  --platform managed \
  --region $REGION

Google Cloud プロジェクトを削除するには、

  1. 現在のプロジェクト ID を取得します。
PROJECT_ID=$(gcloud config get-value core/project)
  1. 削除するプロジェクトであることを確認します。
echo $PROJECT_ID
  1. プロジェクトの削除:
gcloud projects delete $PROJECT_ID

8. 完了

96d07289bb51daa7.png

簡単なウェブ アプリケーションを作成し、Cloud Run にデプロイしました。

詳細

ライセンス

この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。