昨日リリースされたAWS Elastic Beanstalk (AEB)ですが、EC2環境にwarをアップロードするだけで簡単にWEBアプリをデプロイできるのが魅力です。
これは、先日のTokyo.clj#8で少し話題になっていた「ClojureでWebアプリを作ってもVPSか自宅サーバがないとホスティングできない(or 制限ありな上でGAE)」という問題の一つのソリューションになるのではないかと思い、Clojure on Amazon Elastic Beanstalkの簡単な検証を行ってみました。
結論から言うと、簡単にデプロイできました。
Clojureでは既にデファクトスタンダードとなっているビルドツール「Leiningen」を使用すれば簡単です。
必要なものはLeiningenのみ(Clojureのインストールは不要)なので、これを機会にClojureを始めてみようという人にも向いています。
ClojureによるWebアプリ開発で定番のRing(Webフレームワーク)、Compojure(ルーティング)の組み合わせで簡単なアプリを書いてみます。
Leiningenのインストールがまだな人は末尾にインストール方法を書いておきました。
Leiningenでwarを作成する方法
leiningenでwarを作成するにはプラグインが必要です。現在2つ開発されています。
今回はRingを使用するのでRing用に最適化されたlein-ringを使用します。(細かい使い方は各ページ参照。)
プロジェクト作成
$ lein new hello-aeb
でプロジェクト雛型が作成されます。
プロジェクト設定ファイル(project.clj)
自動生成されたproject.cljを以下のように編集します。
(defproject hello-aeb "1.0.0-SNAPSHOT"
:description "FIXME: write"
:dependencies [[org.clojure/clojure "1.2.0"]
[org.clojure/clojure-contrib "1.2.0"]
[ring/ring "0.3.5"]
[compojure "0.5.3"]
]
:dev-dependencies [[lein-ring "0.2.4"]
[swank-clojure "1.2.1"]]
:uberjar-name "hello-aeb.war"
:ring {:handler hello-aeb.core/app})
:ubarjar-nameは最終的に作るwarファイル名。:handlerにはエントリポイントとなる関数名を指定します(こいつをラップしたServletが後からできる)。
依存ライブラリのダウンロード
初回だけ。
$ lein deps
WEBアプリケーション作成
自動生成されているsrc/hello_aeb/core.cljを以下のように編集します。
(ns hello-aeb.core
(:use compojure.core)
(:import java.util.Date java.text.SimpleDateFormat))
(defroutes app
(GET "/" req
{:status 200
:headers {"Content-Type" "text/html"}
:body (str "<h3>Hello EBS</h3>"
"<p>The current time is "
(.format (SimpleDateFormat. "HH:mm:ss") (Date.))
".</p>")})
(GET "/hello/:name" [name]
{:status 200
:headers {"Content-Type" "text/html"}
:body (format "<p>Hello, %s!</p>" name)})
(ANY "*" _
{:status 404
:headers {"Content-Type" "text/html"}
:body "<p>not found</p>"}))
ローカル環境のJettyで試す
$ lein ring server
を実行するとデフォルトで3000番ポートでJettyが起動します。
http://localhost:3000にアクセスして「Hello EBS」が表示されればOK。
ポートを指定したい場合は「lein ring server ポート番号」で。
war作成
$ lein ring uberwar
でhello-aeb.warが作成されます。warをzip展開してみるとわかりますが、しれとサーブレットクラスやらweb.xmlやらができています。
AEBへデプロイ
AWS Management Consoleにログインして「AWS Beanstalk」タブへ(登録がまだの場合は新規登録する)。
「Create New Application」ボタンを押して、以下のようにhello-aeb.warを選択して「Continue」。
(Application Nameは適当に空いているやつを。ここではclojure-aebに。)
アップロードが終わり、デプロイが完了すれば以下の様な画面に。
あとはhttp://clojure-ebs.elasticbeanstalk.com/にアクセス
以下のような画面が出ていればOK。
他にもhttp://clojure-ebs.elasticbeanstalk.com/hello/hogeでも違う画面に。
(※↑のURLはぼくがインスタンスを立ち上げているときだけアクセス可能。(多分基本落としている))
次回はAWS Elastic Beanstalk上でDBにアクセスしたアプリにチャレンジしてみたいと思います。
(おまけ) Leiningenインストール
LeiningenのInstallの章が詳しいが、
Windows
windows用のzipをダウンロード。展開してlein.batをPATHの通ったディレクトリに置く。その後
$ lein self-install
ちなみにWindowsでのClojure開発にはClojure Boxがおすすめ。
$ lein swank
したあと、EmacsからM-x slime-connectすると便利。
Linux/Mac
/usr/local/binにPATHが通っているとして、
$ wget https://github.com/technomancy/leiningen/raw/stable/bin/lein
$ sudo install -m 755 lein /usr/local/bin/
$ lein self-install


