--- 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 "

Hello EBS

" "

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/