OpsWorksでNodejsアプリを動かすときにNODE_ENVが指定できないのを何とかする件
OpsWorksのRailsアプリケーションではRAILS_EVNが指定できるにもかかわらず、Nodejsアプリケーションでは、NODE_ENVが指定できず、stagingとproductionで振る舞いを変えたりすることができません。
opsworks_custom_env や OpsWorksEnvyのenvironment_variables などを参考にレシピを自分で作成するのもよいのですが、レシピの中でなるべく依存関係が無い状態にしたり、デフォルトのMonit監視設定を変更したりしなければなりません。また、opsworksで自動で設定される標準設定を書き換えてしまうと、今後AWS側で標準設定の書き換えが行われた時にその変更も取り込んだりしないといけないので、出来る限り設定ファイルの上書きでなくファイル追加などで対応したいところですね。
なので、今回紹介するやり方は デプロイフックとNodejsのnode-configモジュールを組み合わせるという技です。
node-config の使い方については、
node.jsのいろいろなモジュール13 – node-configで設定ファイルを切り替えたりする | Developers.IO
を参考にするとすぐに理解できるかと思います。環境毎に固有の設定を別ファイルに抜き出しておくことで、自動で環境に応じた設定ファイル読み込めるというものです。
今回はこの仕組みを利用して以下の設定ファイルを作成したものとして話を進めます。
- config
- default.js (開発環境の設定)
- staging.js (ステージング環境の設定)
- production.js (本番環境の設定)
環境ごとの設定ファイルが出来たことで、デプロイした時に適切なファイルを読み込めるようにすればNODE_ENVを指定できなくても大丈夫ですね。
まずは、StackのCustom JSONで環境変数を設定しましょう。
次はDeployフックです。以前、『OpsWorksでRailsをデプロイする際にasset:precompileを実施する方法 - よかろうもん!』の記事にてデプロイフックのやり方をご紹介しましたね。
Nodejsでも同じようにdeployディレクトリ以下にフック処理を記述したファイルを配置しましょう。
今回は deploy/before_restart.rb というファイルを作成し、上記 StackのCustom JSONで指定した値を読み込み、その値の設定ファイルを default.js にコピーしてデフォルト値として読み込ませます。NODE_ENVの指定がない場合は staging.js / production.js よりも優先して default.js が読み込まれるようになっているので、これで大丈夫なんですね。
上記を見ればすぐにわかりますが、node_envを読み込んで、必要となるファイルをコピーしていますね。
これで deploy フックとStackでのCustom JSONの指定だけで、NODE_ENVを指定した時と同じような仕組みを実現できましたね。めでたしメデタシ。