IT悶々日記

IT悶々日記

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

Amebaでブログを始めよう!
基本的には

http://docs.dotcloud.com/guides/s3fs/

通りにやればできるのですが、罠がいくつか。

・以下の2ファイルはdotcloud.ymlで記載されたapproot直下に置いてください。
 chmod +xで実行許可を付与することも忘れないで。
run.s3fs
s3fs

・環境変数設定では、以下の4つの変数設定をします。
S3FS_BUCKET                  →バケット名(s3で設定したもの)
S3FS_MOUNTPOINT         →ご自由に。(最初は分かりやすく/home/dotcloud/storeがいいと思う)
S3FS_ACCESSKEY           →AWSのsecurity credentialsに記載されたアクセスキーID
S3FS_SECRETKEY           →AWSのsecurity credentialsに記載されたシークレットアクセスキー

それで以下のコマンドを打って設定するんだけど、
なぜか"yourappname"が見つかりませんってエラーがでてしまう。
dotcloud var set yourappname \
           S3FS_BUCKET=yourbucketname \
           S3FS_MOUNTPOINT=/home/dotcloud/store \
           S3FS_ACCESSKEY=AKI1234567ABCDEFGHIJ \
           S3FS_SECRETKEY=abcdefghij1234567890ABCDEFGHIJ+987654321

愚直に並べたら上手くいった。ちなみに、yourappnameは、サービス名じゃなくアプリケーション名。
つまり、"myapp.www","myapp.db"とかの"myapp"の部分。
dotcloud var set yourappname S3FS_BUCKET=yourbucketname
dotcloud var set yourappname S3FS_MOUNTPOINT=/home/dotcloud/store
dotcloud var set yourappname S3FS_ACCESSKEY=AKI1234567ABCDEFGHIJ
dotcloud var set yourappname S3FS_SECRETKEY=abcdefghij1234567890ABCDEFGHIJ+987654321

っで、うまく行くと思ったんだけど、うまくいかない。なぜかは引き続き。。。



プチトピック:DotCloud標準のs3fsバイナリは、バケッツ名にアメリカS3で使用できる大文字が使えない。

ターミナルをzshで使っているのですが、Aptanaの標準ターミナルばbashらしく、PATHが通ってなくてうまくrailsを起動できない問題が発生しました。Apatanaはまず最初に.aptanarcを見に行くとのことで、ここに書いてある通りなんですが、自分のホームディレクトリに.aptanarcのファイル名で#!/bin/zshsource ~/.zshrcと書いておくことで、.zshrcを読み込んでくれます。これでrailsがちゃんと起動しました。ちっちゃなところほどハマりやすいな。
Rails開発効率化のために、統合開発環境(IDE)を入れようということになり、
いくつかの候補の中から、Aptanaを選択しました。

で早速Aptana Studio3をダウンロードしてインストール。
調べたらAptana Studio3には標準でRadRailsは入っているので、他に必要なものは日本語化くらいですか。

http://www.aptana.com/products/studio3/download

続いて日本語化を行います。Eclipse日本語化プラグインの導入です。
以下のサイトに詳しく書かれているので、そちらを参照してください。

http://www.tinybeans.net/blog/2009/01/30-132009.html

ハマりそうな所は特になく、唯一の注意点は
日本語化プラグインを提供しているサイトが激重なことくらいでしょうか。

さて、前回まではMySQLに接続するRailsアプリをDotCloudにデプロイするところまでやりました。
デプロイ後にユーザ情報を取得する画面(/users)に
アクセスしたところ、500エラー画面が表示されてしまいました。
ログには目立ったメッセージは出力されていません。

今回はこのエラーへの対応を記述します。
まずは500エラーとなっている原因がログに出力されなければ話になりません。
Railsの細かい挙動はまだ理解しきれてないので、
開発(development)と同じようにログを出力させようということで、

#cd config/environments/
#cp production.rb production.rb.org
#cp development.rb production.rb
#dotcloud push kazoku

