Amazon Linux AMIにRuby on Railsの環境を構築

そろそろPaaSに手を出そうと思いましてまずはRuby on Rails(RoR)でも覚えようかなと思っています。PaaSと言えばGAE・Force.com・Windows Azureも有力ですけど、自由度とお手軽さを重視するとHerokuや今後RoRに対応する予定のBeanstalkの方が良さそうなイメージがあったのでこちらに決めました。だったらいきなりHerokuにすればという話もありますが、EC2も使ってみたかったのでというのでEC2+RoRでスタート。

Amazon Web Servicesの申し込み

まずは土台となるEC2を使うためにAWSの申し込み。AWSのアカウントは買本でAmazonAPIを呼び出すのですでに作成済みだったので、EC2の利用申し込みから実施。

細かい手順は忘れてしまいましたが、Webフォームから申し込みをして電話で番号をプッシュして、クレジットカード情報を登録しておしまいぐらいの簡単な手順ですぐに終わりました。

EC2でインスタンスの起動

Basic 32-bit Amazon Linux AMI 2011.02.1 Beta (AMI Id: ami-300ca731)というイメージを無料利用枠で使えるInstance Type: Microで起動しました。AWS Management Consoleから画面の指示に従って設定するだけなのでこれも簡単に終了。

Tokyoリージョンで起動しましたけどタイムゾーンUTCですね。何か不都合があるまではそのままにしておこうと思います。

RoRのインストール

入れるのはRoR3です。新規に始めるので新しいバージョンを使います。インストールはRuby on Rails 3.0 日記を参考にしました。

Rubyが入っていないと駄目だし古いバージョンでも駄目なのでバージョンを確認。

$ ruby -v
ruby 1.8.7 (2010-12-23 patchlevel 330) [i386-linux]

問題ないバージョンでした。ちなみにRuby関連のインストール状況はこんな感じ。

$ yum list | grep ruby
ruby.i686                              1.8.7.330-1.5.amzn1          installed
ruby-libs.i686                         1.8.7.330-1.5.amzn1          installed
graphviz-ruby.i686                     2.26.0-4.12.amzn1            amzn-main
libselinux-ruby.i686                   2.0.98-1.9.amzn1             amzn-main
rrdtool-ruby.i686                      1.3.8-6.6.amzn1              amzn-main
ruby-devel.i686                        1.8.7.330-1.5.amzn1          amzn-main
ruby-irb.noarch                        1.8.7.330-1.5.amzn1          amzn-main
ruby-mysql.i686                        2.8.2-1.3.amzn1              amzn-main
ruby-rdoc.noarch                       1.8.7.330-1.5.amzn1          amzn-main
ruby-ri.i686                           1.8.7.330-1.5.amzn1          amzn-main
ruby-static.i686                       1.8.7.330-1.5.amzn1          amzn-main
rubygems.noarch                        1.3.7-1.7.amzn1              amzn-main

次はRoRのインストールですがgemが入っていないので先にそちらをインストール。

$ sudo yum install rubygems

これであっさり入りました。引き続きRoRをインストール。

$ sudo gem install rails

これで入りましたが結構時間がかかりました。特にドキュメント生成の時間が長かったのでドキュメントは外しても良かったかもしれません。

最後のメッセージが File not found: libで終わっていたので何か失敗しているようなのですけど、gemのインストールは成功しているので気にせず次へ。

バージョンを確認してみる。

$ rails -v
Rails 3.0.7

ここで一旦切ってバックアップを取りました。バックアップはAWS Management Consoleからインスタンスを停止したあとCreate Image(EBS AMI)を実行。これで起動用のAMIの作成が完了。

本当に起動できるかを早速確認ということで、新しいインスタンスを起動。無事起動してRoRも入っていました。これでさっき停止したインスタンスは入らなくなったのでTerminateで消しました。

ただこの方法でバックアップを取ると無料利用枠を超えてしまうような気がするので、そのうち消すかもしれません。

SQLiteのインストール

