Cloud Runのチュートリアルを試してみた

Cloud Runの公式リファレンスにあるチュートリアルを試してみました。ソースコードや動作の解説も少し付け加えています。
2024.05.16

データアナリティクス事業本部の根本です。現在Cloud Runを深掘りしていて、その過程でチュートリアルも試してみました。これからCloud Runを動かしたい、という方は読んでみてください。

この記事の対象者

  • Cloud Runを動かしてみたいと思っているひと

前提条件

  • gcloudコマンドが使用できること。Cloud Run,Cloud Build,Artifact RegistryのAPIが使用できること(※)

※筆者は編集者権限のユーザにて実行しています。

今回実施するチュートリアル

Google Cloudの公式リファレンスにある下記チュートリアル(python版)を実施しました。

やってみる

準備

まずはローカルPCで作業ディレクトリを作成して移動します。

mkdir helloworld
cd helloworld

チュートリアルのコードをコピーして、main.pyのファイルを作成して貼り付けます。

main.py

import os

from flask import Flask

app = Flask(__name__)

@app.route("/")
def hello_world():
    """Example Hello World route."""
    name = os.environ.get("NAME", "World")
    return f"Hello {name}!"

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

コードの内容を解説します。

@app.route("/")
def hello_world():
    name = os.environ.get("NAME", "World")
    return f"Hello {name}!"

この部分では、ルート"/"にアクセスすると、環境変数"NAME"の値に基づいて「Hello [NAME]!」というメッセージを返します。
環境変数NAMEが設定されていない場合はWorldが返されるので、「Hello World!」が呼び出し元に返却されます。

if __name__ == "__main__":
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

スクリプトが直接実行された場合の動作です。
直接実行の場合デバッグモードを有効にし、ホスト"0.0.0.0"およびポート8080で実行されます。今回は使用しません。
続いて、requirements.txtのファイルを作成して、以下のコードを貼り付けます。

requirements.txt

Flask==3.0.0
gunicorn==20.1.0
Werkzeug==3.0.1

デプロイ

デプロイは以下のコマンドで行います。

gcloud run deploy

デプロイコマンドを実行すると以下のように聞かれるのでそれぞれキーを入力して回答します。

Source code location (/Users/xxx/Documents/yyy/helloworld)

ソースコードの場所です。ソースコードが保存されている場所がカレントディレクトリなのであればそのままEnterを押下します。

Service name (helloworld):

Cloud Runのサービス名です。()内の名前helloworldから変更する場合は名前を入力します。そのままでよければEnterを押下します。

Please specify a region:
 [1] africa-south1
 [2] asia-east1
 [3] asia-east2
 [4] asia-northeast1
 [5] asia-northeast2
 [6] asia-northeast3
・・・省略

リージョンの選択になります。asia-northeast1の場合であれば4を入力してEnterを押下します。

Allow unauthenticated invocations to [helloworld] (y/N)?

認証しないで呼び出せるようにするかどうかの選択です。yを押下するとURLを叩くと誰でも呼び出すことが可能となりますので注意が必要です。今回はNの認証ありで作成しました。
数分待つとデプロイが完了して、以下のようなメッセージが出力されます(抜粋です)

Done.                                                                                                                                                                                                                           
Service [helloworld] revision [helloworld-00001-xqm] has been deployed and is serving 100 percent of traffic.
Service URL: 作成されたURL

Service URLが今回作成したコンテナを呼び出すURLとなります。
以下のcurlコマンドで呼び出しをします。

curl https://作成されたURL \                                              
-H "Authorization: bearer $(gcloud auth print-identity-token)"

認証ありで作成したのでBearer認証にて認証をしています。
gcloud auth print-identity-tokenコマンドでヘッダーに認証トークンをセットしています。
上記コマンドを発行して

Hello World!

と出力されればチュートリアルは成功です。

補足

今回のチュートリアルはローカルでソースコードを作成し、それを元にデプロイしましたがこの場合のデプロイは以下の流れになります。

  1. ローカルのソースコードをコンテナイメージ化
  2. コンテナイメージをArtifact Registryリポジトリにpush
  3. Artifact RegistryリポジトリからCloud Runコンテナイメージをデプロイ

よって、デプロイコマンド実行後はCloud RunとArtifact Registryにリソースが作成されています。実際に画面で確認してみます。
以下はArtifact Registryリポジトリです。
デプロイしたhelloworldコンテナを確認することができました。
以下はCloud Runの画面です。
指定したサービス名helloworldで作成されていました。
リソースを削除する際に、Cloud Runのサービスを削除してもArtifact Registryに作成されたイメージは削除されないので使用しない場合はこちらも削除をお忘れなく。

おわりに

今回はチュートリアルを試してみただけですが、簡単な手順でコンテナがデプロイできてサービス化できるのは本当にすごいと思います。Cloud Buildからのデプロイなどもこれから試してみたいと思います。
この記事がどなたかのお役に立てば幸いです。それではまた。

参考

Cloud Runへのデプロイ
Artifact Registryの概要