10分で dotcloud に Java アプリケーションを配備する方法

JSP の syntax をすっかり忘れてしまった Java エンジニアのソメダです、おはようございます。

さて、先日ベータがとれて正式ローンチされた PaaS サービスの dotcloud 。同僚の id:dragon3 も「dotcloud 手軽でよかばい」と絶賛中ですが、「dotcloud Java」でググってみると、現時点では

がトップヒットな感じで、ちょっと Java エンジニアとしては寂しい気持ちになってしまうのが正直なところです。

そこで、「10 分で出来る Java の war を dotcloud に配備する方法」をまとめてみよう、というのが本エントリの主題です。環境は MacOS X 10.6 を前提としてます。

dotcloud CLI をインストール

ここ の手順そのままです。

sudo easy_install pip && sudo pip install dotcloud

して /usr/local/bin/dotcloud に CLI が入り、/Library/Python/2.6/site-packages/dotcloud/ に本体がいます。このエントリ記載時のバージョンは 0.4.0 です。続いて API key をセットアップします

dotcloud

とタイプすると、対話式に聞いてきます。ちなみに上記の installtion.html のページをログイン後に見ると API key が表示されてます。僕はここで最後の「.」を誤ってコピペして何度も悩みました。ちなみに、API key の設定は ~/.dotcloud/dotcloud.conf に、そのものが保存されてるので、こっちを直接触っても大丈夫かと。

Java アプリを準備

アプリの雛形を mvn 使ってつくります。

mvn archetype:generate -B -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-webapp -DarchetypeVersion=1.0 -DgroupId=com.kanjava.aws -DartifactId=aws-sdk-webapp -Dversion=1.0 -Dpackage=com.kanjava.aws

バッチモードで書いてますが、対話式で作ってもよいでしょう。groupId や artifactId などはお好みにあわせて書き換えてください。コレ以降の作業は作成したプロジェクト (aws-sdk-webapp) 以下で行うこととします。

pom.xml の build 要素内に以下を追記。必須では無いですが、配備した後に / 直下でアプリにアクセスしたいので。

    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <configuration>
           <warName>ROOT</warName>
        </configuration>
      </plugin>
    </plugins>

まずはこれで war をパッケージング

mvn clean package

で、target 以下に ROOT.war が出来ます。

dotcloud 側への配備

まず、アプリケーションを登録します。

dotcloud create kanjava

最後の「kanjava」の所がアプリケーション名です。任意のものをつけてください。

次に配備用の dotcloud.yml を作成。場所はどこでもよいですがプロジェクトのトップがわかりやすいかと。

www:
  type: java

「www」はサービス名で、任意のもので良いです。

これら二つの作業は最初の一回で ok です。

必要なものだけアップロードするために、コピーします。

mkdir -p target/dist
cp -pr target/ROOT.war target/dist
cp -pr dotcloud.yml target/dist

ちなみに、target/dist を指定しないで後述の dotcloud push コマンドを実行すると、現在のディレクトリ以下の内容が全て rsync されてしまうので、pom.xml やら src やらまであがってしまいます。なので、mvn プロジェクトの場合は、別の配備用のディレクトリを作るのがよいでしょう。そのうち、そういうアーキタイププラグインでそうですよね。

配備します。

dotcloud push kanjava target/dist
:
sent 137 bytes received 37 bytes 31.64 bytes/sec
total size is 2.25K speedup is 12.95
Deployment for "kanjava" triggered. Will be available in a few seconds.
2011-07-01 01:11:29 [api] Waiting for the build. (It may take a few minutes)
2011-07-01 01:11:29 [www.0] Deploying...
2011-07-01 01:14:32 [www.0] Service booted..
2011-07-01 01:14:32 [www.0] The build started
2011-07-01 01:14:33 [www.0] Fetched code revision rsync-1309482688.98
2011-07-01 01:14:35 [www.0] * Stopping Jetty servlet engine (was reachable on http://kanjava-default-www-0:8080/). jetty
2011-07-01 01:14:38 [www.0] * Jetty servlet engine stopped. jetty
2011-07-01 01:14:38 [www.0] ...done.
2011-07-01 01:14:38 [www.0] * Starting Jetty servlet engine. jetty
2011-07-01 01:14:38 [www.0] * Jetty servlet engine started, reachable on http://kanjava-default-www-0:8080/. jetty
2011-07-01 01:14:43 [www.0] ...done.
2011-07-01 01:14:43 [www.0] The build finished successfully
2011-07-01 01:14:43 [api] Deploy finished
:

最初に rsync で target/dist 以下のファイルを全てアップロードし、その後 Jetty start してます。無事配備出来たらこのコマンドの最後にアクセスする URL が表示されます。後から確認したい場合は

dotcloud url kanjava

とすれば OK です。

10分で配備出来たでしょうか?!

余談1

dotcloud コマンドの内容、手順が既にベータのときと少し変わっているようで、ウェブで見つかる情報でも、既に古くなってるものがあります。私が確認した限り、

  • deploy サブコマンドはなくなった
  • dotcloud.yml ファイルは手動で作成する必要がある
  • URL はランダムなものが生成されるようになる

といった所です。

日本語エントリ書いておいてなんですが、まだこの辺り変更される可能性がありそうなので、何かおかしいな、と思ったら本家のドキュメント (http://docs.dotcloud.com) を見るのが堅そうです。

余談2

System#getProperties の内容と org.mortbay.jetty.Server#getVersion した画像をペタリしておきます。Java6 で Jetty も少し古めの 6.1.22 ですねー。