複数プロジェクトに散乱するAPIキーの管理問題を、LiteLLM自己ホスティングで構造ごと解決。仮想キー集約・ハード予算上限・OpenAI互換エンドポイントの3本柱で変わったこと。
.env ファイルにAPIキーを書く。プロジェクトが増えるたびに、それをコピーする。気づけば5つのディレクトリに同じキーが散乱していて、ローテーションのたびに「どのファイルを直したっけ」が始まる。
関連記事としては
Blogその pip install、信用していい?未監査の LLM 圧縮ツールをゼロトラスト隔離で実測したトークン50〜90%削減を謳う未監査の OSS(Headroom)を、本番に晒さずゼロトラスト隔離で実測しました。静的監査・多層ハードニング・使い捨てキーの型と、削減0%だった理由、効果が別レイヤー(RTK)にあったどんでん返しまで一次情報で記録します。→ もあわせて読むと、今回の論点とのつながりを把握しやすくなります。
正直に言います。これは意志の問題ではありません。構造を変えなければ解決しない。
一人開発を続けていると、プロジェクトは増えます。
私の場合、並行して動かしている4つの個人プロジェクト——それぞれのディレクトリに、同じAPIキーが書いてある .env ファイルが存在していました。「全部コピーすれば済む」は最初だけ。キーをローテーションしたとき、どのプロジェクトのどのファイルを直したかを追うのがひと仕事になります。
そして「どこかのプロジェクトに古いキーが残ったままgitに乗っていないか?」という不安が消えない。技術の問題ではなく、心理の問題です。
OpenAI互換のプロキシサーバーです(GitHub / 公式ドキュメント)。自分のNASやサーバーに立てると、全プロバイダー(OpenAI・Anthropic・Gemini・Azure)への呼び出しを一本に集約できます。
本物のAPIキーはサーバーの1箇所にしか置かない。各プロジェクトには「仮想キー」——月$10上限の使い捨てトークン——だけを渡す。漏れたら仮想キーを無効化するだけで、本物のキーは安全なまま。
シンプルですが、この発想の転換は大きかった。
LiteLLM v1.82.3 の Swagger UI。/models や /chat/completions 等のエンドポイントがOpenAI互換形式で並んでいる
| 導入前 | 導入後(LiteLLM経由) | |
|---|---|---|
| キーの保管場所 | 各プロジェクトの .env(複数) | サーバー1箇所のみ |
| 漏洩時の対応 | 本物のキーをローテーション | 仮想キーを無効化するだけ |
| ローテーション作業 | 全プロジェクトの .env を順番に更新 | サーバー側を1回更新するだけ |
| 予算超過の防止 | プロバイダーの通知設定に依存 | ゲートウェイで強制遮断 |
| モデル切り替え | コードを修正して再デプロイ | config.yaml だけ変更 |
LiteLLMには仮想キーの発行機能があります。本物のAnthropicキーやOpenAIキーはQNAPの .env の中にだけ存在して、各プロジェクトの .env には以下の2行だけが書いてある状態です。
LITELLM_VIRTUAL_KEY=sk-virtual-xxxx
LITELLM_BASE_URL=http://192.168.11.101:4000
.env がGitHubに上がっても(実際には上げませんが)、仮想キーを無効化すれば終わります。本物のキーをローテーションする必要がない。
この「被害の局所化」が、一番価値のある部分です。以前のように「全プロジェクトの .env を順番に直す」作業は消えました。
クラウドAIの怖いところは、使いすぎたとき「お知らせ」だけで止まらないこと。
Azureには請求アラートがあります。OpenAIにもソフトリミットがある。でも「API呼び出しを物理的に強制停止する」機能は、どのプロバイダーも弱い。設定できても「スロットリング(速度制限)」どまりで、呼び出し自体は続いてしまいます。「通知が来てから対応する」では、気づいたときには数万円動いていたりします。
LiteLLMを挟むと、プロバイダー側に上限設定がなくても、ゲートウェイ側でハードに遮断できます。仮想キーに月額上限を設定するだけで、超えた瞬間に認証エラーが返り、どのプロジェクトからの呼び出しも通らなくなります。私は $10/月 に設定しています。
スクリプトのバグで無限ループに入ったとき、この上限が実際に火消しになりました。「通知を見てから止める」と「そもそも止まっている」は、深夜に気づく価値が全然違います。
LiteLLMを経由すると、どのAIプロバイダーも同じエンドポイント・同じ形式で呼べます。コードの中で openai.Client() を初期化しておけば、裏でGeminiが動いていようとClaudeが動いていようと関係ない。
実際に手元の複数プロジェクトはすべて OPENAI_BASE_URL を LiteLLM ゲートウェイに向けています。モデルを切り替えるときも、コードではなく config.yaml だけを変えればいい。
「どのプロジェクトがどのモデルを使っているか」の把握が一箇所でできるようになりました。Swagger UIを開けば、トークン消費もモデルごとにリアルタイムで見えます。
LiteLLM の Model Management 画面。azure-gpt・gemini-2.0-flash・claude-sonnet-4-6・gpt-5.4-mini など複数プロバイダーのモデルを一画面で管理できる
便利なツールですが、正直に言っておきます。
個人開発の範囲では問題になりません。ただ「すべてをLiteLLM経由にする」という構成は、LiteLLMへの依存度が高まることを意味します。何かに依存するという選択は、常に意識的にするべきです。
セキュリティの文脈では、自宅ラボでのAPI管理以外にも気になることがあれば、
BlogWazuhとClaude Codeを繋いだら、CVE調査と修正提案が自動化できた【自宅ラボ セキュリティ実録 #3】Wazuh REST APIでCVEリストを取得し、Claude Codeに渡したら調査と修正コマンド生成が自動化できた。93件のCriticalを手動で追っていた状態からの脱出実録。→も参考になります。
Q: LiteLLMは無料で使えますか?
本体はオープンソース(MITライセンス)で無料です。ただしAIプロバイダーのAPI料金は別途かかります。仮想キーの上限で管理するため、意図せず使いすぎることは防げます。
Q: 自宅LAN外からは使えませんか?
デフォルトはLAN内のみです。Cloudflare TunnelやWireGuard VPNで外部公開することは可能ですが、セキュリティ設計が別途必要になります。
Q: 仮想キーが漏洩した場合はどうなりますか?
LiteLLMの管理画面(Swagger UI)から該当キーを無効化するだけです。本物のAPIキーには影響しません。これが「被害の局所化」の核心です。
.env が散乱する問題は、「もっとちゃんとやろう」という意志では解けません。構造を変えるしかない。
LiteLLMの構築自体はDocker Composeで30分かかりませんでした。難しいのは config.yaml のプロバイダー設定くらいで、Swagger UIで動作確認しながら進めれば詰まることは少ない。
導入して数ヶ月経ちますが、「あのキー、どこに書いたっけ」という問いが頭の中から消えました。それだけで、導入した価値はあったと思っています。
道具を使う人間でいたいとは思う。でも「キー管理で消耗していた時間」を取り返す方法が、別のキー管理ツールではなくプロキシサーバーだったとは——20年やっていても、まだ気づいていないことはある。
技術的なセットアップ手順(docker-compose / config.yaml / 仮想キー発行コマンド)は Zennの記事 にまとめています。
動作確認環境: LiteLLM v1.82.3 / Docker Compose 構成 / 2026年3月確認
HW系エンジニアとして20年以上、10,000件を超える顧客訪問と2,000件を超える単独ソリューション実績。AIツールを使った個人開発やIoT農園など、Raspberry Piを使ったオートメーション化なども実践中です!エンジニア専門結婚相談所も運営中、ClaudeCodeで解決できない心の課題も解決いたします!
この記事は実運用環境での検証内容をもとに執筆しています。
META-MARK × AI
ローカルAIを動かすGPU、ちゃんと選べていますか?
VRAM・性能・コスパをMetaScoreで数値化。AIアプリ別の推奨ハードウェア要件も確認できます。