DotCloudでCompojureしてみた(Hello World, MySQL) #clojure
約2ヶ月の時間を経てDotCloudのinvitationがようやくきたからいじってみました。
@makingさんの以下の記事と同じことをClojureでやってみただけなので 真新しいことは何一つやってませんのでご承知置きください。
なおeasy_install, leiningenはインストール済みという前提で進めます。
環境作り
以下の公式ドキュメントに沿って進めます。
http://docs.dotcloud.com/static/tutorials/firststeps/
dotcloudのインストール
$ sudo easy_install dotcloud
アプリケーションの作成
$ dotcloue create liquidz
サービスをデプロイ
$ dotcloud deply -t java liquidz.www
今回はClojureを使うのでサービスのタイプはJavaを選びました。 またサービス名を liquidz.www としてので、このサービスには http://www.liquidz.dotcloud.com/ というURLが割り当てられることになります。
サービスの作成
Compojureを使ってサクッと作ります。
$ lein new liquidz $ cd liquidz
project.clj
こちらも@makingさんの以下の記事をベースにwarファイルを作成できるようにしています。 @makingさん様々です。 http://blog.ik.am/entry/view/id/58/title/Clojure%E3%81%A7%E4%BD%9C%E6%88%90%E...
(defproject liquidz "1.0.0-SNAPSHOT" :description "FIXME: write" :dependencies [[org.clojure/clojure "1.2.0"] [org.clojure/clojure-contrib "1.2.0"] [compojure "0.5.3"] ] :dev-dependencies [[lein-ring "0.2.4"]] :uberjar-name "service/root.war" :ring {:handler liquidz.core/app} )
uberjar-nameがなぜ “service” 配下なのかは後ほど説明します。 また war のファイル名は root.war にすると http://www.hogehoge.dotcloud.com/ といった “/"直下でサービスで動きます。
core.clj
単純なhello worldです。
(ns liquidz.core (:use [compojure core route])) (defroutes app (GET "/" _ "hello clojure world") (not-found "page not found"))
動作確認&war化
ローカルでring起動
$ lein ring server
war化
$ mkdir service $ lein ring uberwar
war化する際に存在しないディレクトリ配下にwarを吐こうとするとエラーになるので 事前にディレクトリは作成しておきます。
DotCloudへのプッシュ
プッシュも公式ドキュメントに書いてある通り行います。 なお以下コマンドはカレントディレクトリがleiningenで作成したプロジェクト直下である想定です。
$ dotcloud push liquidz.www ./service
上記コマンドで service 配下にある全てのファイルがDotCloud上にrsyncされます。 warファイルの吐き出し先を service にしたのは、ソースファイルなどまで rsync されるのが気持ち悪かったためです。
プッシュが完了すると以下のURLから動作が確認できます。
http://www.liquidz.dotcloud.com/
ね?簡単でしょ?
MySQLも試す
元記事と同様にMySQLも試します。MySQLサービスの作成手順はまったく同じです。
$ dotcloud deploy -t mysql liquidz.db $ dotcloud info liquidz.db
上記infoで作成したMySQLのrootのパスワード、ホスト名などなどがわかります。
サービスの修正
MySQLへアクセスするようちょっと修正します。 今回はMySQLアクセス用に /sql というルートを追加しました。
(ns liquidz.core (:use [compojure core route] [clojure.contrib.sql])) (def db {:classname "com.mysql.jdbc.Driver" :subprotocol "mysql" :subname "//db.liquidz.dotcloud.com:1455" :user "root" :password "パスワード" }) (defroutes app (GET "/" _ "hello clojure world") (GET "/sql" _ (with-connection db (with-query-results rs ["select 40+2"] (-> rs first str)))) (not-found "page not found"))
MySQLのJDBCドライバを準備
以下から拾ってきて leiningen で作成したプロジェクトの lib にコピーしておきます。 http://java.keicode.com/lib/mysql-driver.php
これがないと “java.sql.SQLException: No suitable driver” のようなエラーが出るはずです。
動作確認&war化&プッシュ
前回同様です。
ローカルでring起動
$ lein ring server
war化
$ lein ring uberwar
push
$ dotcloud push liquidz.www ./service
プッシュが完了したら本番環境でも確認してみましょう。
http://www.liquidz.dotcloud.com/sql
“{:40+2 42}” こんな結果が返ってくるはずです。 ちゃんとMySQL上で足し算ができ、結果も受け取れてますね。
感想
想像以上に簡単に動いたのでビックリしました。 言語もPHP, Python, Ruby, Javaと使えるので、何か作って公開したいという時にはかなり有力候補になるんじゃないかなぁと。
ただ、まだじっくり触れてない何とも言えないですが、現状はデプロイ、プッシュが簡単に出来るコマンド類と実際にアプリが動く環境が提供されているだけなので、テストする際には自前でいろいろ準備しないといけないはず。 その辺りは優秀なテスティングフレームワークがデフォルトで提供されているappengineに軍配が上がる感じです。
でもappengineと比べると
- SQLが使える
- スピンアップタイムがない
という2点だけでも大きな利点になるではないかなぁと思いました。
そんな感じで開発はものすごくしやすい環境ではあるので、 まだベータに申し込んでない人は申し込んでみるのをオススメします。


Comments 0 Comments