2015年10月14日水曜日

AWS無料利用枠のインスタンスで、Ruby on Railsの環境を作成してみる①

こんにちは、井下です。

休日に犬と遊んでいるはずみで、セロテープを切るあのギザギザで出血する羽目になりました。身近な凶器ですよね、あれ…。

さて、今回はRuby on Railsの「環境構築」がテーマです。

Webアプリケーションを開発するうえで、Ruby on Railsは選択肢の1つとして挙げられるようになっていますが、実際に開発を行おうとすると、Ruby on Railsの稼動にこぎつけるまで、様々な障害が出てきます。
幸いそれなりに問題を解決するための情報は出回っているので、完全に手詰まりになることはありませんが、バージョンや環境の違いによって、情報が適切でないことも少なくありません。

そこで、AWS無料利用枠のインスタンスを利用して、1からRuby on Railsの環境構築を行ってみようと思います。

なお、後でも改めて記述しますが、インスタンスやRubyのバージョンなどは下記の通りです。

インスタンス⇒Red Hat Enterprise Linux 7.1(t2.micro) ※2015/10時点の無料利用枠インスタンス
Ruby⇒2.2.3
Ruby on Rails⇒4.2.4

1.インスタンス作成

まずはRuby on Railsをインストールするインスタンスを作成します。
選択するインスタンスは、現時点で無料利用枠となっている「Red Hat Enterprise Linux 7.1」、インストールタイプは同じく無料利用枠の「t2.micro」です。

今回はRuby on Railsを動かすことが目的なので、それ以降の設定はデフォルトのまま、インスタンスを作成します。

2.Rubyインストール

Rubyをインストールする方法は、ソースコードから直接ビルドする方法と、ツールを利用する方法に大別されますが、今回はRubyのインストールによく利用される「rbenv」というツールを利用します。

また、rbenvをインストールするためには、「git」というバージョン管理ツールが必要になります。
順序としてまとめると、次のようになります。

(1).gitをインストールするために必要なライブラリをインストールする
(2).gitをインストールする
(3).gitを利用してrbenvをインストールする
(4).rbenvを利用してRubyをインストールする

(1).gitをインストールするために必要なライブラリをインストールする

下記のライブラリをインストールします。記載しているコマンドそのままで通るはずです。
[ec2-user@ip-xxx ~]$ sudo yum install zlib zlib-devel openssl-devel sqlite-devel gcc-c++ glibc-headers libyaml-devel readline readline-devel zlib-devel libffi-devel

色々とコンソールに表示されますが、最終的に「Complete!」と出てくればライブラリの導入は完了です。
Installed:
  gcc-c++.x86_64 0:4.8.3-9.el7              glibc-headers.x86_64 0:2.17-78.el7  libffi-devel.x86_64 0:3.0.13-11.el7
  openssl-devel.x86_64 1:1.0.1e-42.el7_1.9  readline-devel.x86_64 0:6.2-9.el7   sqlite-devel.x86_64 0:3.7.17-6.el7_1.1
  zlib-devel.x86_64 0:1.2.7-13.el7

Dependency Installed:
  cpp.x86_64 0:4.8.3-9.el7                                 gcc.x86_64 0:4.8.3-9.el7
  glibc-devel.x86_64 0:2.17-78.el7                         kernel-headers.x86_64 0:3.10.0-229.14.1.el7
  keyutils-libs-devel.x86_64 0:1.5.8-3.el7                 krb5-devel.x86_64 0:1.12.2-15.el7_1
  libcom_err-devel.x86_64 0:1.42.9-7.el7                   libmpc.x86_64 0:1.0.1-3.el7
  libselinux-devel.x86_64 0:2.2.2-6.el7                    libsepol-devel.x86_64 0:2.1.9-3.el7
  libstdc++-devel.x86_64 0:4.8.3-9.el7                     libverto-devel.x86_64 0:0.2.5-4.el7
  mpfr.x86_64 0:3.1.1-4.el7                                ncurses-devel.x86_64 0:5.9-13.20130511.el7
  pcre-devel.x86_64 0:8.32-14.el7

Dependency Updated:
  krb5-libs.x86_64 0:1.12.2-15.el7_1   openssl.x86_64 1:1.0.1e-42.el7_1.9   openssl-libs.x86_64 1:1.0.1e-42.el7_1.9
  sqlite.x86_64 0:3.7.17-6.el7_1.1

Complete!

(2).gitをインストールする

gitをインストールします。やること自体は前の手順とほぼ変わりありません。
[ec2-user@ip-xxx ~]$ sudo yum install git

次のように表示されていれば、gitのインストールも完了です。
Installed:
  git.x86_64 0:1.8.3.1-4.el7

