--- title: Clojureで作成したWebアプリをAWS Elastic Beanstalkにデプロイ tags: [] categories: ["Programming", "Lisp", "Clojure"] date: 2011-01-20T13:35:40Z updated: 2011-01-20T13:35:40Z --- 昨日リリースされた[AWS Elastic Beanstalk][1] (AEB)ですが、EC2環境にwarをアップロードするだけで簡単にWEBアプリをデプロイできるのが魅力です。 これは、先日のTokyo.clj#8で少し話題になっていた「ClojureでWebアプリを作ってもVPSか自宅サーバがないとホスティングできない(or 制限ありな上でGAE)」という問題の一つのソリューションになるのではないかと思い、Clojure on Amazon Elastic Beanstalkの簡単な検証を行ってみました。 結論から言うと、簡単にデプロイできました。 Clojureでは既にデファクトスタンダードとなっているビルドツール「Leiningen」を使用すれば簡単です。 必要なものは[Leiningen][2]のみ(Clojureのインストールは不要)なので、これを機会にClojureを始めてみようという人にも向いています。 ClojureによるWebアプリ開発で定番の[Ring][3](Webフレームワーク)、[Compojure][4](ルーティング)の組み合わせで簡単なアプリを書いてみます。 Leiningenのインストールがまだな人は末尾にインストール方法を書いておきました。 ### Leiningenでwarを作成する方法 leiningenでwarを作成するにはプラグインが必要です。現在2つ開発されています。 - [leiningen-war][5] - [lein-ring][6] 今回は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 "
The current time is " (.format (SimpleDateFormat. "HH:mm:ss") (Date.)) ".
")}) (GET "/hello/:name" [name] {:status 200 :headers {"Content-Type" "text/html"} :body (format "Hello, %s!
" name)}) (ANY "*" _ {:status 404 :headers {"Content-Type" "text/html"} :body "not found
"})) ### ローカル環境のJettyで試す $ lein ring server を実行するとデフォルトで3000番ポートで`Jetty`が起動します。 [http://localhost:3000][7]にアクセスして「Hello EBS」が表示されればOK。 ポートを指定したい場合は「`lein ring server ポート番号`」で。 ### war作成 $ lein ring uberwar で`hello-aeb.war`が作成されます。warをzip展開してみるとわかりますが、しれとサーブレットクラスやら`web.xml`やらができています。 ### AEBへデプロイ [AWS Management Console][8]にログインして「AWS Beanstalk」タブへ(登録がまだの場合は新規登録する)。 「Create New Application」ボタンを押して、以下のように`hello-aeb.war`を選択して「Continue」。 (Application Nameは適当に空いているやつを。ここでは`clojure-aeb`に。)
アップロードが終わり、デプロイが完了すれば以下の様な画面に。
あとは[http://clojure-ebs.elasticbeanstalk.com/][9]にアクセス
以下のような画面が出ていればOK。
他にも[http://clojure-ebs.elasticbeanstalk.com/hello/hoge][10]でも違う画面に。
(**※↑のURLはぼくがインスタンスを立ち上げているときだけアクセス可能。(多分基本落としている)**)
次回はAWS Elastic Beanstalk上でDBにアクセスしたアプリにチャレンジしてみたいと思います。
### (おまけ) Leiningenインストール
[Leiningen][11]のInstallの章が詳しいが、
#### Windows
[windows用のzip][12]をダウンロード。展開して`lein.bat`をPATHの通ったディレクトリに置く。その後
$ lein self-install
ちなみにWindowsでのClojure開発には[Clojure Box][13]がおすすめ。
$ 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
[1]: http://aws.amazon.com/elasticbeanstalk/
[2]: https://github.com/technomancy/leiningen
[3]: https://github.com/mmcgrana/ring
[4]: https://github.com/weavejester/compojure
[5]: https://github.com/alienscience/leiningen-war
[6]: https://github.com/weavejester/lein-ring
[7]: http://localhost:3000
[8]: https://console.aws.amazon.com
[9]: http://clojure-ebs.elasticbeanstalk.com/
[10]: http://clojure-ebs.elasticbeanstalk.com/hello/hoge
[11]: https://github.com/technomancy/leiningen
[12]: https://github.com/downloads/technomancy/leiningen/leiningen-1.4.2-win32.zip
[13]: http://clojure.bighugh.com/