Kentaro Kuribayashi's blog

Software Engineering, Management, Books, and Daily Journal.

dotcloudで遊んでみた

あのmiyagawaさんがjoinし、PerlをサポートするようになったPaaSとして大注目のdotcloudのinvite codeをいただいたので、早速遊んでみました。

まあ普通の一行掲示板みたいなものなので特になにもいうことはないのですが、一応メモ。Perlでdotcloudの導入の一般的な話については、以下のエントリを参照ください。

前提

Dancerのconfig

use Dancer ':syntax';
config->{foo}{bar};

とすると$APP_ROOT/environments/から環境変数を見て設定ファイルをロードします。dotcloudのインスタンス上では、PLACK_ENVがdeploymentと設定されているので、開発用はdevelopment.yml、本番用はdeployment.ymlなどとしておくとよさそう。

Redis

これはdotcloudに限ったことではないけれども、一応。foo.redisというserviceがあるとして、本番のredisサーバはパスワードを使ってアクセスすることになるので、

dotcloud info foo.redis

すると表示されるurl/パスワードなどを、たとえば上記configのところで述べた設定ファイル(本番用ならdeployment.yml)に書いておきます。

redis:
  server: redis.foo.dotcloud.com:3298
  password: *****************
  debug: 0
  encoding: utf8

んでもって、Redisに接続した際に、他のコマンドを発行する前に、以下のような感じでauthコマンドでパスワードを送ってやるといいようです。

my $redis = Redis->new(%{config->{redis}});

if (config->{redis}{password}) {
    $redis->auth(config->{redis}{password});
}

Twitter OAuth

上記のアプリではTwitterのOAuthを使っていますが、Dancer::Plugin::Auth::Twitterを使えば簡単にできます。

上記プラグインはDancer::Sessionによってセッション管理をしているのですが、セッションのbackendとしてDancer::Session::Cookieを使うと、様々な情報をencryptした状態でcookieに保存し、レスポンスヘッダが長過ぎるかなんかで、アプリとproxyの間のやり取りでエラーが起こってしまうので、別のsession backendを使う方がよさそう。とりあえず、Dancer::Session::YAMLだとうまくいきました。Memcached使いたい!

自分のドメインで使う

上記ではnow.kentarok.orgというURLを示しましたが、実際はnow.kentaro.dotcloud.comというURLで、dotcloud aliasコマンドを実行することでaliasをふって後述の設定により自分のドメインで運用できるようにしています。

now.kentaro.doctcloud.comでもいいのですが、僕はkentarok.orgというドメインを使っているので、それを使いたい。その場合FAQにあるように、以下のようにしてaliasを作成します。

$ dotcloud alias add kentaro.now now.kentarok.org
Ok. Now please add the following DNS record:
now.kentarok.org. IN CNAME gateway.dotcloud.com.

あとは、DNSのCNAMEの設定を行うだけです。僕の場合はvalud-domainでkentarok.orgというドメインを運用しているので、now.kentarok.orgでdotcloudのアプリを指すよう、以下の画像のような行を追加しました。

f:id:antipop:20110501145915p:image

デバッグ

ローカルでは動くのに本番にdeployしたら動かない……。そんな場合は:

  • Makefile.PLに依存モジュールをちゃんと全部書いてるか見てみましょう
    • 何を書いてないか調べるのがだるかったので、dotcloud ssh foo.barして、実際にdeployされてるディレクトリにcdし、そこでplackupを実行してCan't locate〜なモジュールを抜いたりしました……。
  • Module::Installを使ってMakefile.PLを書いている場合は、inc/ディレクトリもdeployされるようにしなければなりません(gitを使ってるならinc/もcommitする)
  • dotcloud logs foo.barで、本番環境のログをtail -fできるので、それ見てがんばる。
  • 関係ないけど、dotcloud run foo.bar -- ls -laみたいにして、任意のコマンドを実行できるよ

デプロイとリポジトリ

dotcloud pushコマンドは、第2引数で指定したディレクトリに、

  • .gitディレクトリがあったらgitリポジトリとみなしてgit pushと同様の動きをする
  • なかったらそこにあるファイルを全部アップロードする

というような動きをするみたい。

  • gitを使って、githubでソースを管理したい
  • しかし、environments/*.ymlのようなファイルは公開したくない

という場合、普通に.gitignoreにenviroments/*.ymlをいれときゃいいじゃんと思いきや、そうしてしまうとdotcloud pushでenvironments/*.ymlがpushされない(git pushなのであたりまえ)ので困る。

そこで、id:tokuhiromさんが最近作ったDaikuを使って

  1. 普通にdotcloud push kentaro.now .
  2. あらかじめ$HOME/etc/kentaro.now/deployment.ymlにおいた設定ファイルにenvironments/deployment.ymlというシンボリックリンクを張る

というtaskを定義してみた。

あらかじめ本番用設定ファイルを$HOME/etcに置く手間がかかるけど、ソースをgithubにおきつつ、秘密のファイルを.gitignoreで守りつつ、dotcloudにもちゃんとdeployできるようになった。手間については、deployment.ymlを更新するtaskを定義してやれば済む話なので、まあどうにかなることではありそう。

ただし、上記の方法はバッドノウハウっぽい感じがするので、以下のようにmiyagawaさんがおっしゃっているので、期待して待つことにいたしましょう。

デプロイの件追記

というわけで、deploy時にスクリプトを実行する仕組みがあるので、シンボリックリンクを張る件は以下のようなスクリプトを置いておくだけでオッケーだった。

dotcloudコマンドを使わずにsshする

dotcloudコマンドは$HOME/.dotcloudに設定ファイルとSSHの秘密鍵を置いています。その鍵を利用するとdotcloud sshコマンドを使わずに、普通にsshできます。こんな感じ(ポート番号が全員共通かはしらない):

$ ssh dotcloud@now.kentaro.dotcloud.com -p 3330 -i ~/.dotcloud/dotcloud.key

scpもできるので、プロジェクト管理下にないファイルとかでもアップロードできて便利ですね。

$ scp -P 3330 -i ~/.dotcloud/dotcloud.key hoge.txt dotcloud@now.kentaro.dotcloud.com:/home/dotcloud/