Dependency Installed:
  libgnome-keyring.x86_64 0:3.8.0-3.el7                   perl.x86_64 4:5.16.3-285.el7
  perl-Carp.noarch 0:1.26-244.el7                         perl-Encode.x86_64 0:2.51-7.el7
  perl-Error.noarch 1:0.17020-2.el7                       perl-Exporter.noarch 0:5.68-3.el7
  perl-File-Path.noarch 0:2.09-2.el7                      perl-File-Temp.noarch 0:0.23.01-3.el7
  perl-Filter.x86_64 0:1.49-3.el7                         perl-Getopt-Long.noarch 0:2.40-2.el7
  perl-Git.noarch 0:1.8.3.1-4.el7                         perl-HTTP-Tiny.noarch 0:0.033-3.el7
  perl-PathTools.x86_64 0:3.40-5.el7                      perl-Pod-Escapes.noarch 1:1.04-285.el7
  perl-Pod-Perldoc.noarch 0:3.20-4.el7                    perl-Pod-Simple.noarch 1:3.28-4.el7
  perl-Pod-Usage.noarch 0:1.63-3.el7                      perl-Scalar-List-Utils.x86_64 0:1.27-248.el7
  perl-Socket.x86_64 0:2.010-3.el7                        perl-Storable.x86_64 0:2.45-3.el7
  perl-TermReadKey.x86_64 0:2.30-20.el7                   perl-Text-ParseWords.noarch 0:3.29-4.el7
  perl-Time-HiRes.x86_64 4:1.9725-3.el7                   perl-Time-Local.noarch 0:1.2300-2.el7
  perl-constant.noarch 0:1.27-2.el7                       perl-libs.x86_64 4:5.16.3-285.el7
  perl-macros.x86_64 4:5.16.3-285.el7                     perl-parent.noarch 1:0.225-244.el7
  perl-podlators.noarch 0:2.5.1-3.el7                     perl-threads.x86_64 0:1.87-4.el7
  perl-threads-shared.x86_64 0:1.43-6.el7

Complete!

(3).gitを利用してrbenvをインストールする

