ブログに戻る

はじめにガイド

API キーを安全に保存する: 環境変数、.gitignore、漏洩時の対処

CheapTokens のキーをコードと git から守りましょう。環境変数を設定し、.env を .gitignore に追加し、キーが漏れた場合の対処を知っておきましょう。

投稿者: CheapTokens Team公開日 読了時間 7 分

環境変数の export と API キー用の .gitignore 行があるターミナル
このページの内容
  1. キーをコードに置くべきでない理由
  2. ステップ1: キーを環境変数に入れる
  3. ステップ2: .env ファイルをコミットせずに使う
  4. キーが漏れた場合: 順番にやるべきこと
  5. セルフチェック

キーはコードではなく環境変数に置き、.env ファイルは .gitignore の一行で git から除外しましょう。キーがすでに公開された場所に置かれてしまった場合は、まずキーに対処し、後片付けはその後にしてください。キーがコードやツールに残ったまま git 履歴を書き換えても、何も解決しません。

これが要点です。このガイドは実践編です(基本は What is an API key にあります)。3つのコマンド、1つの動作するリクエスト、そしてトラブル発生時のための短い計画です。

キーをコードに置くべきでない理由#

API キーは、あなたのお金を使うパスワードです。キーを持つ人は誰でもあなたの残高でリクエストを送れ、サービス側はそれをあなたと区別できません。

よくある失敗の仕方は地味です。最初のリクエストを通すためにスクリプトへキーを貼り付け、スクリプトが動き、git push して、リポジトリが公開される。あるいは設定ファイルを同僚に送る。あるいはキーが隅に映ったエラーのスクリーンショットを撮る。どれも結果は同じです。

GitHub はこのパターンをよく知っています。シークレットスキャン(GitHub docs、2026年10月29日確認)は、全ブランチの Git 履歴全体からハードコードされた認証情報を探し、さらに issue、pull request、discussion、wiki、シークレット gist も調べ、見つけるとアラートを出します。つまり、次のコミットでその行を削除しても何も変わりません。古いコミットにはまだ残っているからです。

以下が同じスクリプトの変更前と変更後です。

比較する

同じスクリプト、キーをコードの外へ

キーがコード内にある場合

python
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key="<your-key>",  # pasted here: ends up in git
)

キーを環境から取得する場合

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

2番目のバージョンはそのまま GitHub、チャット、コードレビューに出せます。キーはファイルの外、あなたのマシン上にあります。

ステップ1: キーを環境変数に入れる#

環境変数とは、ターミナルが起動するすべてのプログラムに渡す名前付きの値です。スクリプトは CHEAPTOKENS_API_KEY を名前で要求し、その出どころを見ることはありません。

macOS と Linux の場合:

bash
export CHEAPTOKENS_API_KEY="<your-key>"

Windows PowerShell の場合:

powershell
setx CHEAPTOKENS_API_KEY "<your-key>"

つまずきやすい点が2つあります。export はそのターミナルウィンドウでのみ有効なので、保持するにはシェルプロファイル(~/.zshrc または ~/.bashrc)に行を追加してください。また setx は入力したウィンドウを変更しないため、テスト前に新しいターミナルを開いてください。

次に完全なリクエストです。OpenAI 互換のエンドポイント https://api.cheaptokens.dev/v1 と、完全な id を持つ DeepSeek-V4-Flash(deepseek-ai/DeepSeek-V4-Flash-0731。プロバイダー間で名前が異なるため、id は CheapTokens docs から取得してください)を使います:

python
import os
from openai import OpenAI

client = OpenAI(
    base_url="https://api.cheaptokens.dev/v1",
    api_key=os.environ["CHEAPTOKENS_API_KEY"],
)

resp = client.chat.completions.create(
    model="deepseek-ai/DeepSeek-V4-Flash-0731",
    messages=[{"role": "user", "content": "Say hi in five words."}],
)
print(resp.choices[0].message.content)
print(resp.usage)

短い挨拶は入力約20トークン、出力約20トークンのリクエストで、現在の価格では $0.0000023 です(全リストは pricing page にあります)。まだ最初のリクエストを送っていない場合は、Your first API request with CheapTokens がゼロから説明しています。

モデルの回答は choices[0].message.content で返り、usage はカウントされたトークンを示します。キーはファイルに一切現れません。

