結論: 環境変数は、プログラムの外側に置く「名前=値」の設定です。プログラムは、起動した時に、その値を読み取ります。接続先やAPIキーを、コードに直接書かず、環境ごとに値を入れ替えられるため、安全で、管理もしやすくなります。ローカルでは**.envファイル**に書き、GitHubに上げないのが、基本です。
環境変数とは
環境変数は、OSやサーバーなどの実行環境が持つ、「名前」と「値」のペアです。たとえば、次のようなものです。
| 名前 | 値(例) | 意味 |
|---|---|---|
PATH |
プログラムが置かれているフォルダーの一覧 | コマンドを、どこから探すか |
NODE_ENV |
production |
本番として動いているか |
DB_URL |
データベースの接続先 | どのデータベースにつなぐか |
プログラムは、名前を指定して、値を読み取ります。コードの中には、値そのものを書きません。
何のために使うのか(3つの目的)
- **環境ごとに設定を切り替える:**自分のPC(開発)・確認用(プレビュー)・公開中(本番)で、接続先や設定が違う
- **秘密の情報を、コードに書かない:**APIキー、パスワード、トークンなどを、コードから切り離す
- **コードを変えずに、動きを調整する:**機能のオン・オフや、表示の設定を、値で切り替える
.envファイルとは
ローカルで開発する時は、環境変数を、**.env(ドットエンブ)**という、テキストファイルにまとめて書く方法がよく使われます。
DB_URL=postgres://localhost/test
API_KEY=ここに、自分のキーを書く
- 形式は、名前=値を、1行に1つ書くだけ
- Next.jsなど、多くのフレームワークや、dotenvなどのライブラリが、起動時に読み込む
- 値に空白や記号が含まれる場合は、引用符で囲むことがある(ツールによって異なります)
コードから読み取る方法
言語ごとに、読み取り方が決まっています。
| 言語 | 読み取り方(例) |
|---|---|
| JavaScript(Node.js) | process.env.API_KEY |
| Python | os.environ["API_KEY"] または os.getenv("API_KEY") |
| PHP | getenv("API_KEY") |
変数そのものの考え方は、変数とはで解説しています。
してはいけないこと:キーの直書き
APIキーを、コードに直接書くと、そのコードを公開した時に、キーも一緒に公開されます。
守る基本は、次の3つです。
- キーは、.envに書く
- .gitignoreに「.env」を書き、Gitの管理から外す
- GitHubには、値を空にした「.env.example」だけを上げる(必要な項目が分かるようにする)
Gitの基本は、Gitとはや、GitとGitHubの違いで解説しています。APIキーの考え方は、APIキーとはも参考になります。
GitHubに、キーを上げてしまったら
ファイルを消すだけでは、不十分です。Gitには履歴が残り、公開されていた間に、誰かがコピーしている可能性があります。
- そのキーを、発行元のサービスで、すぐに無効にする(再発行する)
- 使われた形跡がないか、利用状況・請求を確認する
- コードを直し、環境変数から読む形に変える
- 必要なら、履歴からも取り除く(消しても、すでに漏れたものとして扱う)
無効にして再発行するのが、最優先です。
Next.jsとVercelでの注意
Next.jsでは、環境変数の名前の付け方で、扱いが変わります。
- **NEXT_PUBLIC_ で始まる変数:**ビルドの時に、ブラウザ側のコードに埋め込まれ、誰でも見られる
- **それ以外の変数:**サーバー側だけで使える。ブラウザには届かない
**秘密のキーに、NEXT_PUBLIC_ を付けてはいけません。**公開してよい設定(サイト名や、公開用のIDなど)にだけ使います。
**Vercelでの設定:**プロジェクトの設定画面にある、「Environment Variables」(環境変数)の項目に、名前と値を登録します。Production(本番)、Preview(確認用)、Development(開発)ごとに、値を分けられます。
**値を変えたら、再デプロイが必要です。**特に、NEXT_PUBLIC_ の値は、ビルドの時に埋め込まれるため、変更しても、再デプロイするまで、反映されません。画面の名称は、更新で変わることがあります。