Python での Hello Cloud Run(Streamlit)

1. はじめに

96d07289bb51daa7.png

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

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

学習内容

  • Streamlit の「Hello World」アプリケーションを作成する方法。
  • デプロイ前に Streamlit アプリを実行してアプリケーションをテストする方法。
  • Cloud Buildpacks と、requirements.txtstreamlit が存在することで Dockerfile が不要になる仕組み。
  • Streamlit アプリケーションを 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 上で動作するコマンドライン環境)を使用します。

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-west4

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

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 プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。

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

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 にデプロイする方法。

詳細

  • Cloud Run のドキュメントを確認する
  • Cloud Run で 3 つの簡単なステップで開発から本番環境に移行するを完了して、その他のオプションを確認する
  • Cloud Run で Django を完了して、Cloud SQL DB を作成し、Secret Manager で認証情報を管理して、Django をデプロイする
  • その他の Cloud Run Codelab を確認する...