---
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 "<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][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`に。）

<a href='/./upload/00021/deploy-clojure-ebs-war.png'><img src='/./upload/00021/deploy-clojure-ebs-war.png' /></a>

アップロードが終わり、デプロイが完了すれば以下の様な画面に。

<a href='/./upload/00022/clojure-ebs.png'><img src='/./upload/00022/clojure-ebs.png' /></a>

あとは[http://clojure-ebs.elasticbeanstalk.com/][9]にアクセス

以下のような画面が出ていればOK。

<a href='/./upload/00023/hello-ebs.png'><img src='/./upload/00023/hello-ebs.png' /></a>

他にも[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/
