GEMINI LABEN
NANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定ですNANOLITE — Nano Banana 2 Liteが登場しました。Googleで最も速く、最もコスト効率の高いGemini Imageモデルで、軽量な画像生成を安く回したい用途に向いていますOMNIFLASH — Gemini Omni Flashがpublic previewになりました。ネイティブにマルチモーダルなモデルで、企業や開発者が独自の動的な動画ワークフローを構築できますAGENTS — Managed Agentsが拡張されました。background: trueでサーバー側の非同期実行とポーリング、リモートMCPサーバー連携、対話をまたぐ認証情報のリフレッシュに対応しますMEMORY — Memory BankのIngestEvents APIが一般提供になりました。イベントの取り込みとメモリ生成を分離し、コンテンツを継続的にストリームできますTHROUGHPUT — Provisioned Throughputで、同一モデル・同一リージョンに対して最大7件の保留オーダーを提出できるようになりましたDEPRECATE — 画像生成モデルは8月17日に、Gemini Enterprise Agent PlatformのGrok 4.1系は8月20日に停止される予定です
記事一覧/開発ツール
開発ツール/2026-05-24上級

Streamlit と Gemini で社内 BI を本番運用する — 認証・コスト最適化・キャッシュ・可観測性の設計メモ

Streamlit + Gemini API のデータ分析アプリをマルチユーザー認証つきの社内 BI として本番運用するための設計メモ。認証層・コスト最適化・結果キャッシュ・レート制限・可観測性まで実装ベースで整理しました。

Streamlit2Gemini API191データ分析5BI認証3本番運用47

プレミアム記事

個人開発を 2014 年から続けてきて、累計 5,000 万 DL のアプリ事業を一人で回しているうちに、社内向け(といっても私一人のチームですが)の BI ダッシュボードを Streamlit と Gemini で組む機会が増えました。Lacrima と Mystery という二つのブログを毎日自動投稿で回し、6 つの壁紙アプリの AdMob 収益と App Store / Google Play のレビューを毎週眺める——これを「素の Streamlit」で組んだ最初の版は、3 週間で限界が来ました。

何が壊れたかというと、ログインがないので URL を知っている人は誰でも見えてしまうこと、Gemini の請求が読みもしないクエリで月 ¥4,000 を超えてきたこと、同じ CSV を二度投げると二度フルで API が走ること、エラーが出ても気づかないこと、の 4 点です。個人実験用に書いた Streamlit と、毎日見るための BI として運用する Streamlit は、コードの 6〜7 割を書き直すくらい設計が違います。この記事はその「書き直した側」の設計メモを、私が実際に組んだ構成ベースで残しておくものです。

なぜ「個人実験用」と「社内 BI」では設計が完全に変わるのか

最初に違いを地図にしておきます。Streamlit + Gemini の入門記事はネット上に大量にありますが、その先で必要になる 5 つのレイヤがほとんど書かれていないので、ここをまず明示しておきます。

  1. 認証層 — 誰がアクセスできるか。素の Streamlit はゼロ。
  2. コスト層 — Gemini への課金がユーザー操作に対して線形に増えるのを断ち切る仕組み。
  3. キャッシュ層 — 同じ問いに二度フル課金されない構造。
  4. レート制限層 — Gemini のクォータと、ユーザー単位のスロットルを別レイヤで持つ。
  5. 可観測性層 — 誰が何を聞いて何トークン消費したかを後で追える状態。

個人実験は 1〜5 が全部「なし」でも動きます。BI として毎日同僚や自分の別端末から触る瞬間に、1〜5 の全部が「ない方が異常」になります。順番に組み上げていきます。

認証層: streamlit-authenticator と Auth0 と Cloudflare Access の使い分け

私が個人開発で組む BI は、せいぜい 1〜5 名のチーム規模です。この帯では、選択肢は実質 3 つに絞れます。

streamlit-authenticator(社内 5 名以下・即日運用)

streamlit-authenticator は Python パッケージで、YAML にユーザーとハッシュ済みパスワードを書いて読み込ませるだけで認証画面が出ます。私が個人開発 BI で最初に採用したのはこれです。理由はシンプルで、追加インフラが不要だから。Streamlit Community Cloud にデプロイするなら、Secrets に YAML を貼って終わりです。

# auth.py
import streamlit_authenticator as stauth
import yaml
from yaml.loader import SafeLoader
import streamlit as st
 
def get_authenticator():
    config = yaml.load(st.secrets["AUTH_CONFIG"], Loader=SafeLoader)
    return stauth.Authenticate(
        config["credentials"],
        config["cookie"]["name"],
        config["cookie"]["key"],
        config["cookie"]["expiry_days"],
    )
 
def login_gate():
    auth = get_authenticator()
    auth.login(location="main")
    if st.session_state.get("authentication_status") is not True:
        st.warning("ログインが必要です")
        st.stop()
    return st.session_state["username"]

落とし穴は 3 つあります。1 つ目は、expiry_days を 30 にすると Cookie ベースで「実質ログイン状態」が長く保持されるので、デバイス紛失時の取り消し手段がないこと。私は 7 日に縮め、加えて週次でパスワードハッシュを更新するスクリプトを cron で走らせています。2 つ目は、YAML が GitHub に漏れた瞬間に終わるので、必ず Streamlit Secrets か外部 KV から読み込む構成にすること。3 つ目は、streamlit-authenticator は MFA を提供しないため、機微データを扱う BI には不向きという点です。

