Padrino+MySQL環境をAppFogに構築してみた

先日、cloudControlにPadrinoを構築してみました。
Padrino+MySQL環境をcloudControlに構築してみた - メモ的な思考的な


他にも良い環境がないかを探してみたところ、AppFogがありました。
AppFog - Platform as a Service for public clouds


PHPFogの後継のような感じなためかPHPの情報は出てくるのですが、Ruby関係の情報が少ない印象を受けました。
また、公式サイトにもRubySinatraRailsの情報はあるのですが、Padrinoに関しては記載がありませんでした。
そこで、実際にRuby(Padrino + MySQL)で構築できるかどうかを試してみました。
Ruby - AppFog Documentation



開発環境

cloudControlの時と同じです。ただし、bundle package を使うようなので、ローカルにもMySQLを入れる必要があります。
参考:Ruby - bundle package のはまりどころ - Qiita

AppFogのアカウント作成

AppFogの右上の「SIGN UP」よりアカウントを作成します。

Padrinoのプロジェクト作成

adapterにmysql2を指定する以外は、cloudControlの時と同じです。

padrino g project -a mysql2 -d activerecord -t rspec -s jquery -e haml -c sass -b

ローカルのMySQL作成

apt-getで持ってきます。ローカル開発ということもあり、パスワードは特に設定しません。

sudo apt-get install mysql-server libmysqlclient-dev libmysql-ruby

ローカルのMySQLに、databaseを作成

Padrinoから扱うためのdatabaseを作成します。database名はpadrinoで自動生成するものと合わせました。
参考:Ubuntu 12.04 LTS - MySQL - インストール : Server World

mysql -u root
create database _development default character set utf8;


念のため、作成されたことを確認し、終了します。

show databases;
quit

config/database.rb を修正

ローカルのMySQLに合わせ、内容を修正します (特に、socketの値が正しくない)。
参考:/tmp/mysql.sockなんて知らんがな - 自分の仕事を憎むには人生は余りにも短い

ActiveRecord::Base.configurations[:development] = {
  :adapter   => 'mysql2',
  :encoding  => 'utf8',
  :reconnect => true,
  :database  => '<your app>_development',
  :pool      => 5,
  :username  => 'root',
  :password  => '',
  :host      => 'localhost',

  #:socket    => '/tmp/mysql.sock'
  socket:    '/var/run/mysqld/mysqld.sock'
}

ローカルの管理画面を作成

padrino g admin
bundle install
padrino rake ar:migrate
padrino rake seed


念のため、起動して、「http://localhost:3000/admin」の動作を確認します。

padrino s

アプリをAppFogへデプロイ

必要なツールのインストール

af、および、caldecott (MySQLへつなぐ時に必要) をインストールしておきます。
参考:

sudo gem install af
sudo gem install caldecott

デプロイの流れ

ログインします。

af login


ランタイムを指定して、アプリをデプロイします (ランタイムを指定しない場合、Rubyの1.8.7が使われるようです。)。
参考:Ruby - AppFog Documentation


コマンド入力後にいくつか質問が出るので、順番に入力していきます (太字が入力内容)

af push --runtime ruby193

Would you like to deploy from the current directory? [Yn]:
y


Detected a Rack Application, is this correct? [Yn]:
y


1: AWS US East - Virginia
2: AWS EU West - Ireland
3: AWS Asia SE - Singapore
4: Rackspace AZ 1 - Dallas
5: HP AZ 2 - Las Vegas
Select Infrastructure:
1
# お好みのインフラを選択すれば良いかと思います


Application Deployed URL [.aws.af.cm]:
(Enter)


Memory reservation (128M, 256M, 512M, 1G, 2G) [128M]:
(Enter)
# あとで変更は可能です


How many instances? [1]:
(Enter)
# 同じく、あとで変更は可能です


Create services to bind to ''? [yN]:
y
# MySQLのサービスを使います


1: mongodb
2: mysql
3: postgresql
4: rabbitmq
5: redis
What kind of service?:
2
# 今回はMySQLを使います


Specify the name of the service [mysql-<値>]:
(Enter)
# サービス名の変更があれば、編集します


Create another? [yN]:
n
# これ以上は使用しません


Would you like to save this configuration? [yN]:
y
# 保存しておきます


# 以下が表示されればOK
Manifest written to manifest.yml.
Creating Application: OK
Creating Service [mysql-<値>]: OK
Binding Service [mysql-<値>]: OK
Uploading Application:
Checking for available resources: OK
Processing resources: OK
Packing application: OK
Uploading (222K): OK
Push Status: OK

Staging Application '': OK

Starting Application '': OK

AppFogのMySQLをマイグレート

ここまでではAppFog上のMySQLのDatabaseが作成されていないため、マイグレートを行います。
参考:Rails - AppFog Documentation


上記で作成したMySQLのサービスにつなぎます。

af tunnel mysql-<値>


以下のような値が表示されます。production環境のMySQL接続情報であるため、コピーしておきます。

Service connection info:
username :
password :
name :
infra : aws

Starting tunnel to mysql-<値> on port 10000.


操作方法を聞かれたら、Padrinoで操作するため、1を選択します。

1: none
2: mysql
3: mysqldump
Which client would you like to start?:

1


上記でコピーしておいたproduction環境の設定を行います。
config/database.rb

ActiveRecord::Base.configurations[:production] = {
  :adapter   => 'mysql2',
  :encoding  => 'utf8',
  :reconnect => true,
  
  #:database  => '<your app>_production',
  database: '<name>',
  
  :pool      => 5,
  
  #:username  => 'root',
  username: '<username>',
  
  #:password  => '',
  password: '<password>',

  #:host      => 'localhost',
  host: '127.0.0.1',

  #:socket    => '/tmp/mysql.sock'
  port: 10000
}

マイグレートします(エラーが出る場合、少し待てばできるようになるかもしれません)。
また、環境指定するため、PADRINO_ENVを使います。
参考:Padrinoで追加したRakeタスクをProduction環境として実行する - テノニッキ (@hideack 's diary)

PADRINO_ENV=production padrino rake ar:migrate

=> Executing Rake ar:migrate ...
== CreateAccounts: migrating =================================================

    • create_table(:accounts)

-> 2.4502s
== CreateAccounts: migrated (2.4503s) ========================================

seedでデータを投入しておきます(エラーが出る場合、少し待てばできるようになるかもしれません)。

PADRINO_ENV=production padrino rake seed


AppFogへ反映させるため、アプリのアップデートを行います。

af update --runtime ruby193

最後にアクセスして、動作を確認します。
http://.aws.af.cm/admin/




使ってみての感想としては、以下の通りです。

  • AppFogの管理画面を見るとGUIが充実していた (cloudControlより分かりやすそう)。
  • アドオンはいろいろとある。独自ドメインとかメール関連とかもあり。
  • 無料枠であっても、リソースの配分が行えるのがありがたい。
  • アプリのログはどこで見れば...


AppFogも個人的に使う分にはいろいろとできそうですので、引き続き触っていきたいと思います。