2011年06月05日

DotCloudでRuby on Rails

今流行りの開発者に優しい(開発に集中できる)PaaS環境であるDotCloudを使ってRuby on Railsを動かしてみました。

14)

同じようなサービスを提供しているAmazonのAWS Elastic Beanstalkだと無料とは言えませんが、DotCloudであれば’今のところ’無料です。

アカウントの作成


まず、dotcloudのトップページからアカウントを申請します。 

 41)

メールアドレスを登録後、しばらく待つと(僕の場合は1〜2日ぐらい)招待メールが届きます。

Our beta users have been using DotCloud to deploy the ideal stack for their web applications. They can forget about servers and focus on development: we take care of the rest.  Today we're excited to invite you to join the fun! Simply visit 
http://www.dotcloud.com/account/create 
 with the following invite code: *****.

指定されたinvite codeを持ってdotcloudに移動してアカウントを作成します。

BlogPaint

これでアカウントの作成は完了です。

52)


ローカル環境へのdotcloudインストール


ローカル環境に戻ったらpythonで動くdotcloud CLI(コマンド・ライン・インタフェース)をインストールします。僕のローカル環境はpython 2.6.1 on Mac OS X 10.6.7。

$ python -V
Python 2.6.1
 
$ sudo easy_install dotcloud
Best match: dotcloud 0.3.1 

インストールが終了したらdotcloudコマンドを実行してAPIキーを登録。

$ dotcloud
Warning: /Users/netbuffalo/.dotcloud/dotcloud.conf does not exist.
Enter your api key (You can find it at http://www.dotcloud.com/account/settings):

APIキーは表示されたリンク先にあるsettingメニューからコピーします。

BlogPaint

次にnamespaceの作成。うーん、特に思い付かないので僕はnetbuffaloで作成します。

$ dotcloud create netbuffalo

続いてサービス名を作成。サービス名=アプリケーション名ですね。これも思い付かないのでrubyにします(サンプルなのでsampleappが良かったかな・・)。

$ dotcloud deploy -t ruby netbuffalo.ruby
Created "netbuffalo.ruby".

netbuffalo$ dotcloud info netbuffalo.ruby
cluster: wolverine
config:
    rack-env: production
    ruby-version: 1.9.2
created_at: 1306912743.3679781
name: netbuffalo.ruby
namespace: netbuffalo 

ここまで来るとSSHで接続も出来ますね。

$ dotcloud ssh netbuffalo.ruby
# $SHELL
Warning: Permanently added '・・・・・' (RSA) to the list of known hosts.
 
dotcloud@netbuffalo-ruby:~$ free
             total       used       free     shared    buffers     cached
Mem:      35031888   34747400     284488          0    1414620   21500540
-/+ buffers/cache:   11832240   23199648
Swap:      1048572          0    1048572

dotcloud@netbuffalo-ruby:~$ top
top - 09:56:17 up 7 days,  1:33,  1 user,  load average: 0.02, 0.10, 0.11
Tasks:   4 total,   1 running,   3 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.2%us,  0.2%sy,  0.1%ni, 99.3%id,  0.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  35031888k total, 34753616k used,   278272k free,  1414632k buffers
Swap:  1048572k total,        0k used,  1048572k free, 21501208k cached

dotcloud@netbuffalo-ruby:~$ df -h
Filesystem            Size  Used Avail Use% Mounted on
rootfs                 99G   46G   49G  49% /
none                   99G   46G   49G  49% /
varrun                4.0M   28K  4.0M   1% /var/run
varlock               1.0M     0  1.0M   0% /var/lock
shm                    64M     0   64M   0% /dev/shm
 
dotcloud@netbuffalo-ruby:~$ pwd
/home/dotcloud
 
dotcloud@netbuffalo-ruby:~$ cat /proc/cpuinfo
processor     : 0
vendor_id     : GenuineIntel
cpu family     : 6
model          : 26
model name     : Intel(R) Xeon(R) CPU           X5550  @ 2.67GHz

メモリは35GB、ハードディスクは100GB見えますが1アカウントあたりの最低限の保証値はどれくらいなんでしょうね(それとも従量課金?)。ちなみにサーバはAmazon EC2上で動いているようです。


ローカル環境でRailsアプリケーションを作成


簡単なアプリケーション(myapp)を作成します。

$ rails myapp
 
$ ruby script/generate scaffold post title:string body:text published:boolean
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/posts
 
$rake db:migrate(データベースにはmysqlを利用)

特に意図は無いんですが、railsバージョンは2.3.5を使っています。
(3.x系を期待していた人、すみません)

 29)