と本番設定を開発設定で上書いちゃいましょう。(もちろんバックアップは取ったうえで、ね)
dotcloudにpushして確認すると、JavaScript Runtimeが見つからないというエラーが。

ググったら同じところで躓いた人たちと解決方法を発見。
http://d.hatena.ne.jp/tetsuyai/20110920/1316487020

Gemfileに以下のGemを読み込ませるようにしたところ、
無事解決いたしました。

gem 'execjs'
gem 'therubyracer'

サーバサイドJavaScriptのRuntimeが必要なんですねー。
え、なんで?って思いますが、とりあえずエラーが解決できてよかった。

Railsでは'execjs'と'therubyracer'を必ず読み込むこと。
これ鉄則ですねー。(最初からGemfileに書いておいてくれればいいのに。。)

p.s. 上書きしちゃったproduction.rbは後で前のに直しておきましたとさ。

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環境ではうまくいっているのに...

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

(続く)

前回はdotcloud.ymlにMySQLの設定をして、DotCloudの上にMySQLサーバを稼働させました。

今回は、これまでに作ったRailsアプリ(kazoku)を改修して、
MySQLにデータをフェッチ/ストアできるようにしてみましょう。
といっても、DB構造の定義やCRUDのコントローラ/viewの作成など、
必要となるパーツはほとんどScaffoldというツール自動で作ってくれるので楽チンなのです。

* Scaffoldは「基礎」という意味を持つ、Webアプリの雛形を自動で作成するツールのこと。
  「絞首刑台」のような意味もあり、なんとも物騒な名前ですが、大変便利な人に優しいツールです。

何はともあれデータベースがなければ始まりません。
ローカル端末にMySQLをインストールしたら、
create databaseコマンドでデータベース"kazoku"を作成します。
文字コードは特に指定がなければutf-8で設定されます。

#mysql -uroot -pxxxxx
mysql> create database kazoku

データベース作成が終わったら、
次はRailsからMySQLのkazokuデータベースに接続できるよう設定を変更します。
(このあたりはrailsアプリを作成するときに"-d mysql"をオプション指定することで省略できるのですが、
今回は勉強も兼ねてデフォルトのsqlite3設定からマニュアルで変更してみたいと思います。)

・MySQLクライアントのGemの読み込み
デフォルトではsqlite3のGemを読み込む設定となっていますが、
MySQLクライアントのGemを読み込むように変更します。
approotのGemfileにて、以下の記述を修正してmysql2を読み込みます。

[修正前]gem 'sqlite3'

[修正後]gem 'mysql2'


・データベース接続設定
次はデータベースへの接続設定を行います。
データベース名や接続ユーザ名など接続に必要な情報はconfig/database.ymlに記述されています。
この設定ファイルの"development"セクションを以下の記述に修正します。

development:
adapter: mysql2
encoding: utf8
reconnect: false
database: kazoku
pool: 5
username: root
password: xxxxxxxx
socket: /tmp/mysql.sock <--TCP接続の場合はホスト名:ポートを記載

上の2ファイルの修正により、RailsアプリからMySQLに接続できるようになりました。

さて、MySQLにデータをフェッチ/ストアするアプリとして、
ユーザ情報を登録/閲覧する簡易アプリを作成することにしましょう。

最初にやることはUser論理モデルを定義することです。
ユーザは、ID、名前、メールアドレスをメンバに持つモデルとしました。
いよいよここでScaffoldの出番です。メンバの定義をモデル名"user"の後に列挙します。

# script/rails generate scaffold user id:integer name:string email:string
.. invoke active_record
.. create db/migrate/20120128142558_create_users.rb
...

上のコマンドを実行することで、Userモデルのみならず、
UserデータをCRUDするコントローラ、ビューも自動で作成してくれるのです。
さらに次のコマンドで、先ほど作成したMySQLデータベースに
Userテーブルを自動で作成してくれます。すんげぇ楽チン。