MySQLでも良いのですが、参考にしているサイトがSQLite3だったのでそれに合わせることに。ここははまってしまってすごく苦労しました。終わってみれば大したことはなくて、もう一度やる分にはすぐ終わると思います。

SQLiteのインストール状況を確認。

$ yum list | grep sqlite
python-sqlite.i386                     2.6.0-1.8.amzn1              installed
sqlite.i686                            3.6.20-1.8.amzn1             installed
apr-util-sqlite.i686                   1.3.9-3.9.amzn1              amzn-main
libdbi-dbd-sqlite.i686                 0.8.3-5.1.3.amzn1            amzn-main
sqlite-devel.i686                      3.6.20-1.8.amzn1             amzn-main
sqlite-doc.i686                        3.6.20-1.8.amzn1             amzn-main
sqlite-tcl.i686                        3.6.20-1.8.amzn1             amzn-main

$ sqlite3 -version
3.6.20

とりあえずこれでいけるかなと思ってRoRの新規アプリケーションの作成を実行したら成功。続いてアプリケーションの起動。

$ rails server
Could not find gem 'sqlite3 (>= 0, runtime)' in any of the gem sources listed in your Gemfile.

駄目でした。やっぱりサイトに書いてある手順には従わないと駄目ですね、ということでgemでsqlite3のインストール。

$ sudo gem install sqlite3
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3:
        ERROR: Failed to build gem native extension.

/usr/bin/ruby extconf.rb
mkmf.rb can't find header files for ruby at /usr/lib/ruby/ruby.h


Gem files will remain installed in /usr/lib/ruby/gems/1.8/gems/sqlite3-1.3.3 for inspection.
Results logged to /usr/lib/ruby/gems/1.8/gems/sqlite3-1.3.3/ext/sqlite3/gem_make.out

ヘッダファイルがなかったので追加。

$ sudo yum install ruby-devel

再挑戦。

$ sudo gem install sqlite3
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3:
        ERROR: Failed to build gem native extension.

/usr/bin/ruby extconf.rb
checking for sqlite3.h... no
(以下略)

ここも手順を飛ばしていたところなので実行。

$ sudo yum install sqlite-devel

今度は成功するはず。

$ sudo gem install sqlite3
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3:
        ERROR: Failed to build gem native extension.

/usr/bin/ruby extconf.rb
checking for sqlite3.h... no
(以下略)

sqlite3.h is missing. と言われました。あるんですけどね。

$ ls -l /usr/include/sqlite3.h
-rw-r--r-- 1 root root 268966 Jan 17 10:24 /usr/include/sqlite3.h

場所が分からないのかなと思ってインクルードパスを指定して実行。

$ sudo gem install sqlite3 -- --with-sqlite3-include=/usr/include
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3:
        ERROR: Failed to build gem native extension.

/usr/bin/ruby extconf.rb --with-sqlite3-include=/usr/include
checking for sqlite3.h... no
(以下略)

駄目でした。スラッシュが足りないのかもと思って--with-sqlite3-include=/usr/include/と最後にスラッシュを付けても同じ結果。

で、いろいろあってgccがないよというのでインストール。

$ sudo yum install gcc
$ sudo gem install sqlite3
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3:
        ERROR: Failed to build gem native extension.

/usr/bin/ruby extconf.rb
checking for sqlite3.h... yes
checking for sqlite3_libversion_number() in -lsqlite3... yes
checking for rb_proc_arity()... no
checking for sqlite3_initialize()... yes
checking for sqlite3_next_stmt()... yes
checking for sqlite3_backup_init()... yes
checking for sqlite3_column_database_name()... yes
checking for sqlite3_enable_load_extension()... yes
checking for sqlite3_load_extension()... yes
creating Makefile

make
sh: make: command not found

進みました。makeがないよというのでインストール。

$ sudo yum install make

ここまでやって次のコマンドで無事インストールが完了しました。

$ sudo gem install sqlite3

動作確認

$ rails server

今度はこれで無事起動したのでブラウザからアクセスですが、その前にAWS Management ConsoleからSecurity Groupsの設定で3000番ポートを開けておきます。

この状態でブラウザからアクセスすると無事画面が表示されました。