【本番環境なら必須】アプリケーションの設定を環境変数で管理しよう!

公開日:2022-07-24
Node.js
環境変数

https://www.youtube.com/watch?v=y0kAFL7c4Xo

はじめに

今回は、環境変数について学びます。アプリケーション開発において設定情報を管理するための重要な概念なので、しっかり学習しましょう。

なぜ環境変数を使うのか

理由1: 複数環境での設定共有

アプリケーション開発においては、1つのソースコードを複数の環境で実行したいというニーズがあります。例えば、開発環境、検証環境、本番環境の3つの環境を用意する場合があります。こうした時に、環境ごとに必要な値をソースコード中に書いてしまうと値の変更や環境の追加があった場合にソースコードを更新してビルドし直さなければなりません。

環境変数を用いることでそれぞれの環境ごとに必要な値を設定できるため、メンテナンスが容易になります。

理由2: セキュリティ対策

データベースやAWS等のクラウドサービスを用いるサービスの場合、プログラムがそれらのサービスにアクセスするためには認証情報が必要になります。こうした情報は機密情報なので、できるだけ秘匿する必要があります。ところが、認証情報をソースコード中に直接書いてしまうと、アプリケーションをGitHub等で管理している場合などに、ソースコードを閲覧できる人は誰でも認証情報が見られるようになってしまいます。これはセキュリティの観点から危険な状態です。

環境変数を用いることで機密情報をソースコードに含めず管理でき、より安全な開発ができます。

The Twelve-Factor Appという、アプリケーション開発で注意すべき12点をまとめたウェブサイトがあります。環境変数についてはこの中の”III. 設定”で詳しく紹介されています。

https://12factor.net/ja/https://12factor.net/ja/

環境変数を扱う方法

環境変数を扱う方法について見ていきましょう。今回はNode.jsを例に、「実行時に渡す方法」「OSに設定する方法」「ファイルから読み込む方法」の3つを紹介します。

方法1:実行時に環境変数を渡す

プログラムの実行時に環境変数を指定できます。例えば、Node.jsではnode env-example.jsというようなコマンドで実行できますが、環境変数の指定を追加すると次のようになります。

DB_PASSWORD=example node env-example.js

ここで、DB_PASSWORDが環境変数の名前であり、exampleが環境変数の値です。実際に変数が渡せていることを確認してみます。Node.jsではprocess.envを通じて環境変数を取得できるので、env-example.jsは次のようになります。

console.log(process.env);
console.log("The value of DB_PASSWORD is:", process.env.DB_PASSWORD);

これを実行すると、最初の出力では全ての環境変数がオブジェクトとして出力されます。2つ目の出力では、環境変数として受け取りたい値であるDB_PASSWORDの値が出力されます。

方法2:OSに環境変数を設定する

プログラムはOSに設定された環境変数を読むことができます。MacやLinuxでは、exportコマンドを用いてOSに環境変数を設定できます。

export DB_PASSWORD=example

このようにすると、単にnode env-example.jsというコマンドを続けて実行した場合にも環境変数を渡すことができます。

一度設定した環境変数を解除するには、unsetコマンドを用います。

unset DB_PASSWORD

方法3:外部ファイルから読み込む方法

最近の開発で一般的に使われている、環境変数をファイルから読み込む方法を紹介します。.envという名前のファイルをプロジェクトルートに設置し、プログラムから読み込むという方法です。.envファイルを読み込む場合は言語ごとのライブラリを使うことが一般的です。

Node.jsではdotenvというライブラリを用います。npmまたはyarnによってインストールしましょう。次の1行を記述することで.envファイルの内容を環境変数として利用できるようになります。

require("dotenv").config()

環境変数の使用例

具体的にアプリケーションで使う場合の例として、MySQLの設定情報を環境変数で扱う場合は次のようになります。

const connection = mysql.createConnection({
  host: process.env.DB_HOST,
  user: process.env.DB_USER,
  database: process.env.DB_NAME,
  password: process.env.DB_PASSWORD,
  // SQLインジェクション対策
  stringfyObjects: true,
})

環境変数を利用する際の注意点

環境変数が適用される範囲に注意が必要です。最初に紹介した「実行時に環境変数を渡す方法」はプログラムに直接渡す方法です。一方、「OSに環境変数を設定する」方法では複数のプログラムで環境変数を共有することになるため、予期しない結果にならないよう注意が必要です。

またOSへの環境変数の設定方法はOSによって異なります。今回は、MacやLinuxで使用できるexportコマンドを紹介しましたが、Windowsなどの他のOSでは方法が異なるので注意が必要です。

最後に、本番環境で用いる機密情報が含まれた.envファイルをGitで管理しないように注意が必要です。この.envファイルもテキストデータなので、Gitで管理してしまうと、ソースコードで管理することと同様のセキュリティリスクがあります。.envファイルをGitで管理したい場合は、開発者間で公開しても問題の無いテスト用の情報になっているかなどを確認するようにしましょう。

まとめ

今回は、環境変数について説明しました。本番環境で機密情報を扱う際にはぜひ環境変数を活用しましょう。

参考