# rake migrate:db
== CreateUsers: migrating -- create_table(:users)
-> 0.1040s
== CreateUsers: migrated (0.1042s)


テーブルが作成されたかMySQLから確認してみます。

mysql> desc users;
+------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| email | varchar(255) | YES | | NULL | |
| created_at | datetime | NO | | NULL | |
| updated_at | datetime | NO | | NULL | |
+------------+--------------+------+-----+---------+----------------+
5 rows in set (0.05 sec)

idカラムは自動的にPRIMARY KEYとして設定され、auto increment属性も付与されていました。
created_at, updated_atの両カラムも自動的に追加されていますねー。


これで準備は整いましたね。
さっそくテストサーバを立ち上げて以下のURLにアクセスしてみましょう。
CRUDの機能が実装されていることが確認できます。(usersと複数形になっていることに注意)

http://localhost:3000/users

どんなけRails楽なんですか、、、
数年前にPerlのCatalystをゴリゴリ触ってましたがここまで楽じゃなかったよ。
かゆいところに手が届きすぎてます。

ということで次回、このアプリをDotCloudにデプロイしてみましょう。

(続く)

前回は、RailsのバニラアプリをDotCloudにデプロイするところまでをやりました。
次はMySQLをつかったアプリケーションをDotCloudにデプロイすることにチャンレンジしましょう。
そのための手順として、3つのことを行う必要があります。

1. DotCloudにMySQLサーバを稼働させます
2. MySQLとデータフェッチ/ストアを行うアプリを作成
3. DotCloudにアプリをデプロイして動作確認

まずは1から始めましょう。
dotcloud.ymlにdbサービスを追加し、タイプにMySQLを指定します。

#vi dotcloud.yml
<dotcloud.yml>
www:
type: ruby
approot: kazokuapp
db:
type: mysql


あとは、、、DotCloudにプッシュするだけです!!

#dotcloud push kazoku
...
14:02:13 ---> Initializing new services... (This may take a few minutes)
14:02:13 [db.0] Initializing...
14:02:25 [db.0] Service initialized
14:02:25 ---> All services have been initialized. Deploying code...
...
14:02:47 ---> Deploy finished


本当にこれだけでMySQLサービスが稼働し始めました。
デプロイのメッセージで、db.0としてMySQLサービスが初期化されているのがわかります。
簡単すぐるDotCloud。恐るべし。。。

それでは早速、MySQLにつないでみましょう。
sshでkazoku.dbサービスに接続した上でmysqlコマンドで接続します。
が、その前にまずはMySQLのrootのパスワードを確認します。

# dotcloud info kazoku.db
config:
mysql_masterslave: true
mysql_password: xxxxxxxxxxxxx <----これがパスワードです
created_at: xxxxxxx
datacenter: Amazon-us-east-1d
...

Amazonの東海岸のデータセンターに格納されているようです。
(wwwサービスはインスタンスは別なんでしょうか。。。)
パスワードをメモったらMySQLに接続しましょう。

# dotcloud ssh kazoku.db <---sshで接続
# $SHELL
mysql@kazoku-default-db-0:~$ mysql -uroot -pxxxxxxxxx <---mysqlコマンドで接続
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 34
Server version: 5.1.41-3ubuntu12.10-log (Ubuntu)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

おおお、接続できました!!!
Ubuntu OS上のMySQL 5.1ですね。
my.cnfなどの設定は後回しにして、まずはMySQLの稼働が完了です。


次はMySQLを使ったRailsアプリの作成に進みましょう。

(続く)

前回はMac leopardにRuby on Rails 3.2.0をインストールするところまで進めました。
Invalid gemspec...の大量エラーが発生していたけど、
その後 ruby自体のアップデート、gemのアップデートを行うことで、
jquery-rails-1.0.19以外のエラーは無事消えました。

jquery-railsのinvalid gemspecのエラーもここ を参考に無事解決。スッキリ。