.env と .gitignore のコマンドを示すターミナル
キーを git から守る3つのコマンド

ステップ2: .env ファイルをコミットせずに使う#

新しいウィンドウごとに export と入力するのは面倒です。.env ファイルなら値をプロジェクトのそばの1か所にまとめられます:

text
CHEAPTOKENS_API_KEY=<your-key>

Python では python-dotenv(pip install python-dotenv)で読み込みます:

python
from dotenv import load_dotenv
load_dotenv()  # fills os.environ from .env

このファイルが安全なのは、git が決して見ない場合だけです。最初のコミット前に .gitignore に追加してください:

bash
echo ".env" >> .gitignore
git check-ignore -v .env

すべて正しければ、2番目のコマンドは .gitignore:1:.env .env のようなものを出力します。git がどのルールでファイルを無視しているかを示します。何も出力されなければ、ルールが効いていません。Windows では、エディタで .gitignore を作成して .env の行を入れるか、Add-Content .gitignore .env を使ってください。PowerShell の >> は UTF-16 で書き込むことがあり、git が無視する可能性があります。

1つの落とし穴: .gitignore は git がまだ追跡していないファイルにのみ効きます。.env がすでに一度コミットされている場合は、git rm --cached .env を実行して git の追跡を止め、中のキーは露出したものとして扱ってください(詳細は後述)。きれいな習慣として、値の代わりに変数名とプレースホルダーを書いた .env.example をコミットすると、チームメイトが何を設定すべきか分かります。

キーが漏れた場合: 順番にやるべきこと#

キーが公開リポジトリに流出したかもしれません。スクリーンショットに写ったかもしれません。設定全体をフォーラムのスレッドに貼ったかもしれません。個々のステップの速さよりも順番が重要です。

GitHub 自身のガイダンス(同じページ、2026年10月29日確認)は、認証情報を直ちにローテーションすることです。Git 履歴の書き換えは任意であり、認証情報が失効すれば多くの場合不要です。人は逆の順序をやりがちです。キーがまだ有効なうちに1時間かけて履歴を消すのです。やめましょう。

ケースを選ぶ

キーに何が起きましたか? 最も近いケースを選んでください

キーが現在公開されているコミットにあった

まずコードからキーを削除し、環境変数に切り替え、.env を .gitignore に追加し、自分が送っていないリクエストがないか残高を確認してください。履歴のクリーンアップは後回しの nice-to-have であり、緊急の部分ではありません。

キーがスクリーンショットや共有ファイルにあった

同じ順序です。ツールでそのキーの使用を止めて環境変数に移し、可能なら投稿やファイルを削除してください。削除したスクリーンショットはすでにコピーされている可能性があるので、削除だけに頼らないでください。

同じキーを複数のツールで使っている

キーを保持していたすべての場所(シェルプロファイル、.env ファイル、エディタやターミナルのツール)を確認し、それぞれを環境変数に向けてください。そうすれば変更箇所は1か所になります。ツールが変数を読めない場合、401/404 troubleshooting guide にエラーがどのように見えるかが示されています。

漏洩後の3ステップ: コードからキーを外す、すべてのツールを更新する、テストリクエストを送る
まずコードからキーを外し、次にすべてのツール、最後にテストリクエスト

クリーンアップ後、ステップ1のように小さなテストリクエストを1つ送り、残高を確認してください。応答が返り、残高とリクエスト数が正常に見えればクリーンアップは完了です。数日間は残高に注意を払ってください。公開されたキーはコードから削除した後でも露出したものとして扱うべきなので、自分が送っていない残高やリクエスト数の変化を監視し、そのキーを新しい場所で再利用しないでください。キーが置かれがちな場所については Where to plug in your own API key を参照してください。

セルフチェック#

自分で試す試してみましょう: 変数を unset してスクリプトを実行します。何が見えますか?答えを表示

Python はリクエストがマシンから出る前に KeyError: 'CHEAPTOKENS_API_KEY' で停止します。これが良い失敗です。スクリプトは貼り付けたキーを黙って使うのではなく、キーなしでは実行を拒否します。代わりに 401 が表示される場合、変数は設定されていますがキーが間違っています。キーとアドレスを 401/404 guide と照らし合わせて確認してください。