Ruby on Rails 6をAmazon Linux 2で動かす

記事タイトルとURLをコピーする

Amazon Linux 2 に Ruby on Rails 6 の環境を構築してみました。 軽い気持ちでやったのですが、想像以上にハマりどころが多かったです。

今回の構築方針は以下の通りです。

  • rbenvなどのRuby環境の管理ツールは使わない
  • 関連ツール類は、なるべくAWSのリポジトリからインストールする
  • Dockerなどは使わず、Amazon Linux 2 で直接動作させる

Rubyのインストール

Amazon Linux 2 では、Rubyのバージョンを2.0、2.4、2.6のなかから選択できます。

$ yum list ruby
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
利用可能なパッケージ
ruby.x86_64                                                 2.0.0.648-36.amzn2.0.1                                                  amzn2-core
$ amazon-linux-extras list | grep ruby
 13  ruby2.4                  available    [ =2.4.2  =2.4.4  =2.4.7 ]
 39  ruby2.6                  available    [ =2.6 ]

Upgrading Ruby on Rails によると、Rails 6は、Ruby2.5.0以上が必要と記載があります。

Rails 6 requires Ruby 2.5.0 or newer.

そこで、今回はRuby2.6をインストールします。

$ sudo amazon-linux-extras install -y ruby2.6
$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]

関連RPMパッケージのインストール

$ sudo yum install -y \
ruby-devel \
rpm-build \
git \
gcc \
gcc-c++ \
zlib-devel \
openssl-devel \
rubygems-devel

Node.jsとyarnのインストール

最近のRailsには、Node.jsが必要とのことです。
私はあまり理解していないですが、webpackerというgemで利用するような感じです。
yarnも入っていないと、エラーになります。

AWSのリポジトリには無いので、NodeSourceのページの手順に従い、インストールします。

$ curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
$ sudo yum install -y nodejs
$ curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
$ sudo yum install -y yarn

sqlite3

Amazon Linux 2 のsqlite3は古くて消せない

Amazon Linux 2 にはsqlite3のバージョン3.7がデフォルトでインストールされています。
このsqlite3はyumで利用しているらしく、削除することはできません。
しかし、Rails 6を動かすには、sqlite3のバージョン3.8以上が必要です。

[ec2-user@ip-172-31-28-219 sample]$ rpm -q sqlite
sqlite-3.7.17-8.amzn2.0.2.x86_64

sqlite3を別途インストール

仕方ないのでデフォルトのsqlite3は放置で、別途インストールします。
参考記事:CentOS環境でRails6.0をSQLite3 (>=3.8)で動かす

# 3.30.1をダウンロード
$ wget https://www.sqlite.org/2019/sqlite-autoconf-3300100.tar.gz

$ tar xzvf sqlite-autoconf-3300100.tar.gz

$ cd sqlite-autoconf-3300100

# もとから入っているsqliteと競合しないように /opt/sqlite/sqlite3 にインストールします
$ ./configure --prefix=/opt/sqlite/sqlite3

$ make

$ sudo make install

# バージョン確認
$ /opt/sqlite/sqlite3/bin/sqlite3 --version
3.30.1 2019-10-10 20:19:45 18db032d058f1436ce3dea84081f4ee5a0f2259ad97301d43c426bc7f3df1b0b

Railsのインストール

$ cd
$ gem install rails
$ rails --version
Rails 6.0.2.1

rails new

動作確認のため、sampleアプリケーションを作成します。
ここでエラーが、出るので対処が必要です。

$ rails new sample

sudo gem pristine --all

Ignoring bindex-0.8.1 because its extensions are not built. Try: gem pristine bindex --version 0.8.1

同じようなエラーメッセージが大量に出ます。
一つずつ対処すると大変なので、--allでまとめて修正します。

$ sudo gem pristine --all

sqlite3(gem) のインストール

Could not find gem 'sqlite3 (~> 1.4)' in any of the gem sources listed in your Gemfile.

sqlite3のgemが無いとエラーメッセージが出ます。
sqlite3本体は、/opt/sqlite/sqlite3にインストールしたので、gemもそちらを利用するように指定し、インストールします。

$ gem install sqlite3 -- --with-sqlite3-include=/opt/sqlite/sqlite3/include \
   --with-sqlite3-lib=/opt/sqlite/sqlite3/lib

パス指定が正しくできているか確認してみます。
3.30.1と出るので、OSに元から入っていたsqlite3ではなく、先ほどインストールしたものを利用するようにできています。

$ irb
irb(main):001:0> require 'sqlite3'
=> true
irb(main):002:0> SQLite3::SQLITE_VERSION
=> "3.30.1"
irb(main):003:0> exit

これでsqlite3に関しては良しと思ったのですが、実はまだ不足しています。
これだけだと、後ほどrails sで起動すると、エラー画面が出てしまいます。
以下の環境変数の追加で対処します。

参考記事:Rails6におけるsqlite3のバージョン(Your version of SQLite is too old. Active Record supports SQLite >= 3.8

$ echo 'export LD_LIBRARY_PATH="/opt/sqlite/sqlite3/lib"' >> .bash_profile
$ source .bash_profile

bundle install

$ cd sample
[sample]$ bundle install

rails webpacker:install

[sample]$ rails webpacker:install

Railsの起動

[sample]$ rails s -b 0.0.0.0/0
=> Booting Puma
=> Rails 6.0.2.1 application starting in development
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 4.3.1 (ruby 2.6.3-p62), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://0.0.0.0:43767
Use Ctrl-C to stop

リモートからアクセスして動作確認したかったので、 「-b 0.0.0.0/0」 をつけました。

Started GET "/" for 58.93.31.171 at 2020-01-19 13:11:56 +0000
Cannot render console from 58.93.31.171! Allowed networks: 127.0.0.0/127.255.255.255, ::1
   (1.5ms)  SELECT sqlite_version(*)
Processing by Rails::WelcomeController#index as HTML
  Rendering /home/ec2-user/.gem/ruby/gems/railties-6.0.2.1/lib/rails/templates/rails/welcome/index.html.erb
  Rendered /home/ec2-user/.gem/ruby/gems/railties-6.0.2.1/lib/rails/templates/rails/welcome/index.html.erb (Duration: 11.5ms | Allocations: 476)
Completed 200 OK in 28ms (Views: 18.5ms | ActiveRecord: 0.0ms | Allocations: 2712)

正常にレスポンスがきました。

感想

思った以上にsqlite3でハマりました。
標準のsqlite3を削除できないと、難易度が上がります。
そこらへんが原因かわかりませんが、Ubuntuで動かしている事例が多くみました。
正直、Amazon Linux 2 でRailsを動かすのは、よく無いかもしれません。

なお、暫くしてバージョン上がると、また構築手順が変わるかもしれません。
なんとなくコンテナが流行っている理由を少し体感しました。

もっとも、本番サーバならMySQLやPostgreSQLを使うことが多いので、sqlite3は問題にならないかもしれません。

渡辺 信秀 (記事一覧)