はじめに
DB接続情報やAPIキーをコードに直接書き込んでしまうと、そのコードをGitHubなどにpushした瞬間に機密情報が漏洩します。この問題を避けるための定番の方法が、環境変数と.envファイルによる設定値の分離です。
なぜ設定値をコードから分離するのか
理由は大きく2つあります。
- 機密情報の漏洩防止: パスワード・APIキー・秘密鍵などをソースコードに直接書かないことで、リポジトリを公開・共有しても機密情報が漏れない
- 環境ごとの切り替えのしやすさ: 開発環境・本番環境でDBの接続先やAPIのエンドポイントが異なる場合、コードは変更せず設定値だけを差し替えられる
.envファイルとは
.envファイルは、KEY=値という形式で設定値を記述するプレーンテキストファイルです。
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
JWT_SECRET=your-secret-key-here
API_BASE_URL=https://api.example.com
アプリケーション起動時に、このファイルの内容が環境変数として読み込まれ、コード側からはprocess.env.DATABASE_URL(Node.js)やos.environ["DATABASE_URL"](Python)のような形で参照します。多くの言語・フレームワークには、この読み込みを担うdotenv系のライブラリが存在します(Node.jsのdotenvパッケージ、Pythonのpython-dotenvなど)。
ベストプラクティス
1. .envは絶対にバージョン管理に含めない
.gitignoreに.envを必ず追加し、Gitの管理対象から除外します。機密情報をコミットしてしまうと、後から履歴を削除しても一度pushされた情報は漏洩したものとして扱い、パスワードやAPIキーは再発行するのが安全です。
# .gitignore
.env
.env.local
2. .env.exampleをコミットしておく
.env自体はコミットしませんが、「どんな変数が必要か」をチームメンバーや将来の自分に伝えるため、値を空またはダミーにした.env.example(または.env.sample)をリポジトリに含めておくのが定番のプラクティスです。
# .env.example
DATABASE_URL=
JWT_SECRET=
API_BASE_URL=
新しく環境を構築する人は、この.env.exampleを.envにコピーして、実際の値を埋めるだけで済みます。
3. 環境ごとにファイルを分ける
開発・テスト・本番で異なる設定を使う場合、.env.development・.env.productionのようにファイルを分け、実行時の環境(NODE_ENV等)に応じて読み込むファイルを切り替える運用もよく使われます。
4. 必須変数のバリデーションを行う
設定漏れによる予期しないエラーを防ぐため、アプリケーション起動時に「必須の環境変数が設定されているか」をチェックする実装を入れておくと安全です。特に、ライブラリによっては値が未設定の場合に危険なデフォルト値(例: 誰でも推測できる固定のシークレットキー)へフォールバックすることがあるため、本番環境で必須の値が未設定のまま起動しないようにする対策は重要です。
5. 本番環境では、ホスティング先の環境変数管理機能を使う選択肢もある
本番サーバー上に.envファイルを直接置く運用に加えて、クラウドサービスやCI/CDパイプラインが提供する環境変数管理機能(シークレットマネージャー等)を使う選択肢もあります。特に複数人での運用や、機密情報のローテーションを頻繁に行う場合は、こうした専用の仕組みを使う方が安全性・監査性の面で有利です。
dotenvライブラリの読み込み優先順位に関する注意
多くのdotenv系ライブラリは、すでにOS側の環境変数として設定されている値を上書きしないという仕様になっています。つまり、.envファイルとOSの環境変数に同名の変数が両方存在する場合、OS側の値が優先されます。この挙動を知らずに「.envを変更したのに反映されない」とハマるケースがあるため、覚えておくと役立ちます。
まとめ
| 項目 | 内容 |
|---|---|
.envファイル |
KEY=値形式で設定値を記述し、コードから分離するためのファイル |
| 最重要ルール |
.gitignoreに追加し、バージョン管理に含めない |
.env.example |
必要な変数一覧を伝えるため、値を空にしたテンプレートをコミットしておく |
| 環境ごとの切り替え |
.env.development/.env.production等でファイルを分ける運用も一般的 |
| 読み込みの注意点 | OS側にすでに設定済みの環境変数は、.envの値で上書きされないことが多い |