Cloud Run+Streamlitでアプリ公開
こんにちは!kirigayaです。
今回はStreamlitでアプリを作りCloud Runを使って世界に公開したいと思います。
なぜCloud Run?
似たようなサービスにCloud Function
があります。
今回は長時間実行、複数リクエストの処理をさせたいのでCloud Runを使います。
違いはこんな感じ
特性 | Cloud Function | Cloud Run |
---|---|---|
実行環境 | イベント駆動型の関数 | コンテナー化されたアプリケーション |
サポートされるランタイム | Node.js, Python, Go, Java, Ruby | 任意の言語やフレームワーク |
スケーリング | 自動スケーリング | 自動スケーリング(柔軟な制御可能) |
コスト | 実行時間に応じて課金 | 実行時間とリソース使用量に応じて課金 |
Cloud Runの制限事項(※CPUとメモリの大きさやリージョンによって異なる)
項目 | 制限 |
---|---|
同時実行 | インスタンスごとに最大 1,000 件の同時リクエスト |
メモリ | インスタンスごとに最大 32 GB |
ファイル システム | インスタンスごとに最大 32 GB |
CPU | インスタンスごとに最大 8 vCPU |
インスタンスの数 | リージョンごとに最大 100 |
それではさっそく環境を整えていきましょう!
※GCPに登録してプロジェクトは作成済みの状態で進んでください
※開発はローカルで行います。
PCはMacです。
ドキュメントはこちら
brewを使ってgoogle-cloud-sdkをインストール
brew install --cask google-cloud-sdk
※ターミナルを再起動してgcloud
コマンドが使えない場合は.zshrc
に追記する
cd ~/
vim .zshrc
source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/path.zsh.inc'
source '/usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/completion.zsh.inc'
ファイルを再読み込み
source ~/.zshrc
※pythonのバージョンとgoogle-cloud-sdkとのバージョンが合わなくてimp
がないとエラーが出る場合があります。google-cloud-sdkやpythonのバージョンを調節してください。
現在使っているバージョンは
python 3.12.0
google-cloud-sdk 466.0.0
認証情報とプロジェクトを設定する
gcloudの初期設定を行います
gcloud init
ログインやプロジェクトのどれを使いますか?とか聞かれます。
You must log in to continue. Would you like to log in (Y/n)? Y
スクリーン リーダーの利便性を向上させるためのコマンド
gcloud config set accessibility/screen_reader true
アカウント一覧を確認できます
gcloud auth list
問題なければ次へ進みます
Cloud Runにデプロイ
streamlitで作ったappをCloud Runにデプロイしていきます。
まずはapp.pyと同じところにDockerfileを作りましょう。
# 使用するイメージ
FROM python:3.12-slim
# python環境変数の設定
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# コンテナ内の作業ディレクトリを設定する
WORKDIR /app
# 要件ファイルのみをコンテナにコピーする
COPY poetry.lock pyproject.toml /app/
# poetryとプロジェクトの依存関係をインストールする
RUN pip install --no-cache-dir poetry && \
poetry config virtualenvs.create false && \
poetry install --no-dev --no-interaction --no-ansi
# 残りのアプリケーションコードをコンテナにコピーする
COPY . /app
# アプリが動作するポートを公開する
EXPOSE 8080
# コンテナ起動時にapp.pyを実行する
CMD ["streamlit", "run", "--server.port", "8080", "app.py"]
ファイルの配置はこんな感じです
st_app/
│
├── app.py
├── Dockerfile
├── poetry.lock
└── pyproject.toml
streamlitを使ってapp.pyの中身は好きに書いてください。
何を書けばいいんだ...という人はこちら↓
import streamlit as st
import pandas as pd
import plotly.express as px
def main():
st.title('CSVファイルの基本統計量とヒストグラムを表示するアプリ')
# CSVファイルをアップロード
uploaded_file = st.file_uploader("CSVファイルをアップロードしてください", type=['csv'])
if uploaded_file is not None:
# CSVファイルをDataFrameに読み込む
df = pd.read_csv(uploaded_file)
# カラムを選択するプルダウンメニュー
selected_column = st.selectbox('カラムを選択してください', options=df.columns)
# 選択したカラムの基本統計量をサイドバーに表示
st.sidebar.write(f"### {selected_column} の基本統計量")
st.sidebar.write(df[selected_column].describe())
# ヒストグラムを作成して表示
st.write(f"### {selected_column} のヒストグラム")
fig = px.histogram(df, x=selected_column, marginal="rug")
st.plotly_chart(fig)
if __name__ == '__main__':
main()
準備が整ったらさっそくデプロイ!(待つだけ)
gcloud run deploy st-app --region "asia-northeast1" --source .
実行が完了するとURLが表示されるのでアクセスしましょう!
使い終わったら後片付けしておきましょう
サービスとリビジョンの一覧を取得([4] asia-northeast1)
gcloud run services list
gcloud run revisions list --platform=managed --service=st-app
サービスを削除
gcloud run services delete st-app
全てのサービスとリビジョンを削除
gcloud run revisions delete --platform=managed --service=st-app --all
コンソールからだと...
Artifact registryも削除する場合
gcloud artifacts repositories list
gcloud artifacts repositories delete cloud-run-source-deploy --location=asia-northeast1
お疲れ様でした。
次回は認証やDBなどを追加してアプリを拡張する予定...
Discussion