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) 環境とローカル開発環境とで環境変数を容易に切り替えられるようになった。