rebar generateでErlangアプリをパッケージ化したときのメモ

なんの言語で作ったにせよ、サーバアプリケーションであれば最終的に本番サーバで稼働させて初めて意味を成します。
いわゆるデプロイと言われる作業ですが、これが意外に難物で、アプリケーションが出来上がってからサーバをセットアップして稼働させようとすると、特に依存関係周りで色々とひっかかることも少なくないです。

で、Erlangを見てみると、さすがに長年本番環境で使用されてきたというか、その為に作られた言語と実行環境だけあってデプロイ周りがキッチリしています。

Erlang自体にもともと製品リリースの為の仕組みがあるようですが、Erlangをバリバリ仕事で使っているというbashoの方々による成果物rebarを使うと更に楽ができます。

"rebar generate"でパッケージ化されたアプリケーションにはbeamファイルだけでなく、stdlibなどの基本ライブラリや更にはErlang自体も含まれています。これってJavaとかでは普通の事なのかもしれませんがRubyではここまでした事なかったのでちょっと驚きました。

なお、僕が実際にrebarでアプリケーションをリリースパッケージ化してみた際にはVoluntus氏から色々とアドバイスを頂き、設定サンプルまで作って頂きました。この場を借りてお礼を申し上げますo┐ペコリ

リリースディレクトリ構成の自動生成
前置きはこれくらいにして早速自分のアプリをパッケージ化してみます。
参考にしたのはここ: Release handling Introducing reltool.config

ここでは既にrebarによるアプリケーションの生成は終わっているものとします。
(アプリケーション新規生成のコマンドは "rebar create-app appid=hogeapplication" )

また、使用するrebarコマンドはアプリケーションディレクトリのルートディレクトリに置いてあるものとします。
rebarはここ

パッケージ化するにはまずrelディレクトリをアプリケーションのルートディレクトリに手動で作ります。

$ cd hogeapplication
$ mkdir rel

作ったディレクトリに移動してrebar create-nodeで設定ファイル等のひな形を作ります。

$ cd rel
$ ../rebar create-node nodeid=hogeapplication

これでrelディレクトリ内にfilesディレクトリとreltool.configファイルができ上がります。

$ ls
files/           reltool.config

設定ファイルの編集
続いて自動生成されたreltool.configを自分の環境に合わせて編集します。
ここに僕が作ってみたサンプルを置いておきます。上記の流れでアプリケーション名はhogeapplicationとして見てください。
Erlangリリースパッケージ生成ツール用設定ファイルのサンプル

最初、全ての基本ライブラリや直接依存していないライブラリも含める事に気づかずハマりましたがVoluntus氏のアドバイスにより理解しました。
あと、rebarのバージョンが古くて、ここでもハマりましたw なお、ここで使っているrebarのバージョンは以下の通りです。

$ /rebar --version
rebar version: 2 date: 20120516_113044 vcs: git 2e36109

さて、設定ファイルが出来上がったらあとは generateを実行するのみです。

 $ cd rel
 $ ../rebar generate
==> rel (generate)
$

なにもエラーが出ずにプロンプトが戻ってきたら無事成功です。
relディレクトリ内にノード名のディレクトリ(今回はhogeapplication)のディレクトリが生成され、そのなかにbinディレクトリがあるはずです。

アプリケーションの制御
あとはこのbinディレクトリ内のコマンドにstart, stop等のオプションを付けて実行する事で制御出来ます。

起動は

$ ./hogeapplication/bin/hogeapplication start

停止

$ ./hogeapplication/bin/hogeapplication stop

restartやrebootもありますが、自分の環境では"ok"と表示されるものの、アプリケーションは起動していませんでした。

あと、rebar startで起動するとコンソールは戻ってきてアプリケーションはデーモンとして起動されますが、稼働中のアプリケーションのコンソールに入りたい場合もあります。その場合は

$ ./hogeapplication/bin/hogeapplication attach

とすることで稼働させたままコンソールに入る事ができます。

ちなみに出来上がったhogeapplicationディレクトリの中をのぞいてみると、erlコマンドや基本ライブラリ、依存ライブラリのbeamファイルが含まれています。
従って基本的にはこのパッケージを持っていけばよその環境でも動くはずです(クロスコンパイルについては調べてませんが...)
Erlang本体を含めて全ての依存関係をパッケージしてしまうのでデプロイ時のライブラリや実行環境のバージョンなどの依存関係に起因するトラブルには格段に強そうだと思いました。


さて、ちょっと長くなったのでとりあえず今回はここまでで、このパッケージ使った無停止アップグレードしてみたメモは次回に。