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

同じようなサービスを提供しているAmazonのAWS Elastic Beanstalkだと無料とは言えませんが、DotCloudであれば’今のところ’無料です。
まず、dotcloudのトップページからアカウントを申請します。

メールアドレスを登録後、しばらく待つと(僕の場合は1〜2日ぐらい)招待メールが届きます。
指定されたinvite codeを持ってdotcloudに移動してアカウントを作成します。

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

ローカル環境に戻ったらpythonで動くdotcloud CLI(コマンド・ライン・インタフェース)をインストールします。僕のローカル環境はpython 2.6.1 on Mac OS X 10.6.7。
インストールが終了したらdotcloudコマンドを実行してAPIキーを登録。
APIキーは表示されたリンク先にあるsettingメニューからコピーします。

次にnamespaceの作成。うーん、特に思い付かないので僕はnetbuffaloで作成します。
続いてサービス名を作成。サービス名=アプリケーション名ですね。これも思い付かないのでrubyにします(サンプルなのでsampleappが良かったかな・・)。
ここまで来るとSSHで接続も出来ますね。
メモリは35GB、ハードディスクは100GB見えますが1アカウントあたりの最低限の保証値はどれくらいなんでしょうね(それとも従量課金?)。ちなみにサーバはAmazon EC2上で動いているようです。
簡単なアプリケーション(myapp)を作成します。
特に意図は無いんですが、railsバージョンは2.3.5を使っています。
(3.x系を期待していた人、すみません)
アプリケーションのデプロイ前にMySQL環境(netbuffalo.db)を構築します。
構築したらdotcoludコマンドでMySQLにdotcloud info netbuffalo.dbで確認したパスワードで接続。
OSはUbuntuか、などと思いつつデータベースを作成。
ここからはローカルにあるRailsアプリケーションの設定を変更。
まずは、RAILS_ROOT/config/database.ymlを編集します。
このままだとDotCloud側の(ruby)に依存するgem(rails、ドライバなど)が無いので、RAILS_ROOTにGemfileを作成し、以下の記述を追加します。
最後にRAILS_ROOT/config/boot.rbに以下の記述を追加します。
この記述を入れておかないと例外が発生します。
Error message: couldn't parse YAML at line 17 column 14 (Psych::SyntaxError) Exception class: PhusionPassenger::UnknownError
DotCloud側に入っているbundlerのバージョンに関係しているようです。
ここまで出来たらRailsアプリケーションをdotcloudコマンドでデプロイ(push)します。
そもそも開発に集中できるといっても、使う言語、ミドルウェアが数種類であれば今でもスクリプトやCapistranoのようなツールで自動化すれば良い訳ですし、多くの言語、多くのミドルウェアを使って、いざという時にはスケールしたい、という人でないとメリットを感じ無いかもしれません。
同じようなサービスを提供しているAmazonのAWS Elastic Beanstalkだと無料とは言えませんが、DotCloudであれば’今のところ’無料です。
アカウントの作成
まず、dotcloudのトップページからアカウントを申請します。
メールアドレスを登録後、しばらく待つと(僕の場合は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/createwith the following invite code: *****.
指定されたinvite codeを持ってdotcloudに移動してアカウントを作成します。
これでアカウントの作成は完了です。
ローカル環境へのdotcloudインストール
ローカル環境に戻ったらpythonで動くdotcloud CLI(コマンド・ライン・インタフェース)をインストールします。僕のローカル環境はpython 2.6.1 on Mac OS X 10.6.7。
$ python -VPython 2.6.1
$ sudo easy_install dotcloudReading http://www.dotcloud.comReading http://www.dotcloud.com/Best match: dotcloud 0.3.1
インストールが終了したらdotcloudコマンドを実行してAPIキーを登録。
$ dotcloudWarning: /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メニューからコピーします。
次にnamespaceの作成。うーん、特に思い付かないので僕はnetbuffaloで作成します。
$ dotcloud create netbuffalo
続いてサービス名を作成。サービス名=アプリケーション名ですね。これも思い付かないのでrubyにします(サンプルなのでsampleappが良かったかな・・)。
$ dotcloud deploy -t ruby netbuffalo.rubyCreated "netbuffalo.ruby".
netbuffalo$ dotcloud info netbuffalo.rubycluster: wolverineconfig:rack-env: productionruby-version: 1.9.2created_at: 1306912743.3679781name: netbuffalo.rubynamespace: netbuffalo
ここまで来るとSSHで接続も出来ますね。
$ dotcloud ssh netbuffalo.ruby# $SHELLWarning: Permanently added '・・・・・' (RSA) to the list of known hosts.
dotcloud@netbuffalo-ruby:~$ freetotal used free shared buffers cachedMem: 35031888 34747400 284488 0 1414620 21500540-/+ buffers/cache: 11832240 23199648Swap: 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.11Tasks: 4 total, 1 running, 3 sleeping, 0 stopped, 0 zombieCpu(s): 0.2%us, 0.2%sy, 0.1%ni, 99.3%id, 0.2%wa, 0.0%hi, 0.0%si, 0.0%stMem: 35031888k total, 34753616k used, 278272k free, 1414632k buffersSwap: 1048572k total, 0k used, 1048572k free, 21501208k cacheddotcloud@netbuffalo-ruby:~$ df -hFilesystem Size Used Avail Use% Mounted onrootfs 99G 46G 49G 49% /none 99G 46G 49G 49% /varrun 4.0M 28K 4.0M 1% /var/runvarlock 1.0M 0 1.0M 0% /var/lockshm 64M 0 64M 0% /dev/shm
dotcloud@netbuffalo-ruby:~$ pwd/home/dotcloud
dotcloud@netbuffalo-ruby:~$ cat /proc/cpuinfoprocessor : 0vendor_id : GenuineIntelcpu family : 6model : 26model 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:booleanexists app/models/exists app/controllers/exists app/helpers/create app/views/posts$rake db:migrate(データベースにはmysqlを利用)
特に意図は無いんですが、railsバージョンは2.3.5を使っています。
(3.x系を期待していた人、すみません)
DotCloud環境へのデプロイ
アプリケーションのデプロイ前にMySQL環境(netbuffalo.db)を構築します。
$ dotcloud deploy --type mysql netbuffalo.dbCreated "netbuffalo.db".$ dotcloud info netbuffalo.db
cluster: wolverineconfig:mysql_password: *****mysql_serverid: -1created_at: 1307065440.995131
・・・
構築したらdotcoludコマンドでMySQLにdotcloud info netbuffalo.dbで確認したパスワードで接続。
$ dotcloud run netbuffalo.db -- mysql -u root -p# mysql -u root -pWarning: 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 40Server 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: mysqldatabase: netbuffalohost: db.netbuffalo.dotcloud.comport: ※$ dotcloud info netbuffalo.dbで確認した値username: rootpassword: ※$ dotcloud info netbuffalo.dbで確認した値pool: 5timeout: 5000
このままだとDotCloud側の(ruby)に依存するgem(rails、ドライバなど)が無いので、RAILS_ROOTにGemfileを作成し、以下の記述を追加します。
source :rubygemsgem "rails", "2.3.5"gem "mysql"
最後にRAILS_ROOT/config/boot.rbに以下の記述を追加します。
require 'yaml' YAML::ENGINE.yamler= 'syck'
この記述を入れておかないと例外が発生します。
DotCloud側に入っているbundlerのバージョンに関係しているようです。
dotcloud@netbuffalo-ruby:~$ gem list --local | grep bundlerbundler (1.0.10)
ここまで出来たらRailsアプリケーションをdotcloudコマンドでデプロイ(push)します。
$ dotcloud push netbuffalo.ruby myapp# upload myapp ssh://dotcloud@uploader.dotcloud.com# rsyncPseudo-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 18683Connection to ruby.netbuffalo.dotcloud.com closed.
これでGemfileにリストしたgemもインストールされます。
初めてのデプロイであれば、sshで接続、db:migrateして、
http://ruby.netbuffalo.dotcloud.com/postsにアクセスすると、

動きました!
使ってみた感想はVPSのようなインフラ・サービスよりも開発に集中出来て、Google App Engineよりも制約が少なくて使い易い、でした。 これで一般的な個人サイトが月1,000〜1,500円ぐらいで運用出来るなら(コストも含めて開発者に優しければ)前向きに考えますが、それ以上だと僕は国内のVPSで今のところ十分ですね。
初めてのデプロイであれば、sshで接続、db:migrateして、
dotcloud@netbuffalo-ruby:~$ cd current
dotcloud@netbuffalo-ruby:~/current$ rake db:migraterake/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にアクセスすると、
動きました!
使ってみた感想はVPSのようなインフラ・サービスよりも開発に集中出来て、Google App Engineよりも制約が少なくて使い易い、でした。 これで一般的な個人サイトが月1,000〜1,500円ぐらいで運用出来るなら(コストも含めて開発者に優しければ)前向きに考えますが、それ以上だと僕は国内のVPSで今のところ十分ですね。
そもそも開発に集中できるといっても、使う言語、ミドルウェアが数種類であれば今でもスクリプトやCapistranoのようなツールで自動化すれば良い訳ですし、多くの言語、多くのミドルウェアを使って、いざという時にはスケールしたい、という人でないとメリットを感じ無いかもしれません。
クラウド大全 第2版 サービス詳細から基盤技術まで
posted with amazlet at 11.06.05
日経BP社出版局
日経BP社
売り上げランキング: 26328
日経BP社
売り上げランキング: 26328
[Web開発者のための]大規模サービス技術入門 ―データ構造、メモリ、OS、DB、サーバ/インフラ (WEB+DB PRESS plusシリーズ)
posted with amazlet at 11.06.05
伊藤 直也 田中 慎司
技術評論社
売り上げランキング: 3971
技術評論社
売り上げランキング: 3971
Googleを支える技術 ‾巨大システムの内側の世界 (WEB+DB PRESSプラスシリーズ)
posted with amazlet at 11.06.05
西田 圭介
技術評論社
売り上げランキング: 31496
技術評論社
売り上げランキング: 31496
[24時間365日] サーバ/インフラを支える技術 ‾スケーラビリティ、ハイパフォーマンス、省力運用 (WEB+DB PRESS plusシリーズ)
posted with amazlet at 11.06.05
安井 真伸 横川 和哉 ひろせ まさあき 伊藤 直也 田中 慎司 勝見 祐己
技術評論社
売り上げランキング: 8586
技術評論社
売り上げランキング: 8586
この記事へのトラックバックURL
http://trackback.blogsys.jp/livedoor/netbuffalo/3265809