設定をコードへ埋め込まない、環境変数

環境変数は、アプリが動く環境ごとに変わる設定値を、コードの外側に置いておく仕組みです。

開発中はテスト用のデータベースにつなぎ、本番では本番のデータベースにつなぐ。同じアプリなのに、置かれた場所によって行き先を変えたい。そのためにコードの外へ出しておく設定値が、環境変数です。

同じコード、違う行き先

環境変数は、アプリの動作に必要な設定値をコードの外に置き、動かす環境ごとに切り替えられるようにする仕組みです。社員証にたとえると、同じ社員でも、本社と支社と倉庫では入れる部屋が違い、それを伝えるのは手元のカードのほうです。アプリも、本体は同じまま、起動するときに渡される情報で「この環境ではこの接続先、この権限で動く」と知ります。

データベースの接続先、APIキー、メールの送信先のように、開発、ステージング、本番で値が違うものを外に出しておけば、コードを書き換えずに環境ごとの動きを変えられます。コンテナやサーバーレスの環境では、起動するときに設定を注入する方法として定番です。同じコンテナのイメージを、渡す環境変数だけ変えて複数の環境で使い回せます。

.json や .yaml の設定ファイルにまとめる方法もありますが、環境変数は起動時に外から渡せるので、秘密の値を含むファイルをリポジトリに入れずに済みます。

本番の障害は設定の入れ忘れから起きる

開発チームのチャット
開発担当A

新機能、ステージングでは動いたのに、本番だけエラーになります。

開発担当B

……本番に、新しい環境変数を入れ忘れてました。

コードに書かない代わりに、どこかで値を設定する作業が必ず要ります。ここで起きるのが、入れ忘れと入れ間違いです。新しい機能で環境変数を1つ増やしたのに、本番に設定し忘れた。接続先の値を一文字間違えた。これだけで本番は止まります。

チームで共有するために、必要な環境変数の一覧を .env.example のようなファイルで管理しておきます。デプロイのときに必要な変数がそろっているかを確かめる手順も用意しましょう。値を変えたあとはアプリの再起動が必要なことも多いので、変更後の動作確認まで済ませてから作業を終えます。

秘密の置き場所として使うなら

APIキーや認証情報のような秘密の値(シークレット)は、コードや Git のリポジトリに含めず、環境変数として渡すのが基本です。本番の値は、専用のシークレット管理サービスで保護します。

ただ、環境変数に入れれば安全、というわけでもありません。エラーの記録や画面の表示に、うっかり値が出てしまうことがあります。どこに保存されていて、どこに表示されうるかまで確認してください。