さて、それではRails3.2アプリを作成して、DotCloudにアップしてみましょう!!
初めにRailsアプリケーションをPC上で作成します。
(今回はkazokuの名前で作成。深い意味はないです。)

# rails new kazokuapp
..
Enter your password to install the bundled RubyGems to your system:

RubyGemsのパスワードを聞かれるので適用に入力。Your bundle is complete!と表示されればOK.
早速、作成したアプリのテストサーバを起動して、http://localhost:3000でブラウザからアクセスしてみましょ。

# cd kazokuapp
# script/rails server

"Welcome aboard You are riding ruby on rails."と表示されれば成功です。

続いて、Dot Cloudへのアプリのアップロードに挑戦します。

の前に、、、Dot Cloudに新サービスを作成しておきます。
サービスとはアプリケーションを入れる箱のようなもので、
DotCloudのフリープランでは最大2個まで箱を持てるようですよ。

#dotcloud create kazoku
...Created application "kazoku"

次に箱の設定を行います。
DotCloudにRubyアプリであること、アプリのルートディレクトリの名前を教える設定をYAMLで記述します。
ファイル名は必ずdotcloud.ymlにして、アプリのディレクトリ(kazokuapp)と同じ場所に作成してね。
設定のルートの名前をwwwにしてるところが多かったのでwwwで記述します。
※まだこのwwwの部分の意味がよく理解でていないので...

<dotcloud.yml>
www:
type: ruby
approot: kazokuapp

YAMLなのでタブとか使ってはダメですよ。繊細なYAML。。

準備が終わったところで、DotCloudにアプリをアップロードしましょう。
dotcloud.ymlとRoRアプリのディレクトリが存在する場所でdotcloud pushコマンドを実行します。
このコマンドを実行することで、DotCloudにプログラムが転送されると共に
自動的にRails3.2.0を含む依存関係のあるGemもインストールされます。<すごっ!!

# dotcloud push kazoku
...
14:54:22 [www] Fetching source index for https://rubygems.org/
...
14:55:08 [www] Installing rails (3.2.0)
...
Deployment finished. Your application is available at the following URLs
www: http://kazoku-xxx.dotcloud.com/


そして最後に表示されたURLにアクセスすると、ちゃんとWelcome aboardの文字が♪
ほんとに簡単、さっくさくです。
(railsの画像はDotCloudの環境では表示されないで注意。
 実行モードが"production"に設定されているからのようです。)


次回はさらにMySQLを使ったアプリをデプロイしてみましょう。

(続く)

正直、RoRもDotCloudも初心者なんだけど、
最新のRoR3.2をDotCloudで動かしてみよう、と思い立ってやってみた。

まずは自前のMacにrailsをインストール。とりあえずcpanの流れで、とりあえずgemしとく。

# sudo gem install rails

どのバージョンが入るのだろう(1/25時点)...

#...
#Successfully installed rails-3.2.0
#...

お、ちゃんと最新版の3.2.0が入った!!(結果おーらい)
さっそくrailsアプリケーションを作成しようとしたが、早速躓く。。。

#rails new kazoku
#..
#Invalid gemspec in [/opt/local/lib/ruby/gems/1.8/specifications/actionmailer-3.2.0.gemspec]: Illformed requirement
#/opt/local/lib/ruby/site_ruby/1.8/rubygems.rb:388:in `bin_path': can't find gem railties (>= 0) with executable rails (Gem::GemNotFoundException)

Invalid gemspec in...やら、cannot find gem ralitiesやらのエラーが発生したので、
ralitiesをインストール。

#sudo gem install railties

これでrailsアプリケーションは作成されたんだけど、依然としてInvalid gemspecってエラーが大量に発生している。

https://github.com/rails/rails/issues/4559

まさに上のURLと同じ現象。解決策は現時点ではなく、3.2.1のリリースを待てとのこと。。。
どーしょもないので、ひとまず無視だな。

#rails server

で起動しまずはローカル環境で無事3000ポートでアクセスできることを確認できました。

(続く)