普段はx86-64などのCPUを使ったサーバーが多いですが、ARMプロセッサのサーバーもAWSでは選択ができるようになっています。 ARMプロセッサで動くサーバーでRailsを動かすまでの違いなどを確認するために試してみたことをまとめていきます。
基本的な環境構築の注意点
AWSを利用しますが、ここでEC2でサーバーを作成する際にOSの選択時に64ビット(x86)と64ビット(ARM)が選べるのでARMの方を今回は選びます。 ここで作成時に気を付けないといけないので東京リージョンの場合のアベイラビリティーゾーンです。将来は変わるかもしれませんがARMが使えるのはaとdの方になりますので、これ以外を選択する作成時にエラーとなってしまいます。
Railsを動かすための準備
後で必要になるビルドのツールをyumでインストールします。
sudo yum groupinstall "Development Tools"
Rubyの環境構築
Rubyは最新バージョンを使用するためrbenvを使うことにしました。HomeBrewを使用してインストールを行おうとしたところ失敗してしまうので、直接インストールします。 インストール方法はGitHubの説明を参考にしました。
git clone https://github.com/rbenv/rbenv.git ~/.rbenv cd ~/.rbenv && src/configure && make -C src echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile ~/.rbenv/bin/rbenv init
ビルドするためのツールのruby-buildをセットアップします。こちらに手順が書かれております。
mkdir -p "$(rbenv root)"/plugins git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
rubyをインストールします。(a1.midiumだと20分ほどであったと思います。) openssl-develをインストールしていないと最後の最後で失敗してしまいます。
sudo yum install openssl-devel rbenv install 2.7.1
デフォルトで使用するバージョンを設定します。
rbenv global 2.7.1
Node.jsの環境構築
AWS Linuxの方でNode.jsは準備されていないようでしたのでnodebrewを通してインストールすることにしました。
GitHub - hokaccha/nodebrew: Node.js version manager
curl -L git.io/nodebrew | perl - setup export PATH=$HOME/.nodebrew/current/bin:$PATH (.bashrcの最後に追記する) source ~/.bashrc
nodebrew install v14.10.0でインストールを完了させたかったものの、取得されるバイナリに互換性がないようでしたのでコンパイルすることにしました。 割と時間がかかるので注意です。(a1.midiumで3時間ほど)
nodebrew compile v14.10.0
nodebrew use v14.10.0 npm install -g yarn
Railsをインストール
sudo yum install sqlite-devel (後で入れなおしますが一旦インストールします) gem install rails
新しくアプリケーションを作成します。この時に、--skip-bundleを入れないとセグメンテーションフォルトのエラーとなってしまうため追加しています。
rails new blog --skip-bundle
ラズベリーパイでも同じようなエラーがでるようです。こちらのページがとても参考になりました。
インストールされているsqlite3が古いため再度インストールします。
wget https://www.sqlite.org/2020/sqlite-autoconf-3330000.tar.gz tar xvzf sqlite-autoconf-3330000.tar.gz cd sqlite-autoconf-3330000/ ./configure --prefix=/opt/sqlite/sqlite3 make sudo make install gem uninstall sqlite3 gem install sqlite3 -- --with-sqlite3-include=/opt/sqlite/sqlite3/include --with-sqlite3-lib=/opt/sqlite/sqlite3/lib
これでRailsのアプリケーションを起動します。
cd blog bin/rails server
3000ポートで受け付けているので、
curl http://localhost:3000/
にアクセスするか、ブラウザから確認する場合には別のターミナルからSSHでトンネルを作成して手元のブラウザからアクセスするのが楽かと思います。
ssh -i (鍵ファイルへのパス) -L 3000:localhost:3000 {ユーザー名}@{サーバーのIPなど}
手元のブラウザでhttp://localhost:3000を開く
まとめ
いまのところでのARM版での違いはRailsのセグメンテーションフォルトの問題、Node.jsのインストールでコンパイルが必要、Homebrewでrbenvがインストールできないというあたりなのではないでしょうか。 今後改良が進んで時間のかかるコンパイルの処理などが不要になっていくと嬉しいですね。