DotCloud環境へのデプロイ


アプリケーションのデプロイ前にMySQL環境(netbuffalo.db)を構築します。

$ dotcloud deploy --type mysql netbuffalo.db
Created "netbuffalo.db".
 
$ dotcloud info netbuffalo.db
cluster: wolverine
config:
    mysql_password: *****
    mysql_serverid: -1
created_at: 1307065440.995131
・・・ 

構築したらdotcoludコマンドでMySQLにdotcloud info netbuffalo.dbで確認したパスワードで接続。

$ dotcloud run netbuffalo.db -- mysql -u root -p
# mysql -u root -p
Warning: Permanently added '・・・・・・' (RSA) to the list of known hosts.
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 40
Server version: 5.1.41-3ubuntu12.10 (Ubuntu)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
+--------------------+
2 rows in set (0.00 sec)

OSはUbuntuか、などと思いつつデータベースを作成。

mysql> create database netbuffalo character set utf8;
Query OK, 1 row affected (0.00 sec)

ここからはローカルにあるRailsアプリケーションの設定を変更。
まずは、RAILS_ROOT/config/database.ymlを編集します。

production:
  adapter: mysql
  database: netbuffalo
  host: db.netbuffalo.dotcloud.com
  port: ※$ dotcloud info netbuffalo.dbで確認した値
  username: root
  password: ※$ dotcloud info netbuffalo.dbで確認した値
  pool: 5
  timeout: 5000

このままだとDotCloud側の(ruby)に依存するgem(rails、ドライバなど)が無いので、RAILS_ROOTにGemfileを作成し、以下の記述を追加します。

source :rubygems
gem "rails", "2.3.5"
gem "mysql"

最後にRAILS_ROOT/config/boot.rbに以下の記述を追加します。

require 'yaml'
YAML::ENGINE.yamler= 'syck'

この記述を入れておかないと例外が発生します。

Error message:
couldn't parse YAML at line 17 column 14 (Psych::SyntaxError)
Exception class:
PhusionPassenger::UnknownError

DotCloud側に入っているbundlerのバージョンに関係しているようです。

dotcloud@netbuffalo-ruby:~$ gem list --local | grep bundler
bundler (1.0.10)

ここまで出来たらRailsアプリケーションをdotcloudコマンドでデプロイ(push)します。

$ dotcloud push netbuffalo.ruby myapp
# rsync
Pseudo-terminal will not be allocated because stdin is not a terminal.
・・・ 
Your bundle is complete! Use `bundle show [gemname]` to see where a bundled gem is installed.
nginx start/running, process 18683
Connection to ruby.netbuffalo.dotcloud.com closed. 

これでGemfileにリストしたgemもインストールされます。

初めてのデプロイであれば、sshで接続、db:migrateして、

dotcloud@netbuffalo-ruby:~$ cd current

dotcloud@netbuffalo-ruby:~/current$ rake db:migrate
rake/rdoctask is deprecated.  Use rdoc/task instead (in RDoc 2.4.2+)
==  CreatePosts: migrating ====================================================
-- create_table(:posts)
   -> 0.0038s
==  CreatePosts: migrated (0.0039s) ===========================================

http://ruby.netbuffalo.dotcloud.com/postsにアクセスすると、

20)

動きました!

 
使ってみた感想はVPSのようなインフラ・サービスよりも開発に集中出来て、Google App Engineよりも制約が少なくて使い易い、でした。 これで一般的な個人サイトが月1,000〜1,500円ぐらいで運用出来るなら(コストも含めて開発者に優しければ)前向きに考えますが、それ以上だと僕は国内のVPSで今のところ十分ですね。

そもそも開発に集中できるといっても、使う言語、ミドルウェアが数種類であれば今でもスクリプトやCapistranoのようなツールで自動化すれば良い訳ですし、多くの言語、多くのミドルウェアを使って、いざという時にはスケールしたい、という人でないとメリットを感じ無いかもしれません。





Googleを支える技術 ‾巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ)
西田 圭介 
技術評論社 
売り上げランキング: 31496

Posted by netbuffalo at 04:21│TrackBack(0)ruby | cloud


この記事へのトラックバックURL

http://trackback.blogsys.jp/livedoor/netbuffalo/3265809