1. はじめに
Cloud Run は、マネージド型のコンピューティング プラットフォームで、HTTP リクエスト経由で呼び出し可能なステートレス コンテナを実行できます。Knative オープンソース プロジェクトを基に構築されているため、プラットフォーム間でワークロードを移植できます。Cloud Run はサーバーレスです。インフラストラクチャ管理が一切不要なため、最も重要な作業であるアプリケーションの構築に集中できます。
このチュートリアルの目標は、シンプルなウェブ アプリケーションを作成して Cloud Run にデプロイすることです。
2. 設定と要件
セルフペース型の環境設定
- Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。
- プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
- プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は
PROJECT_ID
と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。 - なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
- 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。
Cloud Shell の起動
Google Cloud はノートパソコンからリモートで操作できますが、このチュートリアルでは、クラウド上で動作するコマンドライン環境である Cloud Shell を使用します。
Cloud Shell をアクティブにする
- Cloud Console で、[Cloud Shell をアクティブにする] をクリックします。
Cloud Shell を初めて起動する場合は、内容を説明する中間画面が表示されます。中間画面が表示されたら、[続行] をクリックします。
Cloud Shell のプロビジョニングと接続に少し時間がかかる程度です。
この仮想マシンには、必要なすべての開発ツールが読み込まれます。5 GB の永続的なホーム ディレクトリが用意されており、Google Cloud で稼働するため、ネットワークのパフォーマンスと認証が大幅に向上しています。この Codelab での作業のほとんどはブラウザを使って行うことができます。
Cloud Shell に接続すると、認証が完了し、プロジェクトに各自のプロジェクト ID が設定されていることがわかります。
- 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`
- 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 エディタ ボタンをクリックして、ファイルを編集します。
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
を選択します。
ブラウザ ウィンドウが開き、「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 を開くと、アプリケーションを使用できます。
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 プロジェクトを削除するには、
- 現在のプロジェクト ID を取得します。
PROJECT_ID=$(gcloud config get-value core/project)
- 削除するプロジェクトであることを確認します。
echo $PROJECT_ID
- プロジェクトの削除:
gcloud projects delete $PROJECT_ID
8. 完了
簡単なウェブ アプリケーションを作成し、Cloud Run にデプロイしました。
詳細
- Cloud Run のドキュメントを確認する
- Cloud Run で 3 つの簡単なステップで開発から本番環境へを完了し、その他のオプションを確認する
- Cloud Run での Django を完了して、Cloud SQL DB の作成、Secret Manager による認証情報の管理、Django のデプロイを行う
- その他の Cloud Run Codelab をご確認ください。
ライセンス
この作業はクリエイティブ・コモンズの表示 2.0 汎用ライセンスにより使用許諾されています。