Auth0(社内 10〜30 名・MFA 必要)

人数が 10 を超え、退職などで権限剥奪を確実にやりたい段階になったら Auth0 に上げます。Auth0 は無料枠が 25,000 MAU まであるので、社内 BI の規模なら課金ゼロで運用できます。Streamlit との接続は OIDC で、Authlib を入れて 30 行ほどで実装できます。

# auth_oidc.py
from authlib.integrations.requests_client import OAuth2Session
import streamlit as st
 
AUTH0_DOMAIN = st.secrets["AUTH0_DOMAIN"]
CLIENT_ID = st.secrets["AUTH0_CLIENT_ID"]
CLIENT_SECRET = st.secrets["AUTH0_CLIENT_SECRET"]
REDIRECT_URI = st.secrets["AUTH0_REDIRECT_URI"]
 
def login_gate():
    if "user" in st.session_state:
        return st.session_state["user"]
 
    code = st.query_params.get("code")
    if code is None:
        sess = OAuth2Session(CLIENT_ID, CLIENT_SECRET, redirect_uri=REDIRECT_URI)
        url, _ = sess.create_authorization_url(
            f"https://{AUTH0_DOMAIN}/authorize", scope="openid profile email"
        )
        st.markdown(f"[ログイン]({url})")
        st.stop()
 
    sess = OAuth2Session(CLIENT_ID, CLIENT_SECRET, redirect_uri=REDIRECT_URI)
    token = sess.fetch_token(
        f"https://{AUTH0_DOMAIN}/oauth/token", code=code
    )
    user = sess.get(f"https://{AUTH0_DOMAIN}/userinfo").json()
    st.session_state["user"] = user
    st.query_params.clear()
    return user

私が Auth0 を採用する場合、Rules でメールドメイン制限(@dolice.design のみ許可など)を必ず仕掛けます。これを忘れると Auth0 はオープンにサインアップを許してしまうので、本番運用前の必須チェック項目です。

Cloudflare Access(社内 BI で最も推奨する)

私の個人開発 BI で現在の本命はこれです。Cloudflare Access は、アプリ側に認証コードをほぼ書かない代わりに、Cloudflare のエッジで認証を完結させます。Streamlit を Cloud Run か自前の Cloudflare Tunnel 経由で公開し、Cloudflare Zero Trust の Application に登録すると、Cloudflare が Google ワンタイムパスや GitHub などの IdP で認証してから初めてオリジンにリクエストが届きます。

採用理由は 3 つです。第一に、認証ロジックを Streamlit 側に持たないので、Streamlit のアップデートで認証が壊れる事故が消えます。第二に、無料枠が 50 ユーザーまであり、個人開発の規模では完全無料です。第三に、Cf-Access-Authenticated-User-Email ヘッダがリクエストごとに付くので、ユーザー識別が確実かつ簡潔になります。

# auth_cf.py
import streamlit as st
 
def login_gate():
    # Cloudflare Access が認証済みユーザーをヘッダで渡す
    # Streamlit は HTTP ヘッダを直接読めないので、リバプロ経由で session に書く
    headers = st.context.headers if hasattr(st, "context") else {}
    email = headers.get("Cf-Access-Authenticated-User-Email")
    if not email:
        st.error("認証ヘッダが届いていません。Cloudflare Access 経由でアクセスしてください")
        st.stop()
    return email

私の場合、5 人以下の社内 BI なら streamlit-authenticator、それ以上または機微データなら Cloudflare Access を推奨します。Auth0 は「社外への共有が必須」かつ「Google/GitHub SSO 以外の IdP も使いたい」など、要件が増えた時の選択肢です。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
個人実験用 Streamlit と社内 BI で何が完全に変わるのか、5つの設計レイヤごとに具体実装を持ち帰れる
Gemini 2.5 Flash と 3.x Pro のトークン単価・キャッシュヒット率・スロットル設計を、実数値ベースで自分のアプリに移植できる
streamlit-authenticator・Auth0・Cloudflare Access の小規模/中規模での使い分けを、判断軸と落とし穴つきで決められる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Gemini Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-05-03
Gemini API × Streamlit で CSV 分析アプリをつくる — 自動洞察と可視化を備えた実用ダッシュボードの実装ガイド
Streamlit と Gemini API でCSVをアップロードするだけで自動洞察と可視化を生成するデータ分析アプリを構築する実装ガイド。スキーマ推定、structured output、レート制限対策まで本番想定で解説します。
開発ツール2026-07-09
例外にならない失敗を型で閉じる — Gemini API のレスポンスを判別可能ユニオンに正規化する
HTTP 200 なのに本文が空、という失敗は try/catch では捕まりません。finishReason と blockReason を判別可能ユニオンに正規化し、never による網羅性チェックで処理漏れをコンパイル時に潰す設計をまとめました。
開発ツール2026-04-22
Gemini API × Cloud Tasks で作る非同期AIジョブキュー — タイムアウトとリトライを設計から解く
Cloud Run のタイムアウトと Gemini API のレート制限に挟まれて落ちる同期実装から、Cloud Tasks を軸にした非同期ジョブキュー設計へ移行する実践ガイドです。リトライ・DLQ・進捗通知まで本番で通る形で解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →