Heroku + Node.js アプリの環境変数の管理に heroku-config と dotenv を使う

Heroku 上に Node.js 製のアプリを載せている時、ローカルと Heroku 上とで、どのように環境変数を管理すると良いか調べた。

目次

Heroku の環境変数管理は heroku-config プラグインを使う

Heroku の環境変数 (Config Vars) の管理には、heroku-config というプラグインを使うのが一番やりやすい。

プラグインは以下のようにインストールする。

$ heroku plugins:install heroku-config

そして、環境変数情報を .env というファイルに書いておく。例として以下のように記述できる。

# PostgreSQL の接続先文字列
DATABASE_URL=postgres://hogehoge:fugafuga@ec0-00-00-00-000.compute-1.amazonaws.com:5432/useruser

# PostgreSQL への SSL 接続設定
PGSSLMODE=allow

シャープ # 始まりの行はコメントになるので、分かりやすく書いておける。

当然ながら、この .env ファイルはバージョン管理などに含めないこと。

記述した .env ファイルを Heroku アプリ上で使用したければ、

$ heroku config:push

で Heroku に送ることができ、逆に Heroku 上で設定されている環境変数をダウンロードするには、

$ heroku config:pull

で取得できる。

Node.js コード内で .env ファイルの環境変数を参照するには dotenv パッケージを使う

さて、Node.js スクリプト内で環境変数を参照するには、process.env.DATABASE_URL のように記述するワケだが、.env ファイルで管理している環境変数は勝手には読み込んでくれない。

そこで、dotenv というパッケージを利用し、.env というファイルがあればそのファイルの内容を環境変数として定義させるように、Node.js スクリプトを書き直してみる。

$ npm install --save dotenv

例えば pg パッケージで PostgreSQL に接続するコードで、これまでどおり本当の環境変数しか見ない場合は、以下のように書いていた。

const pg = require('pg');

// 接続先 URL
const connectionString = process.env.DATABASE_URL; // || 'postgres://postgres:postgres@localhost:5432/my_local_db';

// 接続開始
const pool = new pg.Pool({
  connectionString: connectionString
});

ローカル開発環境で、もし process.env.DATABASE_URL を設定したくなった場合は、ターミナル内に環境変数を export したりしていたワケだ。

# このように叩けば process.env.DATABASE_URL の値が設定できる
$ export DATABASE_URL=postgres://hoge:fuga@localhost:5432/another_db
$ node main.js

…が、毎度このように打つのは面倒だし、.env ファイルで管理している環境変数を直接参照できたら便利だよね、というのがこの dotenv の役割だ。

dotenv を使うには、先程のスクリプトの冒頭に、次のようなコードを追加する。

const pg = require('pg');

// 設定をロードする
require('dotenv').config();

// 接続先 URL (以降は同じ)
const connectionString = process.env.DATABASE_URL; // || 'postgres://postgres:postgres@localhost:5432/my_local_db';

あとは特に export コマンドなどは不要で、いきなり $ node main.js と呼び出してやれば、.env ファイルに書かれた環境変数情報を利用できる。

以上

.env というファイルに環境変数を逃がし、本番 (Heroku) 環境とローカル開発環境とで環境変数を容易に切り替えられるようになった。