環境変数」「.env ファイル」「シークレット」「APIキーをコードに書くな」… 開発の話を覗くと、ちょこちょこ出てくる言葉。

よく聞くけど何? 環境変数・.env・シークレット
図1:よく聞くけど何?「環境変数」「.env」「シークレット」

APIキーの記事 で「」の正体を見ました。今回はその鍵をどこに保管するか——環境変数 の話です。

環境変数ってなに?

ざっくり言うと、環境変数は アプリの「外側」に置いておく「設定情報」 です。

環境変数=コードの外に置く設定情報
図2:環境変数=コードの外に置く「設定情報」

環境」=アプリが動く場所(PC・サーバー)、「変数」=中身が変わる値。 名前のとおり、もともとは「動かす場所(環境)ごとに、中身を変えられる値」という意味です。今はそこに、APIキーやパスワードなどの大事な情報も置くようになりました。

大事なのは、コードの中に直接書かず、コードの外に出しておくこと。家でいうと:

  • コードに直接鍵を書く = 鍵を玄関に置きっぱなし(誰でも見つかる)
  • 環境変数にする = 鍵をコードの外(金庫)にしまう(必要な時だけ取り出す)

なんで必要?コードに鍵を書くと…

APIキーやパスワードをコードに直接書くと、いろんな経路で漏れます。

コードに鍵を直書きする危険
図3:直書き=GitHub・スクショ・引き継ぎで全部漏れる
  • GitHub にアップしたら世界中に公開(Public リポジトリの場合)
  • スクリーンショットや動画に映り込む
  • 画面共有で人に見られる
  • 後でコードを引き継ぐ人にもバレる
  • AIにコードを貼り付けるときも一緒に渡しちゃう

→ 鍵を漏らすと 他人があなたの請求書で使い放題。ChatGPT API なら一晩で数十万円の請求もあり得ます。

だから「コードと鍵は分けて管理する」のが鉄則。これを実現する仕組みが環境変数です。

.env ファイルに書く(ローカルの金庫)

まず「鍵をどこに書くか」から。ローカル開発では .env という名前のファイルを使います。

.env ファイルの書き方
図4:「名前=値」を並べて書くだけ

.env は「environment(=環境)」の略で、環境変数を書いておくための専用ファイル。プロジェクトのフォルダに置いて、中に「名前=値」を並べるだけです:

OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxxxxxxxxx
DATABASE_URL=postgres://user:pass@localhost/mydb
NODE_ENV=development

ルールはシンプル:

  • 名前=値 の形で1行ずつ
  • 名前は 大文字+アンダースコア が慣例(OPENAI_API_KEY

これが「自分のPCに置く金庫」。アプリは「OPENAI_API_KEY の中身ちょうだい」と名前で呼ぶだけで、鍵の実物はこの .env から入ります。

コードと鍵は、別の場所にしまう

ここが一番大事。コードの置き場所鍵の置き場所を分けます。

コードはGitHub・鍵は.env、.envは上げない
図5:コードはGitHub・鍵は .env、.env は上げない
置き場所中身
コードGitHub(世界に公開されうる)鍵は書かない(名前で呼ぶだけ)
鍵(.env)自分のPCだけ鍵の実物

だから .env は GitHub にアップ(コミット)してはいけません.env自分のPCの中だけに置くもの。うっかり GitHub(公開の場)に上げると、せっかくコードと分けた鍵まで一緒に公開されてしまいます.gitignore というファイルで除外します:

# .gitignore に書く(=Gitに上げないファイル一覧)
.env
.env.*
*.key
*.pem

代わりに、空のテンプレ .env.example を Git に置いておくと、他の人(や未来の自分)に「鍵の場所だけ教える、実物は渡さない」ことができます:

# OPENAI_API_KEY … ここに自分の鍵を入れる
OPENAI_API_KEY=
# DATABASE_URL … DBのURL
DATABASE_URL=

💡 ちなみに:「金庫」といっても .env は鍵のかかった頑丈な箱ではなく、中身が読めるただのファイルです。環境変数が安全なのは箱の頑丈さではなく、「コードと分ける」「公開の場に出さない」——この2つを守るから。

本番ではどこに置く?

公開サーバー(本番)にも金庫は必要。でも .env は本番に持っていきません。代わりに、サービスごとの専用の保管機能に登録します。登録すれば、本番でもコードからは同じ「環境変数」として読み出せます

本番環境の環境変数
図6:本番は Cloudflare Secrets / GitHub Secrets / Vercel等で管理

主な置き場所:

  • Cloudflare Workerswrangler secret put OPENAI_API_KEY
  • Vercel / Netlify:管理画面の「Environment Variables」
  • GitHub Actions:Repository Settings → Secrets

ポイントは、同じコードでも動く場所によって、取ってくる金庫が変わること:

        【同じコード】
   process.env.OPENAI_API_KEY
            ↓
  ローカルで動く → .env の値
  本番で動く     → Cloudflare の値

コードは「名前で呼ぶ」だけ。中身は、動いている場所が用意した金庫から自動で入ります。だから git push でコードを送っても鍵は送られず(.env は除外済み)、本番では本番用の鍵が使われる——という流れです。

実際このサイト(ふんわりIT図解)も同じ仕組みで動いています。サイトの鍵はサービス側の金庫に預けて、コードには書きません。コードはコード置き場、鍵は鍵専用の場所——役割を分けるのが安全運用の基本です。

ここだけは守る

  • APIキー・パスワードはコードに書かない。環境変数に置いて、外から呼び出す
  • ローカルは .env ファイル、本番はサービスのSecrets機能で管理
  • .env は .gitignore に必ず書く。代わりに .env.example でテンプレを共有
  • うっかりコミットしたら、鍵を即無効化&再発行。履歴から消すより速い

まとめ

環境変数のすべて、これ1枚で
図7:環境変数 のすべて、これ1枚で

ふんわり理解チェック

  • 環境変数=アプリの「外側」に置く名前付きの箱(金庫)
  • APIキーやパスワードはコードに書かず、環境変数に入れる
  • ローカルは .env、本番はサービスの Secrets 機能
  • .env は .gitignore で必ず除外。漏らしたら即・鍵を再発行

コードと鍵は分けて管理する」——たった1行のルールですが、これを守るだけで請求事故・情報漏洩のほとんどを防げます。ふんわりIT図解の鉄則のひとつでもあります 🌱