Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Streamlit は社内ツールだけじゃない!PoC の速さで実現する'商用品質'の分析 Sa...

Avatar for 𝕂' 𝕂'
September 26, 2025

Streamlit は社内ツールだけじゃない!PoC の速さで実現する'商用品質'の分析 SaaS アーキテクチャ

PyCon JP 2025.9.27 (DAY2) 14:05 - 14:35

Avatar for 𝕂'

𝕂'

September 26, 2025
Tweet

Other Decks in Technology

Transcript

  1. 名前: 古川 祐希 GitHub: K-dash 所属: Recustomer 株式会社 略歴: •

    2012 ~ 2018 ◦ インフラエンジニア • 2018 ~ 2025 ◦ Web アプリケーション開発 ◦ サーバー/NW構築⾃動化 • 2025/04 〜 ◦ Recustomer の Platform チーム Python 歴: • 4 年ほど • Streamlit 歴は 1 年くらい ⾃⼰紹介
  2. • Streamlit を商⽤品質で提供するための Tips ◦ パフォーマンス ◦ 堅牢性&セキュリティ ◦ 品質保証

    ✅ お話すること • Streamlit の基本的な使い⽅ • Python 以外の技術要素の詳細 ◦ AWSなど ❌ お話しないこと 発表内容のスコープ
  3. • シンプル ◦ 直感的 API で数⼗⾏から始められる • インタラクティブ ◦ ウィジェット操作が画⾯にリアルタイム反映

    • Pythonで完結 ◦ Streamlit と Python の知識だけで作れる(HTML/CSS/JS は基本不要) • 共有しやすい ◦ 作ったものをすぐ⾒せて回せる(URL で共有しやすい) • エコシステム ◦ pandas, Plotly, NumPy など、既存の Python ライブラリ資産をそのまま活⽤できる ◦ 豊富なコミュニティライブラリ そもそも Streamlit とは? Streamlit を知らない⽅向けに 特徴
  4. AWS Cloud Recustomer のアーキテクチャ どんなアーキテクチャで実現するか? ToBe向け フロントエンド 認証基盤 バックエンドマイクロサービス 返品‧キャンセル

    配送追跡 注⽂管理 エンドユーザー Recustomer社員 社内分析基盤 顧客へ迅速に価値を届けるためには 外部向け 内部向け 案① 案② 社外部向け 分析プロダクト マルチテナント
  5. Pros • ✅ 拡張性が⾼く、複雑な要件にも対応可能 • ✅ UI/UX の⾃由度が⾮常に⾼い Cons •

    ❌ 開発⼯数増で価値提供までの LT が⻑い • ❌ front/back 双⽅の専⾨知識が必要 顧客へ迅速に価値を届けるためには 案① Next.js + FastAPI Pros • ✅ Python の知識だけで迅速に開発可能 • ✅ 社内向け Streamlit の実装を活かせる • ✅ 豊富な可視化ライブラリを容易に統合できる Cons • ❌ デザインやレイアウトの⾃由度が低い • ❌ 複雑な UI インタラクションや状態管理は苦⼿ 案② Streamlit アプローチ なぜ Streamlit? 顧客に価値を届けるまでのLTを最短にする
  6. • ①パフォーマンス • ② 堅牢性‧セキュリティ • ③ 品質保証 とはいえ、Streamlit の採⽤には⼤きな壁が…

    顧客へ迅速に価値を届けるためには ⽴ちはだかる「商⽤品質」の要件 Streamlit、本当に本番で使える?
  7. • ① パフォーマンス ◦ レスポンス速度とコスト効率 ▪ 商⽤機能として提供するからには特にパフォーマンスが求められる… どうやって乗り越えたか? 3 つの設計戦略

    顧客へ迅速に価値を届けるためには • 👉解決策 ◦ データアクセスパターンの最適化 ▪ Streamlit のキャッシュ機構を活⽤して I/O を削減し、UI レスポンスを向上させる。
  8. • ② 堅牢性‧セキュリティ ◦ 認証 ▪ Streamlit で既存の認証基盤と安全な認証を⾏いたい… ◦ 予期しないデータ漏えい

    ▪ Streamlit は例外が発⽣するとブラウザ画⾯に詳細な StackTrace を出してしまう… どうやって乗り越えたか? 3 つの設計戦略 顧客へ迅速に価値を届けるためには • 👉解決策 ◦ 横断的関⼼事の分離 ▪ 認証‧例外エラー処理を Python の Decorator に集約する。
  9. 社外向けアナリティクス 認証基盤 mypy∕pyright と Result 型を⽤いた型安全性の担保 例外ハンドラ(最外層のデコレータ) st.stop デコレータ(2層⽬) 認証

    デコレータ(3層⽬) 可視化層 データ処理層 キャッシュ層 Sesson State aws-wrangler 3 つの設計戦略を取り⼊れた全体アーキテクチャ 顧客へ迅速に価値を届けるためには 開発者 データインフラ Amazon Athena Amazon S3 エンドユーザー PR CI(Lint/Test) PR merge Deploy ※AWS の構成(データソースや取り込み部分等)は便宜上省略 Session Cookie 検証 データ取得
  10. 社外向けアナリティクス 認証基盤 mypy∕pyright と Result 型を⽤いた型安全性の担保 例外ハンドラ(最外層のデコレータ) st.stop デコレータ(2層⽬) 認証

    デコレータ(3層⽬) 可視化層 データ処理層 キャッシュ層 Sesson State aws-wrangler 以下の話をします データインフラ Amazon Athena Amazon S3 エンドユーザー Session Cookie 検証 データ取得
  11. • アーキテクチャの前提と⽅針 ◦ 可視化対象データを S3 に蓄積し、 Streamlit から Athena で参照

    • ねらい ◦ ⼩さく始めて 速く可視化、運⽤は 軽量にする データインフラ 体感速度UP と コストDOWNの両⽴ Amazon Athena ※S3のデータをSQLクエリで参照できるサービス Amazon S3 (NEW) 社外向け アナリティクス機能
  12. ユーザー/タブごとのキャッシュ • スコープ ◦ 1ユーザー1タブ単位(各タブは独⽴) • ⽤途 ◦ 同じ画⾯内での再クエリ ◦

    再描画で使い回す⼀時データ 体感速度UP と コストDOWNの両⽴ st.session_state()
 全ユーザー共通のキャッシュ • スコープ ◦ アプリ全体で共有(プロセス内) • ⽤途 ◦ 誰が⾒ても同⼀結果の低頻度更新データ @st.cache_data
 Streamlitの 2 ⼤キャッシュ機能(正確には 3 つある) ※他にも @st.cache_resource() がある
  13. • ①再クエリの条件を明⽂化 ◦ キャッシュキー ▪ ⼊⼒条件(⽇付等)+ テナント境界値(ユーザーID等)の組み合わせ ▪ 上記に変化があるときだけクエリ発⾏ ◦

    ②スコープで使い分け ▪ st.session_state()
 • 直前に取得した表データ、フィルタ適⽤後の中間結果等
 ▪ @st.cache_data
 • マスタ⼀データ等
 キャッシュ戦略 体感速度UP と コストDOWNの両⽴
  14. • st.session_state() を扱うキャッシュ⽤のクラスを作る ◦ キャッシュの⽤途ごとに getter/setter を⽤意するイメージ ▪ すべてのメソッドは引数でテナント境界値を受け取る ◦

    当該クラス以外で st.session_state() の利⽤を禁⽌ st.session_state() への唯⼀のアクセスポイントを作る 体感速度UP と コストDOWNの両⽴
  15. st.session_state() への唯⼀のアクセスポイントを作る 体感速度UP と コストDOWNの両⽴ • Ruff の banned-api でガバナンスを効かせる

    ◦ 前述のアクセスポイントクラス以外からは st.session() を利⽤できないようLinterレベルで保証 する pyproject.toml pyproject.toml アクセスポイント以外で st.session() を呼び出している状態で ruff check 実⾏ 違反が検出される
  16. • 👉キャッシュ戦略によるクエリ最⼩化 ◦ st.session_state と @st.cache_data の戦略的な使い分けが鍵 ▪ 初回は遅くても、2回⽬以降の操作が⾼速になる設計を意識する •

    👉マルチテナントでの安全なデータ分離(@st.cache_data) ◦ tenant_id 等のテナント境界値を含むキャッシュキーを⽤いてデータ漏洩を確実に防⽌する • 👉状態管理の⼀元化 ◦ st.session_state の集約クラスで散在を防ぎ、安全なキャッシュキー設計を強制する 『パフォーマンス』のまとめ
  17. 『パフォーマンス』で伝えたいこと • キャッシュ戦略によるクエリ最⼩化 ◦ st.session_state と @st.cache_data の戦略的な使い分けが鍵 ▪ 初回は遅くても、2回⽬以降の操作が⾼速になる設計を意識する

    • マルチテナントでの安全なデータ分離(@st.cache_data) ◦ user_id 等のテナント境界値を含むキャッシュキーを⽤いてデータ漏洩を確実に防⽌する • 状態管理の⼀元化 ◦ st.session_state の集約クラスで散在を防ぎ、安全なキャッシュキー設計を強制する 対話は⼀度に、 境界は明確に、 無法地帯をなくせ
  18. 社外向けアナリティクス 認証基盤 mypy∕pyright と Result 型を⽤いた型安全性の担保 例外ハンドラ(最外層のデコレータ) st.stop デコレータ(2層⽬) 認証

    デコレータ(3層⽬) 可視化層 データ処理層 キャッシュ層 Sesson State aws-wrangler 以下の話をします データインフラ Amazon Athena Amazon S3 エンドユーザー Session Cookie 検証 データ取得
  19. • 意味のあるメッセージを表⽰する場合、例外を捕捉して st.error(), st.stop() を使うのが定⽯ ◦ しかし、これをアプリケーションの⾄る所に記述するとビジネスロジックと UI 制御が癒着し、 コードの可読性‧保守性が著しく低下する

    課題 ②:コードの汚染と例外ハンドリング忘れ UI から情報漏えいさせない 例外ハンドリングを忘れる可能性もある st.error(), st.stop()が ⾄る所に散在し、⾒通しが悪い st.error(), st.stop()が ⾄る所に散在し、⾒通しが悪い
  20. • 失敗する可能性のある処理は、成功/失敗を持つ特別な結果オブジェクトを返すというルールを設ける ◦ 弊社では、Rust ライクな Result 型 と AnyError 型

    を⽤意して実現 (詳細は後述) • エラーの場合は st.error() や st.stop() を実⾏する ⾨番的なデコレータ を⽤意 ◦ デコレータは Result(T, E) を受取り、Eの場合は E に含まれるメッセージを st.error() にセットして return するイメージ 第 1 防衛線:想定内エラーをデコレータで処理 UI から情報漏えいさせない st.stop デコレータ(2層⽬) 例外ハンドラ(最外層のデコレータ)
  21. 第 2 防衛線:想定外エラーを"最後の砦"で捕捉 UI から情報漏えいさせない st.stop デコレータ(2層⽬) 例外ハンドラ(最外層のデコレータ) • しかし、万が⼀の考慮漏れや、予期せぬ例外は起こり得る…

    ◦ その場合に備え、ページ全体を try-except で囲む "最後の砦"デコレータ を最も外側に配置 予期せぬ例外が起きたときに必ず表⽰させたい メッセージをデコレータに定義しておく
  22. 社外向けアナリティクス 認証基盤 mypy∕pyright と Result 型を⽤いた型安全性の担保 例外ハンドラ(最外層のデコレータ) st.stop デコレータ(2層⽬) 認証

    デコレータ(3層⽬) 可視化層 データ処理層 キャッシュ層 Sesson State aws-wrangler 実は、もう⼀層あります データインフラ Amazon Athena Amazon S3 エンドユーザー Session Cookie 検証 データ取得
  23. • Streamlit 公式認証の特徴 • できること ◦ ✅ OIDCベースのログイン/ログアウトとユーザー識別("誰か"は分かる) • ⾜りないこと

    ◦ ❌ マルチテナントの認証フローは⾃前設計が必要 Streamlit標準認証では解決できない課題 認証 標準の認証機能だけでは要件を満たすことができないことが判明😢
  24. • 設計思想 ◦ UI層(st.session_state() 等)で認証の真偽はキャッシュしない ▪ リクエストごとに Cookieの SessionID を抽出

    → 認証基盤に照会 ▪ 失敗時は統⼀的なエラー表⽰とロギング 第 3 防衛線:認証デコレータ 認証 st.stop デコレータ(2層⽬) 例外ハンドラ(最外層のデコレータ) 認証 デコレータ(3層⽬) 認証デコレータ内で 都度Cookie(SessionID)の検証
  25. • 最後に、認証デコレータを main 関数に追加することで堅牢性を備えた 3 層構造が完成 完成形: 3 層積層デコレータ 認証

    st.stop デコレータ(2層⽬) 例外ハンドラ(最外層のデコレータ) 認証 デコレータ(3層⽬)
  26. 3 層デコレータで実現できたこと • 👉セキュリティ向上 ◦ データ漏洩防⽌: 例外発⽣時に安全で意味のあるメッセージを表⽰する ◦ ログイン失効の即時反映: 認証結果はキャッシュせずに都度検証による安全性

    • 👉保守性向上 ◦ 本質ロジックに集中: 認証や例外ハンドリングから開放されるので認知負荷の軽減 ◦ 保守性向上: st.error() や st.stop() がコードのあちこちに散らばらない ◦ 付与漏れ防⽌: 最初にデコレータを main 関数に付けるだけ 『堅牢性&セキュリティ』のまとめ
  27. 3 層デコレータで実現できたこと • 👉セキュリティ向上 ◦ データ漏洩防⽌: 例外発⽣時に安全で意味のあるメッセージを表⽰する ◦ ログイン失効の即時反映: 認証結果はキャッシュせずに都度検証による安全性

    • 👉保守性向上 ◦ 本質ロジックに集中: 認証や例外ハンドリングから開放されるので認知負荷の軽減 ◦ 付与漏れ防⽌: 最初にデコレータを main 関数に付けるだけ 『堅牢性&セキュリティ』で伝えたいこと 横断的関⼼事は、外層で吸収せよ デコレータ
  28. 1. 静的品質保証 ◦ 型チェックの徹底 = 型安全ファースト 2. UIテスト⾃動化 ◦ Streamlit

    Testing API ⾼速‧⾼品質を⽀える重要な柱 ⾼速な開発サイクルを⽀える仕組み
  29. 社外向けアナリティクス 認証基盤 mypy∕pyright と Result 型を⽤いた型安全性の担保 例外ハンドラ(最外層のデコレータ) st.stop デコレータ(2層⽬) 認証

    デコレータ(3層⽬) 可視化層 データ処理層 キャッシュ層 Sesson State aws-wrangler 以下の話をします データインフラ Amazon Athena Amazon S3 エンドユーザー データ取得 Session Cookie 検証
  30. • Streamlit アプリをブラウザレスで実⾏し、ウィジェット操作と画⾯結果をコードから検証する • AppTest がアプリを疑似実⾏し、要素取得‧操作(クリック∕⼊⼒)‧再実⾏を提供 
 
 
 Streamlit

    Testing API 柱② UIテスト⾃動化 Streamlitには、公式の Testing API (streamlit.testing.v1)が⽤意されています! テスト対象の Streamlit アプリコード テストコード
  31. Playwright (ヘッドレスブラウザ) Streamlit Testing API (ブラウザレス) Testing API は⾼速だけど万能ではないという話 柱②

    UIテスト⾃動化 • 本物のブラウザを裏側で動かす • ⾒た⽬(CSS/JS)までテストできる ◦ その分、動作は相対的に重い • ブラウザを⼀切動かさない • UIロジック中⼼をテストする ◦ 超軽量で⾼速
  32. まとめ デコレータによる関⼼の分離 • 積層防御アーキテクチャ 🛡 堅牢性 & セキュリティ 戦略的キャッシュによる I/O

    最⼩化 • 安全な状態管理 🚀 パフォーマンス 静的解析と UI テスト • 型安全ファースト • Streamlit Testing API ⚙ 品質保証 🎉 成果 • 開発着⼿から 2 週間でリリース(2025年5⽉〜) • リリースから現在までインシデントゼロで安定稼働中 • 品質を保ちつつ、Streamlitの俊敏性で絶賛機能拡張中