Cowboy-入門

入門

Erlangは言語以上のものであり、あなたのアプリケーションのためのオペレーティングシステムです。
Erlangの開発者はスタンドアロンのモジュールをほとんど書きません。彼らはライブラリやアプリケーションを作成します。そしてその後にリリースするものに作ったライブラリなどをバンドルします。
リリースにはErlangVMにてアプリケーションを走らせるために必要なノードが含まれているため、ライブラリやアプリケーションは直接プロダクションへと含まれることになります。

この章では、Cowboyを使用する最初のアプリケーションを書いて、あなたがリリースを作成するためのすべての手順を説明します。
この章の最後にはプロダクションにCowboyのアプリケーションを含めるために必要となる事柄の全てを理解することができます。

ブートストラップ

我々はerlang.mkのビルドシステムを使用しています。
また私たちは詳細がわからなかったとしても始められるようにBootstrap機能を提供しています。

まずアプリケーション用のディレクトリを作成してみましょう。

$ mkdir hello_erlang
$ cd hello_erlang

ディレクトリ作成後、erlang.mkをダウンロードする必要があります。
以下のいずれかのコマンドを使用するか、主導でダウンロードしてください

$ wget https://raw.githubusercontent.com/ninenines/erlang.mk/master/erlang.mk

これでアプリケーションを起動することができます。
リリースを生成すると同時にBootstrapを実行します。

$ make -f erlang.mk bootstrap bootstrap-rel

これはMakefileベースのアプリケーションで、リリース作成に必要なファイルを作成します。
構築が完了し、リリースを開始することができます。

$ make
...
$ ./_rel/hello_erlang_release/bin/hello_erlang_release console
...
(hello_erlang@127.0.0.1)1>

i(). のコマンドを入力すると、hello_erlang_sup を含む実行中のプロセスが表示されます。
これがアプリケーションのためのスーパーバイザーです。

リリースを作成しましたが現状は何もしていません。
この章のの残りの部分では依存関係としてCowboyを追加し、簡単な"Hello World!"ハンドラの書き込みを行います。

Cowboy のセットアップ

アプリケーションに依存関係としてCowboyを追加するためには、Makefileとアプリケーションリソースファイルの2つのファイルを変更する必要があります。

Makefileを修正することによってビルドシステムが、Cowboyを取得してきてコンパイルをしてくれます。
上記の内容を実行するためにMakefileに1行を追加する必要があります。

PROJECT = hello_erlang
DEPS = cowboy
include erlang.mk

アプリケーションリソースファイルのsrc/hello_erlang.app.srcを修正し、ビルドシステムがCowboyをリリースに含み、自動的に実行する必要があることを記述します。
開発時に必要とされる、いくつかの依存関係を解決するためのステップとなります。

stdlibの直後にCowboyアプリケーションのリストを加えるだけです。
コンマのセパレーターを忘れずに記載してください。

{application, hello_erlang, [
    {description, "Hello Erlang!"},
    {vsn, "0.1.0"},
    {modules, []},
    {registered, []},
    {applications, [
        kernel,
        stdlib,
        cowboy
    ]},
    {mod, {hello_erlang_app, []}},
    {env, []}
]}.

ファイルを編集している時に、アプリケーションへの設定にたいして説明を記載したいと思うかもしれません。
リリースを開始し実行すると、Cowboyがbundlesされて自動的に実行されます。
Cowboyはデフォルトでは何もしないため、これだけでは十分ではありません。
接続を開始するためにCowboyに指示をする必要があります。

接続の待機

アプリケーションの起動時には2つのステップのプロセスを行います。
まずCowboyがハンドラモジュールに要求をマッピングするために必要なルートのリストをディスパッチリストに定義しコンパイルする必要があります。
その後、我々は接続を開始することをCowboyに指定します。

src/hello_erlang_app.erlファイルを開き、start/2にて必要な機能を追加します。

start(_Type, _Args) ->
    Dispatch = cowboy_router:compile([
        {'_', [{"/", hello_handler, []}]}
    ]),
    cowboy:start_http(my_http_listener, 100, [{port, 8080}],
        [{env, [{dispatch, Dispatch}]}]
    ),
    hello_erlang_sup:start_link().

ディスパッチリストにはルーティングの章に詳しく詳細を説明しています。
このチュートリアルではハンドラモジュールであるhello_handlerへのパスを/にマッピングします。
このモジュールはまだ存在していないため、記述する必要があります。

リリースを構築して実行するとhttp://localhost:8080にアクセスしてみるとモジュールがないためエラーを受け取ります。
http://localhost:8080/test」などの他のURLにアクセスすると404のエラーで終わります。

リクエストの処理

CowboyはRESTとWebSocketのハンドラなどのハンドラの種類があります。
このチュートリアルではプレーンなHTTPハンドラを使用します。

まずはテンプレートからハンドラを生成してみましょう。

$ make new t=cowboy_http n=hello_handler

上記を実行後に、src/hello_handler.erlファイルを開き、リクエストに返信するためにhandke/2の機能を変更する必要があります。

handle(Req, State=#state{}) ->
    {ok, Req2} = cowboy_req:reply(200,
        [{<<"content-type">>, <<"text/plain">>}],
        <<"Hello Erlang!">>,
        Req),
    {ok, Req2, State}.

上記のコードは200 OKをリプライし、ヘッダーのcontent-typeには、text/plainが設定され、ボディ部にはHello Erlang!と応答を送信するコードとなります。

あなたがリリースを構築し、接続をオープンにしhttp://localhost:8080にブラウザからアクセスすると見事にもHello Erlang!が表示されることを確認できるでしょう。