環境変数 — コードを変えずに接続先を切り替える
アプリを開発用のデータベースから本番用に切り替えるとき、毎回ソースコードの接続先を書き換えていたら大変です。書き換え忘れて本番に開発用設定で繋いだ、なんて事故も起きます。そこで使うのが環境変数(environment variable)。接続先やパスワードといった「環境ごとに変わる値」をコードの外に出しておき、起動時に外から差し込む仕組みです。
コードには「DATABASE_URL という名前の看板を読む」とだけ書いておきます。看板の中身は環境が用意する。下の図1で環境スイッチを切り替えてみてください。コードは1行も変わらないのに、接続先の宝箱(データベース)だけが切り替わります。
const db = connect( process.env.DATABASE_URL );
コードと設定を分けると、何が嬉しいか
一番のメリットは、同じビルド(同じコード)を、開発でも本番でもそのまま動かせることです。環境ごとに差し込む値だけを変えればいいので、「テストでは通ったのに本番で違う挙動をする」リスクが減ります。さらに、データベースのパスワードやAPIキーといった秘密の値をソースコードに書かずに済むのも重要です。コードはGitに入れて皆で共有しますが、秘密を一緒に入れてしまうと漏洩につながります。環境変数なら、秘密は各サーバーにだけ置いておけます。
ローカル開発では .env というファイルに DATABASE_URL=... のように書いておき、起動時に読み込むのが定番です。ただしこの .env は秘密を含むので、.gitignore でGitの管理から外すのが鉄則。本番ではファイルではなく、サーバーやクラウドの設定画面から環境変数を注入します。
- 環境変数
- OSやサーバーがプロセスに渡す「名前=値」の設定。コードの外から注入する。
- .env ファイル
- ローカル開発用に環境変数をまとめて書くファイル。秘密を含むのでGit管理外にする。
- シークレット
- パスワードやAPIキーなど漏らせない値。コードに直書きせず環境変数や金庫サービスで管理。
- 12 Factor App
- 「設定は環境変数に」を原則の1つに挙げる、クラウド向けアプリ設計の指針。
まとめ
環境変数は、環境ごとに変わる値をコードの外に追い出す仕組みです。コードは「看板の名前」だけを知っていて、中身は起動時に環境が差し込む。だから同じコードのまま接続先を切り替えられ、秘密もコードに残しません。図1のスイッチを切り替えて、コードが固定されたまま矢印の先だけが動く様子を確かめてみてください。それが「設定とコードの分離」の効果です。