Jan 20, 2011
Jan 20, 2011
N/A Views
MD
warning
この記事は2年以上前に更新されたものです。情報が古くなっている可能性があります。

昨日リリースされた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
Found a mistake? Update the entry.
Share this article: