最近PSGI/Perlをサポートし始めたdotCloudのinvite codeをもらったのでとりあえずHello World的なアプリを作った。

作り方だが、まずdotcloud用のツール類をインストールする必要がある。自分のマシンでpythonを動かした事がなかったのでそこから。まず自分のpythonは homebrew経由で入っているヤツで、全てユーザー権限で入っているのでsudoとか使ってないのに注意。

easy_install dotcloud
docloudではまず"deploy"というものを作る。deployは複数の"service"の集合体。"service"はそれぞれが一個のアプリなり、データベースなりを指す(はず)

なのでまず適当に"lestrrat"というdeployを作り

dotcloud create lestrrat
次に"lestrrat.www"というserviceを作る

dotcloud deploy --type perl lestrrat.www

この段階ではまだインフラがセットアップされているだけでアプリ自体は空。アプリ自体はどこに作ってもよくて、次のステップでそのディレクトリを指定すればOK。ここでは仮に~/git/lestrrat.wwwにあるとする

次にアプリそのものをリモートのserviceにpushしないといけない。

デフォルトの挙動では、以下のようにすると特定のディレクトリの中身を*全て*pushする。

dotcloud push lestrrat.www ~/git/lestrrat.www
ただ、ちゃんとバージョンコントロールをしたい場合は現段階ではhgとgitがサポートされていて、この場合は若干挙動が違う。

もし指定されたディレクトリに.gitディレクトリがあれば、リモートにgit pushしたのと同じような動作になる。つまり、git commitしてないファイルはpushされない。自分はとりあえず作業量のディレクトリを作り、git initした。

つぎ。リモート側で動くアプリは当然PerlにしたいのでPSGIファイルが必要なのだが、dotcloudではserviceディレクトリのルートにあるapp.psgiというファイルがデプロイされる。

追記5/1: 今回は生PSGIファイルを使うけれども、当然CatalystDancerMojoliciousをデプロイすることが可能だ。この記事では動くまでの理屈を追いたいので敢えてフレームワーク等は使ってないけれども、普通は何らかの形でそういうフレームワークを使う事になるだろう。それぞれの使い方はリンクを参照のこと。

dotcloudのチュートリアルではこのファイルはbinに実体を置いて、ルートにはsymlinkをつける、というような形になっていたが、なんせHello Worldで面倒くさいのでそのままぼん、とルートに置いた。

内容は以下のような感じ。

use strict;
return sub {
    my $env = shift;
    return [
        200,
        [ 'Content-Type' => 'text/html' ],
        [
            "<html><head><title>Hello</title></head>",
            "<body><h1>Hello, Stranger</h1><p>Here's a dump of what I know about you</p>",
            (map { "<tr><td>$_</td><td>$env->{$_}</td></tr>\n" }
                grep { /^HTTP_/ }
                keys %$env),
            "</table></body></html>"
        ],
    ]
};

これを以下のコマンドでリモート側に送ると、向こうで色々魔法が起こって、サービスが http://www.lestrrat.dotcloud.com/ であがっている・・・という感じ。

 dotcloud push lestrrat.www ~/git/lestrrat.www

ちなみに最後のコマンドはもう書くのが嫌になったので、Makefile.PLを作って以下のような記述をしておいた。これでmake dotcloudでpushされる。(注意!Module::Installを使う場合はinc/以下もpushしないといけないので、git commitしないといけないようです!)

use inc::Module::Install;

name 'lestrrat-DotCloud-Hello-World';
version '0.01';

postamble(<<EOM);
dotcloud:
     dotcloud push lestrrat.www \$(PWD)
EOM

WriteAll;

あと依存関係の類もMakefile.PLで解決してくれるとのこと。やったね!

ってことで、近々dotCloudでアプリをつくるですよ