とある界隈で名前が突如として現れた「DotCloud」。 いまさら感ありますが昨日遊んでみたら、案の定「DotCloudスゲー」状態になったのでまとめます。
DotCloudって何?
Platform as a Service=PaaSの一種。 「日本を代表するアルファギーク」として有名なmiyagawaさんが最近joinしたことで有名になったサービスです。 DotCloudのホームページを見ると
Be a developer, not a sysadmin.
と書いてあります。つまり運用のためのシステム管理はDotCloudがやって、 僕達は負担することなく開発に没入できる、という環境作りを目指しているようです。 以後説明するようにPerlだったらアプリケーションのコードといくつかの設定的なコードを書くだけで、 デプロイ=運用環境への配置をほぼ自動でやってくれます。 ec2のようなサーバは柔軟でありますがサーバソフトウェア諸々セッティングしなくてはいけなかったり、 実運用時の監視や対応もつきまといますが、それをDotCloudはやってくれます、もしくは、今後やっていくようです。 気になる対応言語は、Perl、PHP、Ruby、Python、Node.js等、様々です。 データベース関係もMySQLだけではなくMongoDB、Redisなど各種に渡ります。
DotCloudはただいまベータ版に付きinviteコードがあれば無料で使うことができます。 ホームページでメールアドレスを登録するとそのうち配布されます。
DotCloudでHelloしてみる
では、DotCloudに登録できたら、既出ではありますがHelloWorldしてみましょう。 DotCloudを使うには手元の環境にdotcloudコマンドをインストールして、 それでごにょごにょするイメージです。python製のインストールツールeasy_installコマンドが入っていれば、 以下のコマンドで入ります。
$ sudo easy_install dotcloud
dotcloudコマンドが入ったらデプロイってのとその下にサービスというのをいくつか作って、 アプリケーションなりなんなりを動かしていきます。 まず、自分のよく使うアカウント名とかでデプロイを作ってみましょう。
$ dotcloud create yusukebe
次にwwwというサービスをyusukebeデプロイ以下にPerl環境で構築します。
$ dotcloud deploy yusukebe.www -t perl
今回はMojolicious::LiteというPerlにおけるsinatraライクの簡単に作れるWAFを使って、 トップページにアクセスすると「Hello dotcloud!!」と表示するだけのものを上記したサービスに配置します。 なのでほぼMojoliciousの中の人のブログのぱくりになります!
さて適当にローカルにディレクトリを掘って以下のファイルを用意します。
. ├── Makefile.PL ├── app.psgi └── myapp.pl
myapp.plがMojolicious::Liteのアプリケーションスクリプトになるので、 こちらは実際に実行すれば手元でも確認することができます。
#!/usr/bin/env perl use Mojolicious::Lite; get '/' => sub { my $self = shift; $self->render_text('Hello dotcloud!!'); }; app->start;
app.psgiというファイル名でDotCloud上に置くとそれがアプリケーションの起動psgiになるようです。
$ENV{MOJO_MODE} = 'production'; require 'myapp.pl';
Makefile.PLでは使用するモジュール記載します。あとでDotCloud上にインストールされます。
#!/usr/bin/env perl use ExtUtils::MakeMaker; WriteMakefile( PREREQ_PM => {'Mojolicious' => '1.21'} );
ではこの3つのファイルをDotCloudに上げて動かしてみましょう。 3つのファイルがあるディレクトリに移動して、
$ dotcloud push yusukebe.www .
とするとファイルがアップロードというか同期されてアプリケーションの構築が始まります。 Makefile.PLで記載したモジュールがインストールされます。 次にアプリケーションを立ち上げます。
$ dotcloud run yusukebe.www
実際に運用しているものはこちらです。 http://www.yusukebe.dotcloud.com/
DotCloud上でFacebookアプリを動かす
ここまで来るともう少し実用的なアプリを動かしたくなります。 そこでMojolicious::Liteをそのまま使い、Facebookログインすると自分のタイムラインが表示される 簡単なFacebookアプリを動かしてみましょう。 といってもアプリ側のコードを変えるだけでDotCloud上でやることは、 配置の「サービス」先を変更するくらいで特に意識することはありません。 まさに開発者のためのプラットフォーム!
myapp.plは以下のようになります。
#!/usr/bin/env perl use Mojolicious::Lite; use Facebook::Graph; use Try::Tiny; helper fb => sub { my $self = shift; my $base = $self->req->url->base; my $fb = Facebook::Graph->new( app_id => "xxxxx", secret => "xxxxx", postback => "$base/callback", ); return $fb; }; app->secret('My Secret....!!!'); # 各自必ず変更すること!! get '/' => 'index'; get '/login' => sub { my $self = shift; my $uri = $self->fb->authorize->extend_permissions(qw/read_stream/)->uri_as_string; $self->redirect_to($uri); }; get '/logout' => sub { my $self = shift; $self->session(expires => 1); $self->redirect_to('index'); }; get '/callback' => sub { my $self = shift; my $code = $self->req->param('code'); unless ($code) { $self->render_not_found(); return; } $self->session( access_token => $code ); $self->redirect_to('/timeline'); }; get '/timeline' => sub { my $self = shift; my $access_token = $self->session('access_token'); my $fb = $self->fb; try { $fb->request_access_token($access_token); } catch { $self->redirect_to('index'); return; }; $self->stash->{timeline} = $fb->fetch('me/home')->{data}; } => 'timeline'; app->start; __DATA__ @@ index.html.ep % if ($self->session('access_token')) { <%= link_to 'Logout' => '/logout' %> <%= link_to 'Timeline' => '/timeline' %> % }else{ <%= link_to 'Login' => '/login' %> % } @@ timeline.html.ep <%= link_to 'Top' => '/' %> % for my $data ( @$timeline ) { <dl> <dt><img src="http://graph.facebook.com/<%= $data->{from}{id} %>/picture" /> <%= $data->{from}{name} %></dt> <dd><%= $data->{message} %></dd> </dl> % }
これにともないMakefile.PLはこうなります。
#!/usr/bin/env perl use ExtUtils::MakeMaker; WriteMakefile( PREREQ_PM => { 'Try::Tiny' => '0.09', 'Mojolicious' => '1.21', 'Facebook::Graph' => '1.0300' } );
実際に動いているサンプルはこちら。 http://fbtimeline.yusukebe.dotcloud.com/
まとめ
DotCloudは「本当に」開発者のためのプラットフォームになる可能性を秘めていると思いました。 特に「dotcloud push」コマンドを使った後、モジュールが自動でインストールされる様はかっこいい!です。 今後はベータがとれて課金モデルへと移行されると思いますが、 その際のスケーラビリティや監視などを含めた信頼性が担保されれば普通に使うなーと思います。 昨日触ったばかりの僕が言えることではないですが、 まだの方は使ってみると面白いかもです!