カスタム環境変数の設定

2019-10-21

APIキーやその他の認証情報など他の人には見せたくない情報をソースコードに埋め込まない方法として環境変数を用いる方法をメモしておきます。

そのような情報をソースコードから排除しなければ、GitHubでソースコードを一般公開できません。

以下では、ローカル環境とHerokuにデプロイした環境のそれぞれで、環境変数を設定し、Node.jsから利用する方法を説明します。

env-cmdモジュールのインストール

最初にnpmモジュールをインストールします。

 npm i env-cmd@8.0.2

この後の説明によるenvファイルの指定では、最新のモジュール(10.0.1)ではパスが通らなかったのでご注意願います。

ローカルでの環境変数の設定

続いて config フォルダを作成し、そこに dev.env というファイルを作成します。

設定したい環境変数は次の形式で指定します。

KEY=VALUE

具体的には次のような感じです。

PORT=3000
MONGODB_URL=mongodb://127.0.0...
SENDGRID_API_KEY=SG...
JWT_SECRET=himitsudayo...

余談ですが、Visual Studio Codeの拡張機能DotENVをインストールすると設定ファイルに色付けされてちょっと見やすくなります。

次に env-cmdを使用してアプリケーションのローカルでの起動時にこれらの環境変数を読み込むように package.json ファイルのdevスクリプトを設定します。

  "scripts": {
    "start": "node src/index.js",
    "dev": "env-cmd ./config/dev.env nodemon src/index.js" // こちら
  }, 

Nodejsアプリケーションからの環境変数の利用

これは次の2つの例のようにして利用できます。

const port = process.env.PORT
:
sgMail.setApiKey(process.env.SENDGRID_API_KEY)

Herokuでの環境変数の設定

以下のコマンドで環境変数を設定できます。ただし、PORTはherokuで管理されるので環境変数では扱いません。

> heroku config:set KEY=VALUE 

スペースで区切って同時に複数設定することもできます。

> heroku config:set KEY1=VALUE1 KEY2=VALUE2

環境変数の値(VALUE)に特殊記号が入っている場合は、Macはシングルクォーテーション、Windows(コマンドプロンプト)はダブルクォーテーションで囲めばよいです。ただし、WindowsのPowerShellでは、&など一部の記号が特別な意味を持っているのでうまくいかずはまりました。この場合はコマンドプロンプトを使うのが一番簡単な方法です。

今どのように設定されているかは次のコマンドで確認できます。

> heroku config

環境変数の設定は次のようにおこないます。

> heroku config:unset KEY

自分用追加メモ

mongoose.connect()メソッドで指定する接続文字列は、MongoDB Atlasを使用している場合、[Connect to Cluster0]ダイアログのconnection stringをコピーし次に変更したものを使用する。

  • <password>の部分をそのユーザのパスワードで置き換え
  • ・・・mongodb.net/test?・・・ の”/test”をローカルで使っていた文字列に置き換え