先ほどの手順でインストールしたgitを利用して、rbenvをインストールします。
[ec2-user@ip-xxx ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

下記のような表示がされれば、rbenvのインストールは完了です。
Cloning into '/home/ec2-user/.rbenv'...
remote: Counting objects: 2162, done.
remote: Compressing objects: 100% (63/63), done.
remote: Total 2162 (delta 34), reused 0 (delta 0), pack-reused 2094
Receiving objects: 100% (2162/2162), 371.13 KiB | 175.00 KiB/s, done.
Resolving deltas: 100% (1312/1312), done.

rbenvでRubyをインストールするために必要なプラグインも、gitを利用してインストールします。
[ec2-user@ip-xxx ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

下記のような表示がされれば、Rubyのプラグインのインストールは完了です。
Cloning into '/home/ec2-user/.rbenv/plugins/ruby-build'...
remote: Counting objects: 5056, done.
remote: Total 5056 (delta 0), reused 0 (delta 0), pack-reused 5056
Receiving objects: 100% (5056/5056), 944.89 KiB | 318.00 KiB/s, done.
Resolving deltas: 100% (2734/2734), done.

これでrbenvをインストールできましたが、rbenvを利用するためにパスを通す必要があります。
「.bash_profile」にrbenvのパスが通るように設定を追加し、以降のログインでrbenvのパスが通っている状態にします。
[ec2-user@ip-xxx ~]$ vi ~/.bash_profile

「.bash_profile」ファイル(緑字の部分を追記)
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH
export PATH=$PATH:$HOME/.rbenv/bin:$HOME/.rbenv/shims

ここでログインし直すか、「source .bash_profile」コマンドで「.bash_profile」を読み直すと、rbenvにパスが通り、rbenvコマンドを認識するようになります。
[ec2-user@ip-xxx ~]$ source .bash_profile
[ec2-user@ip-xxx ~]$ rbenv -v
rbenv 0.4.0-169-g0f44c57

(4).rbenvを利用してRubyをインストールする

ここでようやくRubyをインストールします。バージョンは2015年10月時点での安定版、2.2.3を選択しました。
[ec2-user@ip-xxx ~]$ rbenv install 2.2.3

3~4分かかりましたが、無事Rubyがインストールできました。
Downloading ruby-2.2.3.tar.gz...
-> https://dqw8nmjcqpjn7.cloudfront.net/df795f2f99860745a416092a4004b016ccf77e8b82dec956b120f18bdc71edce
Installing ruby-2.2.3...
Installed ruby-2.2.3 to /home/ec2-user/.rbenv/versions/2.2.3

ただし、rbenvでRubyをインストールした場合、どのバージョンを利用するのか設定する必要があります(rbenvはRubyのバージョン管理を行っているため)

下記のコマンドによって、Rubyの2.2.3を利用する設定を行います。
[ec2-user@ip-xxx ~]$ rbenv rehash
[ec2-user@ip-xxx ~]$ rbenv global 2.2.3

最後にRubyのバージョン確認コマンドで、Ruby 2.2.3が確認できれば、Rubyのインストールおよび利用準備は完了です。
[ec2-user@ip-xxx ~]$ ruby -v
ruby 2.2.3p173 (2015-08-18 revision 51636) [x86_64-linux]


3.Ruby on Railsインストール

いよいよ本懐のRuby on Railsのインストールです。
下記のコマンドによってインストールしていきます。
[ec2-user@ip-xxx ~]$ gem update --system
[ec2-user@ip-xxx ~]$ gem install --no-ri --no-rdoc rails

…と、これまでは順調でしたが、ここでエラーが発生しました。
Fetching: nokogiri-1.6.6.2.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing rails:
        ERROR: Failed to build gem native extension.

    /home/ec2-user/.rbenv/versions/2.2.3/bin/ruby -r ./siteconf20151012-2391-1cynep.rb extconf.rb

Railsに必要な「nokogiri」というライブラリのビルドに失敗しています。

nokogiri自体のインストールや、そのために必要なライブラリのインストールによって解消しました。

まず、nokogiriのインストールのために必要なライブラリをインストールします。
[ec2-user@ip-xxx ~]$ sudo yum install libxml2 libxslt libxml2-devel libxslt-devel
~略~
Installed:
  libxml2-devel.x86_64 0:2.9.1-5.el7_1.2                      libxslt-devel.x86_64 0:1.1.28-5.el7

Dependency Installed:
  libgcrypt-devel.x86_64 0:1.5.3-12.el7_1.1 libgpg-error-devel.x86_64 0:1.12-3.el7 xz-devel.x86_64 0:5.1.2-9alpha.el7

Updated:
  libxml2.x86_64 0:2.9.1-5.el7_1.2

Dependency Updated:
  libgcrypt.x86_64 0:1.5.3-12.el7_1.1                      libxml2-python.x86_64 0:2.9.1-5.el7_1.2

Complete!

nokogiriのインストール準備が整ったので、次にnokogiriをインストールします。
[ec2-user@ip-xxx ~]$ gem install nokogiri -- --use-system-libraries
Building native extensions with: '--use-system-libraries'
This could take a while...
Successfully installed nokogiri-1.6.6.2
Parsing documentation for nokogiri-1.6.6.2
Installing ri documentation for nokogiri-1.6.6.2
Done installing documentation for nokogiri after 2 seconds
1 gem installed

nokogiriのインストールが完了したので、改めてRuby on Railsをインストールします。
[ec2-user@ip-xxx ~]$ gem install --no-ri --no-rdoc rails
~略~
23 gems installed

これでRuby on Railsのインストールができました!

4.Ruby on Railsの稼動を確認する

Ruby on Railsのインストールができたので、最後はRailsが稼動するかを確認してみます。
まずは適当な名前でRailsでアプリケーションを作成します。
[ec2-user@ip-xxx ~]$ rails new sample
~略~

[ec2-user@ip-xxx ~]$ ls
sample

Railsをコンソールで起動してみると、JavaScriptのランタイムが見つからないというエラーにより、実行できません。
[ec2-user@ip-xxx sample]$ rails c -s
/home/ec2-user/.rbenv/versions/2.2.3/lib/ruby/gems/2.2.0/gems/execjs-2.6.0/lib/execjs/runtimes.rb:48:in `autodetect': Could not find a JavaScript runtime. See https://github.com/rails/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)

「とりあえず」稼動させるため、Gemfileを編集し、「therubyracer」をインストールします。
[ec2-user@ip-xxx sample]$ vi Gemfile

「Gemfile」ファイル(赤字部分を削除)
source 'https://rubygems.org'


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '4.2.4'
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'
# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.1.0'
# See https://github.com/rails/execjs#readme for more supported runtimes
# gem 'therubyracer', platforms: :ruby

~略~

bundle installにより、Gemfileに記載されたgemをインストールします。
[ec2-user@ip-xxx sample]$ bundle install
~略~
Installing therubyracer 0.12.2 with native extensions

~略~

これでRailsのコンソール起動が確認できるようになりました。
[ec2-user@ip-xxx sample]$ rails c -s
Loading development environment in sandbox (Rails 4.2.4)
Any modifications you make will be rolled back on exit
irb(main):001:0>

ただし、「とりあえず」と前置きしたように、JavaScriptのランタイムとして、「therubyracer」にはやや問題があります。「therubyracer」がGemfileでインストール対象になっていると、bundle installに失敗することが出てきたり、そもそもメモリ使用量が多かったり…。

そのため、JavaScriptのランタイムは「therubyracer」ではなく、「node.js」を使うのがメジャーですが、node.jsはtherubyracerのように、Gemfileに書けばインストールしてくれるような仕組みがありません。(2015年10月時点)

また、JavaScriptのランタイム以外にも、デフォルトのデータベースやWebサーバが、あくまで導入の手軽さ・中小規模向けを重視しているところがあるため、Webアプリケーションの外部公開などを考えている場合、それらの差し替えが必要になってきます。


次回は最後に挙げたJavaScriptのランタイム・データベース・Webサーバの3つを差し替える手順について説明します。

次回⇒AWS無料利用枠のインスタンスで、Ruby on Railsの環境を作成してみる②

参考にしたサイト

必要なライブラリ・手順の参考
http://qiita.com/murachi1208/items/f3f15b41d6651cc57368

nokogiriのエラー解決の参考
http://qiita.com/chobi9999/items/7b66677b3bf3da8acc14

1 件のコメント:

  1. Herokuの無料枠と比べたら、どちらが早い(レスポンスがいい)のでしょうか?

    返信削除