環境変数とは何か
環境変数は、プログラムの外側にある実行環境から、そのプログラムへ渡す名前付きの値です。同じコードでも、開発用と本番用の接続先や動作を切り替えるために使われます。
環境変数へ入れた値が自動的に安全になるわけではありません。秘密値を入れる場合は、保存場所、配信先、閲覧権限、ログへの出力を別に確認します。
一文でいうと
環境変数とは、実行中のプログラムが名前で読み取れる、実行環境側の設定値です。
Node.jsの公式資料では、環境変数をプロセスが動作する環境に関連付けられた変数と説明しています。PowerShellの公式資料では、現在のプロセスで使える範囲のほか、OSによって利用者やマシンへ保存される範囲があることが示されています。
個人開発のどこで登場するか
次のような値をコードから分けたい場面で登場します。
コードを変更せず、環境ごとに異なる値を渡せることが利点です。一方、必要な変数が不足したり、別環境の値を渡したりすると、起動失敗や誤った接続につながります。
名前と値を読み取る例
アプリが APP_PORT という環境変数を読み、待ち受けるポートを決める例を考えます。開発環境では 3000、本番環境では公開基盤が指定した値を渡せます。
ここで、3000 が数値に見えても、環境変数から得られる値は文字列として扱われることがあります。Node.jsの.env仕様でも、0、true、JSONのように見える値を含め、読み取った値は文字列になると説明されています。プログラム側で型と許容範囲を検証します。
.envファイルやシークレットと区別する
環境変数:実行中のプログラムが環境から読み取る名前付きの値
.envファイル:名前と値の組をテキストで記述し、環境変数として読み込むために使われるファイル設定値:アプリの動作を変える値の総称。公開してよい値も含む
シークレット:漏れると権限の悪用などにつながるため秘密にすべき値
.envは通常のテキストファイルです。そこへシークレットとは何かを記録した場合、リポジトリ、バックアップ、共有、画面表示から漏れない管理が必要です。
配信先と再起動を確認する
フロントエンド向けの環境変数は、ビルド時にJavaScriptやHTMLへ埋め込まれ、ブラウザから読める場合があります。変数名に PUBLIC が付くかだけで判断せず、最終成果物に値が含まれるか確認します。
設定変更時は次を確認します。
開発、Preview、本番のどの環境を変更するか
変更後に再起動や再デプロイが必要か
未設定時に安全に停止するか
ログやエラー画面へ値を出していないか
以前の秘密値を失効する必要があるか
値を登録した管理画面と、実際に動くアプリが同じ環境を参照しているとは限りません。
次に読む記事
秘密値の判断と保管はシークレットとは何かへ、具体的な運用は個人開発の秘密情報を安全に管理するへ進みます。変更を公開環境へ反映する工程はデプロイとは何かで説明します。