📚

Cloud Run+Streamlitでアプリ公開

2024/03/01に公開

こんにちは!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です。
ドキュメントはこちら
https://cloud.google.com/sdk/docs/install-sdk?hl=ja

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