EC2にrubyをインストールする手順 ~rbenvからbundlerの解説~
ここ最近ansibleやterraformなどにIaCに関する記事を投稿しています。
この流れでServerSpeを使った自動テストも投稿しようとしたところ、、、
Serverspecを使うにはrubyのインストールが必要でだったのでせっかくならということで別記事として投稿しました。
rubyに限らず、「インストール手順」関連は初めてやる場合何をやっているのかイメージしづらいです。
なので、今回はコピペ用のコマンドもご用意しました。
手順の説明も入れていますのでご覧ください。
rubyのインストール[コピペ用]
「とりあえずインストールだけしたい!」という方は、ここのコマンドを上からコピペでOKです
ansibleを使える方は、こちらにPlaybookを用意しましたのでご利用ください。
sudo yum update -y
sudo yum -y install git gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel sqlite-devel
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
source ~/.bash_profile
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
cd ~/.rbenv/plugins/ruby-build
sudo ./install.sh
rbenv install 3.0.2 -v
rbenv global 3.0.2
rbenvのインストール
こちらは、rubyのバージョン管理ソフトです。
これをインストールすると複数バージョンのrubyインストールと、それらの切り替えが簡単に行えます。
terraformの記事でもtfenvというバージョン管理ソフトが出てきましたが同じようなものです。
リポジトリの更新とgitのインストール
$ sudo yum update -y
$ sudo yum install git
rbenvのインストール(githubから取得)
rbenvのプログラムは、githubに公開されています。
それを自分のサーバの~/.rbenvに保存しましょう。
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
パスを通す
~/.rbenvにあるコマンドrbenvをどのディレクトリにいても使えるようにパスを通します。
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
パスを通す(別のやり方)
既存の.bash_profileに直接記載してもいいのですが別ファイルに記載し.bash_profileから読み込む方法も記載します。
(この記事で用意したPlaybookのサンプルはこの方法です。)
.bash_profileに別ファイルを読み込む記述を追加
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# ここから
if [ -d "${HOME}/.bash.d" ] ; then
for f in "${HOME}"/.bash.d/*.sh ; do
[ -x "$f" ] && . "$f"
done
unset f
fi
# ここまでを追加
PATH=$PATH:$HOME/.local/bin:$HOME/bin
export PATH
分割したファイルを配置
$ mkdir ~/.bash.d
$ cd ~/.bash.d
$ touch 001_rbenv.sh
$ chmod 755 001_rbenv.sh
$ vim 001_rbenv.sh
001_rbenv.shを作成
# 001_rbenv.sh
export PATH=~/.rbenv/bin:~/.rbenv/shims:$PATH
eval "$(rbenv init -)"
こうすることで、.bash_profileが読み込まれるたびにこのスクリプトが実行されexportしてくれるのでrvenvが使えるようになります。
完了したら忘れずにsource ~/.bash_profileを実行しましょう。(ログインし直しでも可)
$ source ~/.bash_profile
確認
以下のコマンドでrbenvのバージョンが表示されればインストール完了です。
$ rbenv -v
rbenv 1.2.0
ruby-buildのインストール
これは、rubyをインストールするために必要なrbenvのプラグインです。
githubからクローン
こちらもrbenvと同じようにgithubにあります。
$ git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
インストールの実施
保存したディレクトリ内にあるinstall.sh実行してインストールします。
$ cd ~/.rbenv/plugins/ruby-build
$ sudo ./install.sh
確認
以下のコマンドでインストール可能なrubyのバージョン一覧が表示されれば完了です。
$ rbenv install -l
2.6.8
2.7.4
3.0.2
jruby-9.3.0.0
mruby-3.0.0
rbx-5.0
truffleruby-21.2.0.1
truffleruby+graalvm-21.2.0
Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all / -L' to show all local versions.
rubyのインストール
rbenvにrubyをインストールしていきます。
前提パッケージのインストール
$ sudo yum -y install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel libffi-devel libxml2 libxslt libxml2-devel libxslt-devel sqlite-devel
rubyのインストール
画面に変化がないのでわかりづらいですが、一応動いています。しかも結構長いです。
全然動かない場合、ssh接続がタイムアウトしている可能性もあるので別のターミナルからログインして確認してください。
-vオプションをつけると裏で動いている状態が確認できます。
$ rbenv install 3.0.2 -v
インストールしたrubyの有効化
インストールしただけでは、そのバージョンのrubyは有効になりません。
以下のコマンドで切り替えを行ってください。
バージョンのrubyをインストールした場合もこの作業が必要になります。
$ rbenv global 3.0.2
$ ruby -v
ruby 3.0.2p107 (2021-07-07 revision 0db68f0233) [x86_64-linux]
bundlerのインストール
bundlerとは、rubyの外部ライブラリ(gem)を管理するgemです。
gemとは
gemとは、どこかの誰かが作った便利機能が使えるプログラムです。
gemを自分のrubyにインポートすることで、1から作ると面倒な機能などがすぐ作れます。
例えば、Webアプリケーションなどで、ログイン画面を実装する場合もdeviseというgemをインストールするとコマンド何個かで作ることができます。
このgemはRubyGems.org というサイトで公開されており、そこから欲しいgemを取得することで便利な機能をすぐに導入することができます。
gemをインストールするにはrubyをインストールすると使えるようになるgemコマンドでインストールします。(ややこしいですね)
$ gem install bundle
「こんなに便利なら全部最初に入れちゃえばいいじゃない!」と思うかもしれませんがそれは間違いです。
gemはかなりの数があることと一つの機能自体は限定的な役割を持つため使わないものも出てきます。
そうすると、アプリケーション自体のサイズが無駄に大きくなり予期せぬトラブルを産むこととなるでしょう。
さらに、gemには「gemを使うために必要なgem(依存)」や「同じ環境に共存できないgem(競合)」があります。
このような、依存や競合をひとつづつ人手で行っていたら大変です。
なので、bundlerというgemを管理するgemを導入します。
bundlerとは
gemを直接PCにインストールしなくても済むようになるgemです。
bundlerの上にインストールすることで、先程の競合を回避することができます。
また、依存に関しても欲しいgemを指定すれば必要なgemは自動で取得してくれます。
bundlerありとなしの図はこんな感じです。
bundlerのインストール
先ほど述べたように bundlerもgemの一つなのでgemコマンドを使います。
$ gem install bundler
Fetching bundler-2.2.29.gem
Successfully installed bundler-2.2.29
Parsing documentation for bundler-2.2.29
Installing ri documentation for bundler-2.2.29
Done installing documentation for bundler after 3 seconds
1 gem installed
インストールは以上です。
gemのインストール方法
さきほど、bundlerをインストールする際にも記載しましたがbundlerを使う場合と使わない場合ではgemのインストール方法は異なります。
bundlerを使う場合
bundlerはGemfileというファイルの中に記載されているgemを自動で取得してくれます。
なので手順としては、
- Gemfileを作る
- Gemfileに欲しいgemを記載する
- インストールを実行
- gemを使う
となります。
$ cd ~
$ mkdir bundle_test
$ bundle init
Writing new Gemfile to /home/ec2-user/bundler_test/Gemfile
$ echo gem '"hello-world"' >> Gemfile
$ bundle install --path vendor/bundle
$ bundle install --path vendor/bundle
[DEPRECATED] The `--path` flag is deprecated because it relies on being remembered across bundler invocations, which bundler will no longer do in future versions. Instead please use `bundle config set --local path 'vendor/bundle'`, and stop using this flag
Fetching gem metadata from https://rubygems.org/.
Resolving dependencies...
Using bundler 2.2.22
Fetching hello-world 1.2.0
Installing hello-world 1.2.0
Bundle complete! 1 Gemfile dependency, 2 gems now installed.
Bundled gems are installed into `./vendor/bundle`
$ bundle exec hello-world
this is executable hello-world
$ bundle install --path vendor/bundle
実行後にGemfile.lockというものが自動で作成されますが、依存するgemも含めて何をインストールしたかが記載してあります。
こうすることで、"hello-world"というgemは、~/bundle_test/vendor/bundle
にインストールさて、bundle_testディレクトリ内でのみ使えるようになります。
また、bundlerでインストールしたgemを使う場合は頭に「bundle exec」をつける必要がありますのでお忘れなきよう
ためしに、別のディレクトリで使うとエラーが出るかと思います。
このように、bundlerを使うと依存や競合をあまり意識せずgemをインストールすることができます。
bundlerを使わない場合
わかりやすくするためbundlerを使わない手順を見てみます。
PCやサーバに直接gemをインストールする場合は以下の通りです。
$ gem install hello-world
$ hello-world
PCに直接インストールすることで、どのディレクトリにいてもその機能を使うことができます。(bundle execも不要です)
なので、bundlerはもちろんPC,サーバ内において共通で利用するgemなどはPCに直接インストールするのが良いです。
最後に
Rubyのインストールはできたでしょうか?
ansibleやコピペで自動インストールするのもいいですが、実際に中身で何をやっているかわからないとエラーが出た時や人に教えるときに困ってしまいます。
今回、少し細かく解説していますのでぜひ新米エンジニアさんに教えるときは参考にしていただけると幸いです。
また、rubyはruby on railsという有名すぎるgemもありますので、今後railsをインストールする記事も書こうと思います。
最後までご覧いただきありがとうございます!