新しいblogに移行しました

新ブログ "All Yout Bugs Are Belong To Ass" に移行しました!

2011-09-03

[Perl]dotcloudにPSGIアプリを上げてみた

しばらく放置気味だったブログも久々に更新。

さて、夏バテ気味の僕もついにあのdotcloudに入門してみました。

作業するための環境を用意する

今回は作業環境にさくらVPS(CentOS5.5)を使うことにしました。理由は聞かないで。

python2.6とeazy_install, pipを入れる必要があるらしい

こちらの記事を参考に、素直にrootでpython2.6などをビルド&インストールしました。

補足としては、先のブログの「インストール」のところにあるコードスニペットの7行目
zlib zlibmodule.c -I$(prefix)/include -L$(exec_prefix)/lib -lz
ここは、「こういう行が Modules/Setup の中でコメントアウトされているから、それをコメントインしなさいね」の意であるようです。

ちなみにこのステップをpythonbrewを使って楽することも出来るってすごい人から教えてもらいました。すげー!

dotcloud コマンドラインツールをインストール

どう見ても
# easy_install-2.6 dotcloud
これだけでした。本当にありがとうございました。

一般ユーザ権限でpython2.6を使えるように設定

先のブログにも書いてますけど、$HOME/.bashrcに以下を追記すればOKです。
PATH=$PATH:/usr/local/python/bin
alias python='python2.6'

アプリケーションをdotcloudに登録する

デプロイの準備としてアプリケーション名をdotcloudに教える必要があるので、アプリケーション登録をします。
$ dotcloud create [App-Name]
[App-Name]には半角英字4文字以上でアプリケーション名を入れてあげましょう。
初回起動時に限り、dotcloudのapi-keyを聞かれますので、このあたりでコピーし、ターミナルに貼り付けてやればいいです。

PSGIアプリをこさえてUPする

このあたりにグッドでナイスなドキュメントがありますが、重要なのはdotcloud.ymlという設定ファイルと、アプリのファイル構造です。
とはいえ、本当にスッカスカの状態のアプリを作って上げないことには基本がわかりにくい気もするので、スッカスカアプリ(ハローワールド)を仕立てていきます。

アプリのディレクトリを作る

そのまんまです。好きな名前のディレクトリ名でいいでしょう。
$ mkdir myhello

アプリのルートディレクトリを作る

approotと呼ばれるディレクトリを用意する必要があります。さっき作ったディレクトリの直下に置くということさえ守れば、ディレクトリ名はなんでもOKです。
$ mkdir myhello/oreapp

dotcloud.ymlを書く

dotcloudにアプリを上げて適正に動作させるためには、dotcloud.ymlが不可欠です。とはいえ、非常にシンプルなので臆せずに。viなどのエディタで、先に作成したアプリのディレクトリ直下(approotと同列)にdotcloud.ymlを作りましょう。
www:
    type: perl
    approot: oreapp

app.psgiを書く

取り急ぎ以下のようなアプリを書いて、oreapp/app.psgi として保存します。
sub {
    [ 200, [ 'Contents-type' => 'text/html' ], [ 'All your vase are belong to ass' ] ]
}

デプロイする

dotcloudにアプリをデプロイします。
$ dotcloud push myhello ./myhello/

すると、rsyncで同期しているような表示がでてきて、ちょっとまっていると
2011-09-02 15:31:08 [api] All the services are ready. Beginning the build.
2011-09-02 15:31:08 [www.0] The build started
2011-09-02 15:31:09 [www.0] Fetched code revision rsync-1314977467.1
2011-09-02 15:31:11 [www.0] Reloading nginx configuration: nginx.
2011-09-02 15:31:13 [www.0] uwsgi: started
2011-09-02 15:31:14 [www.0] The build finished successfully
2011-09-02 15:31:14 [api] Deploy finished

Deployment finished. Your application is available at the following URLs
www: http://ytnobody-myhello.dotcloud.com/
みたいな感じの表示が出てきます。これでデプロイ終了です。
最後に表示されたURLにアクセスして、
All your vase are belong to ass
と表示されていれば無事にアプリが稼動しています。

perl on dotcloud に関するもっと良い情報

hachioji.pm常連のすごい人がまとめてるPerl on DotCloud まとめがいい感じです。

さいごに

途中から書くのだるくなっちゃって、テキトーな感じになりましたが、意外とdotcloudは難しくないぞ、ということを言いたかったのであります。

ついでに

こうなったらどうすればいいのでしょうか。どなたか教えてください><
Deployment for "ytnobody" triggered. Will be available in a few seconds.
2011-09-02 16:31:15 [api] Deploy ytnobody scheduled for revision=latest
2011-09-02 16:31:15 [api] Waiting for the build. (It may take a few minutes)
2011-09-02 16:31:15 [api] All the services are ready. Beginning the build.
2011-09-02 16:31:15 [www.0] The build started
2011-09-02 16:31:16 [www.0] Fetched code revision rsync-1314981073.92
2011-09-02 16:31:17 [www.0] --> Working on .
2011-09-02 16:31:17 [www.0] Configuring Ytnobody-Hello-0.01 ... OK
2011-09-02 16:31:17 [www.0] ==> Found dependencies: Pickles
2011-09-02 16:31:18 [www.0] --> Working on Pickles
2011-09-02 16:31:18 [www.0] Fetching http://search.cpan.org/CPAN/authors/id/D/DM/DMAKI/Pickles-0.08.tar.gz ... OK
2011-09-02 16:31:18 [www.0] Configuring Pickles-0.08 ... N/A
2011-09-02 16:31:18 [www.0] ! Configure failed for Pickles-0.08. See /home/dotcloud/.cpanm/build.log for details.
2011-09-02 16:31:18 [www.0] ! Bailing out the installation for Ytnobody-Hello-0.01. Retry with --prompt or --force.
2011-09-02 16:31:20 [www.0] Reloading nginx configuration: nginx.
2011-09-02 16:31:24 [www.0] uwsgi: stopped
2011-09-02 16:31:24 [www.0] uwsgi: ERROR (abnormal termination)
2011-09-02 16:31:24 [www.0] The build finished successfully
2011-09-02 16:31:24 [api] Deploy finished

調査の仕方というかsshログインの仕方がわかったのでメモ。
$ dotcloud ssh [appname].[servicename]

で、$HOME/.cpanm/build.logを漁ってみたところ、疑問は氷解。

    * Module::Install::AuthorTests;
    * Module::Install::TestTarget;

こいつらが足りなかったので、

$ cpanm Module::Install::AuthorTests Module::Install::TestTarget

としてから再度PicklesベースのアプリをデプロイしてやればOKでした。