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は問題にならないかもしれません。
渡辺 信秀(記事一覧)
2017年入社 / 地味な内容を丁寧に書きたい