Ruby on Rails 3.2 をDotCloudに導入しよう MySQL編 (3) | IT悶々日記

IT悶々日記

IT業界で悶々と奮闘するコンサルタント兼エンジニアの日記

MySQLを使ったRailsアプリをDotCloudにデプロイする手順を紹介しております。
必要となる3つの手順のうち、前回までは、以下の2つを行いました。

1. DotCloud上にMySQLサービスを立ち上げる
2. ローカルPC上でRailsのMySQL接続の設定を行いデータフェッチ/ストアを行うアプリを作成する

最後は2で作成したRailsアプリをDotCloudにデプロイします。
こちらも簡単ですので、何ら臆することはありません。
最初にDotCloudのMySQLに繋いで、新規にデータベースを作成します。
ここでもデータベースのみ作成すればよく、テーブルの作成などは全てScaffoldがやってくれます。

dotcloud infoコマンドを使ってCloud MySQLのパスワードと接続ホスト/ポートを確認します。

#dotcloud info kazoku.db
...
config:
mysql_masterslave: true
mysql_password: xxxxxxxxx <---パスワード
...
ports:
...
- name: mysql
url: mysql://root:xxxxxxxxx@yyyyyyy.dotcloud.com:NNNNN <---ホスト:ポート

パスワードと接続ホスト/ポートが分かった所で、
sshでDotCloudに接続してからMySQLにログインすることもできますが、
今回はPC端末からDotCloudのMySQLに直接繋いでしまいましょう。

# mysql -uroot -pxxxxxxx -hyyyyyy.dotcloud.com -PNNNNN
...
mysql>

オプションが長いですが、これでMySQLに接続できます。
それでは早速データベースの作成です。

mysql>create database kazoku default character set utf8;
Query OK, 1 row affected (0.19 sec)


データベースを作成し終えてたら、次はRailsのMySQL接続設定です。
2.でローカルPCのMySQL接続設定をしたconfig/database.ymlに
DotCloud MySQLの接続設定を追加します。
2では"development"セクションでしたが、今回は"production"セクションです。
先ほど調べたパスワードとホスト/ポートを設定します。

<config/database.yml>
production:
adapter: mysql2
encoding: utf8
reconnect: false
database: kazoku
pool: 5
username: root
password: xxxxxxxxxx
host: yyyyyyy.dotcloud.com
port: NNNNN

DotCloudはサービス毎にインスタンスが異なります。
つまり、rubyのアプリケーションサーバであるwwwサービスと、
MySQLサーバのあるdbサービスでは稼働するインスタンスが異なるため、
Socket接続ではなく、TCP接続の形式で、MySQL接続情報を記述しましょう。

それではDotCloudにデプロイしましょう。

# dotcloud push kazoku

デプロイログの中に、mysql2のgemインストールのログが出力されました。
ちゃんと認識されていて安心できます。
...02:59:51 [www] Installing mysql2 (0.3.11) with native extensions


最後に、Scaffoldで作成したUserテーブルをMySQLに作成します。
sshでDotCloudにログインして、rakeコマンドを実行しましょう。

#dotcloud ssh kazoku.www
~$ cd code/{approot}
~$ rake db:migrate
== CreateUsers: migrating
-- create_table(:users)
-> 0.0724s
...

Userテーブルの作成が終わり、
DotCloudにデータフェッチ/ストアのアプリがデプロイされました。
それでは yyyyyyyy.dotcloud.com/usersにアクセスしてみましょう。

うまくいくはず、、と思ってアクセスしたら

We're sorry, but something went wrong

と500エラー画面が表示されてしまいました。
ログを見ると以下のメッセージが出力されていました。
==> /opt/nginx/logs/error.log <==
cache: [GET /users] miss

ただ、原因となるようなメッセージは出力されていません。
ローカルPC環境ではうまくいっているのに...

次回、この原因を探り解決したいと思います。

(続く)