Python での Hello Cloud Run(Streamlit)

1. はじめに

96d07289bb51daa7.png

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

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

学習内容

  • Streamlit の「Hello World」アプリケーションを作成する方法。
  • デプロイ前に Streamlit アプリを実行してアプリケーションをテストする。
  • Cloud Buildpacks と、requirements.txtstreamlit が存在することで Dockerfile が不要になる仕組み。
  • Streamlit アプリケーションを Cloud Run にデプロイする方法。

2. 設定と要件

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

  1. Google Cloud コンソールにログインして、新しいプロジェクトを作成するか、既存のプロジェクトを再利用します。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 上で動作するコマンドライン環境)を使用します。

Cloud Shell をアクティブにする

  1. Cloud コンソールで、[Cloud Shell をアクティブにする] をクリックします。

3c1dabeca90e44e5.png

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

9c92662c6a846a5c.png

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

9f0e51b578fecce5.png

この仮想マシンには、必要な開発ツールがすべて用意されています。仮想マシンは Google Cloud で稼働し、永続的なホーム ディレクトリが 5 GB 用意されているため、ネットワークのパフォーマンスと認証が大幅に向上しています。この 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 リクエストに応答する「Hello World」Streamlit Python アプリケーションを構築します。

作業ディレクトリ

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

mkdir ~/helloworld-streamlit && cd ~/helloworld-streamlit

main.py

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

touch main.py

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

10af7b1a6240e9f4.gif

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

cloudshell edit main.py

main.py

import streamlit as st

st.title("Hello World! 👋🌎")
st.markdown(
    """
    This is a demo Streamlit app.

    Enter your name in the text box below and press a button to see some fun features in Streamlit.
    """
)

name = st.text_input("Enter your name:")

# Use columns to create buttons side by side
col1, col2 = st.columns(2)

with col1:
    if st.button("Send balloons! 🎈"):
        st.balloons()
        st.write(f"Time to celebrate {name}! 🥳")
        st.write("You deployed a Streamlit app! 👏")

with col2:
    if st.button("Send snow! ❄️"):
        st.snow()
        st.write(f"Let it snow {name}! 🌨️")
        st.write("You deployed a Streamlit app! 👏")

このコードは、HTTP GET リクエストにフレンドリーなメッセージで応答する基本的なウェブサービスを作成します。

requirements.txt

ターミナルを再度開き、依存関係を定義する requirements.txt という名前のファイルを追加します。

touch requirements.txt

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

cloudshell edit requirements.txt

requirements.txt

# https://pypi.org/project/streamlit
streamlit==1.47.0

Streamlit アプリケーションはデプロイの準備が整っていますが、まずテストしてみましょう。

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

アプリケーションをテストするには、Cloud Shell にプリインストールされている uv(Python の非常に高速なパッケージとプロジェクト マネージャー)を使用します。

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

uv venv

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

uv pip install -r requirements.txt

streamlit run を使用してアプリケーションを起動します(Cloud Shell と競合するため、テスト用に --server.enableCORS を無効にします)。

uv run streamlit run main.py --server.port=8080 --server.enableCORS=false

ログには、Streamlit アプリが実行されていることが示されます。

You can now view your Streamlit app in your browser.

  Local URL: http://localhost:8080
  Network URL: http://10.1.0.1:8080
  External URL: http://34.37.7.94:8080

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

6c9ff9e5c692c58e.gif

ブラウザ ウィンドウが開いて Hello World! 👋🌎 というタイトルが表示されるはずです。

helloworld-streamlit-app.png

名前を入力して、画面上の 2 つのボタンを試してみてください。

完了したら、メインの Cloud Shell セッションに戻り、CTRL+C を使用して Streamlit アプリを停止します。

アプリケーションが想定どおりに動作しました。デプロイしましょう。

6. Cloud Run にデプロイする

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

REGION=europe-west1

作業ディレクトリに移動します。

ls

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

main.py  requirements.txt

デプロイする前に、.venv/ を含む .gcloudignore ファイルを作成します。これにより、ローカルテスト中に uv から作成された仮想環境が Cloud Run デプロイに含まれなくなります。

次のコマンドを使用して .gcloudignore を作成します。

echo ".venv/" > .gcloudignore

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

gcloud run deploy helloworld-streamlit \
  --source . \
  --region $REGION \
  --allow-unauthenticated
  • --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-streamlit \
  --region $REGION \
  --format "value(status.address.url)" \
)
echo $SERVICE_URL

次のような出力が表示されます。

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

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

helloworld-streamlit.gif

これで、Cloud Run にアプリケーションがデプロイされました。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-streamlit \
  --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

「Hello World」Streamlit ウェブ アプリケーションを作成して Cloud Run にデプロイしました。

学習した内容

  • Streamlit の「Hello World」アプリケーションを作成する方法。
  • デプロイ前に Streamlit アプリを実行してアプリケーションをテストする。
  • Cloud Buildpacks と、requirements.txtstreamlit が存在することで Dockerfile が不要になる仕組み。
  • Streamlit アプリケーションを Cloud Run にデプロイする。

詳細