Linuxにrbenvをインストールし、rbenvでRubyを入れ、mysql2のgemを入れるまでのメモ
ちょっとたくさんのインスタンスからMySQLにクエリを投げたいことってありますよね?
というわけで今日はRubyでMySQLに接続するコードを書く前段階として表題のEC2上で環境構築の素振りをします。
TL;DR
- rbenvおよび、rbenvのプラグイン ruby-buildはGitHubからcloneしてくるのでまずgitを入れる
exec $SHELL -l
で新しく起動中のシェルを実行し、現在のプロセスと入れ替えることで~/.bash_profile
に書いた設定内容(シェルの起動時に読み込み)をその場で反映させられる- RubyのインストールにはCコンパイラが必要で、Cコンパイラとしてgccをインストールする
-devel
がついたパッケージには開発環境で使うオブジェクトやヘッダが含まれていて、C言語で書かれたライブラリをコンパイルする際に必要になることがあるmysql2
のgem のインストールにはmysql-devel
が必要- ネイティブエクステンションの部分でgemのインストールが失敗すると長いメッセージが出てきてオプションなどの羅列に目が行きがちだが、まんなかあたりに具体的に何をやればいいか1行で書いてある
rbenvのインストール
https://qiita.com/inouet/items/478f4228dbbcd442bfe8 を参考に作業していきます。
gitをインストールする
$ sudo yum -y install git
rbenvはGitHubからDLしてきます。そのために、Gitクライアントがあると便利なのでgitのインストールを行います。
rbenvをホームディレクトリにDLし、rbenvの実行ファイルへのパスを通す
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
ついでに、シェルを立ち上げた時に rbenv
が起動するようにも設定しておきます。
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
~/.bash_profile
に書いた設定は次以降にbashを開く時に読み込まれるので
$ exec $SHELL -l
を実行して先ほどまで ~/.bash_profile
に追記していた設定をその場で反映させます。
exec $SHELL -l
コマンドは、新しく ~/.bash_profile
の設定変更が反映されているbash($SHELL
の中身)のプロセスを実行して今動いているbashのプロセスと入れ替えます*1。
rbenvのプラグインである ruby-build をインストールする
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenvはシステム全体や特定のディレクトリ下で利用するRubyのバージョンを管理してくれますが、Rubyのインストールは ruby-build
のプラグインが必要です。
というわけで、 rbenv
を入れたパスの /plugins/
以下に ruby-build
を、これもGitHubからDLしてきて入れます。
Ruby 2.5.1 のインストール
1回目のRubyのインストールをやってみるとCのコンパイラがないといって失敗する
それではrbenvでRubyのインストールをためしてみます。
$ rbenv install 2.5.1 Downloading ruby-2.5.1.tar.bz2... -> https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.bz2 Installing ruby-2.5.1... BUILD FAILED (Amazon Linux AMI 2018.03 using ruby-build 20180822-8-g336584c) Inspect or clean up the working tree at /tmp/ruby-build.20180916020903.3029 Results logged to /tmp/ruby-build.20180916020903.3029.log Last 10 log lines: tool/config.sub already exists checking build system type... x86_64-pc-linux-gnu checking host system type... x86_64-pc-linux-gnu checking target system type... x86_64-pc-linux-gnu checking for gcc... no checking for cc... no checking for cl.exe... no configure: error: in `/tmp/ruby-build.20180916020903.3029/ruby-2.5.1': configure: error: no acceptable C compiler found in $PATH See `config.log' for more details
すると利用可能なCコンパイラがないといってインストールに失敗します。
Cのコンパイラとしてgccを入れる
sudo yum install gcc
gccはC言語のコンパイラ、およびコンパイル用実行ファイルの名称です*2。
ところで、XCodeを入れたら/入れ直したらmysqlのgemがインストールできるようになった、という話がありますが*3、XCodeはもともとC系の言語用のIDEなので、C言語のコンパイラが一緒に入った/正常な状態のものに更新された、ということではないかと思います。
2回目のRubyのインストールをやってみるとopenssl, readline, zlibのextensionがないといって失敗する
では、気を取り直してもう一回インストールを試すと、今度は
[ec2-user@ip-172-31-19-189 ~]$ rbenv install 2.5.1 Downloading ruby-2.5.1.tar.bz2... -> https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.bz2 Installing ruby-2.5.1... BUILD FAILED (Amazon Linux AMI 2018.03 using ruby-build 20180822-8-g336584c) Inspect or clean up the working tree at /tmp/ruby-build.20180916021333.14684 Results logged to /tmp/ruby-build.20180916021333.14684.log Last 10 log lines: The Ruby openssl extension was not compiled. The Ruby readline extension was not compiled. The Ruby zlib extension was not compiled. ERROR: Ruby install aborted due to missing extensions Try running `yum install -y openssl-devel readline-devel zlib-devel` to fetch missing dependencies. Configure options used: --prefix=/home/ec2-user/.rbenv/versions/2.5.1 LDFLAGS=-L/home/ec2-user/.rbenv/versions/2.5.1/lib CPPFLAGS=-I/home/ec2-user/.rbenv/versions/2.5.1/include
のようなメッセージで失敗します。
openssl-devel readline-devel zlib-devel のインストール
openssl, readline, zlib はそれぞれSSL通信用のライブラリ、コマンド履歴管理用のライブラリ*4、データ圧縮、解凍のためのライブラリですが、これらの拡張が足りず -devel
のsuffixがついたパッケージを入れるように言われています。
https://www.unknownengineer.net/entry/2017/04/07/162346 の記事によると、 -devel
というsuffixはなにかというと開発に必要なライブラリオブジェクトやヘッダファイル(**.h
とかそういう)が入っていて、(そのライブラリやコマンドを単体で利用する場合にはおそらくいらない場合もあると思われるんですが、)ライブラリを利用したプログラムをコンパイルする際に必要となることがあるそうで、
つまり、Rubyをコンパイルするのに、openssl, readline, zlib の開発用のヘッダ、ライブラリの一式が必要ということみたいです。
というわけでいれます。
$ sudo yum install -y openssl-devel readline-devel zlib-devel
なお、 -devel
のパッケージは -devel
が入っていない方のパッケージに依存しているというか、openssl-develはopensslの内容+開発用オブジェクトやヘッダが入っている、という感じなので、 sudo yum install -y openssl-devel
したあとは openssl
コマンドが動かせます。
$ sudo yum install -y openssl-devel readline-devel zlib-devel ... Installed: openssl-devel.x86_64 1:1.0.2k-12.110.amzn1 readline-devel.x86_64 0:6.2-9.14.amzn1 zlib-devel.x86_64 0:1.2.8-7.18.amzn1 Dependency Installed: keyutils-libs-devel.x86_64 0:1.5.8-3.12.amzn1 krb5-devel.x86_64 0:1.15.1-19.43.amzn1 libcom_err-devel.x86_64 0:1.42.12-4.40.amzn1 libkadm5.x86_64 0:1.15.1-19.43.amzn1 libselinux-devel.x86_64 0:2.1.10-3.22.amzn1 libsepol-devel.x86_64 0:2.1.7-3.12.amzn1 libverto-devel.x86_64 0:0.2.5-4.9.amzn1 ncurses-devel.x86_64 0:5.7-4.20090207.14.amzn1 Dependency Updated: krb5-libs.x86_64 0:1.15.1-19.43.amzn1 openssl.x86_64 1:1.0.2k-12.110.amzn1 Complete! $ openssl OpenSSL> exit
このAMIにはもともとopenssl入っていたみたいですが!
3回目の正直でRubyのインストールに成功するので、インストールしたバージョンを利用するようにする
$ rbenv install 2.5.1 Downloading ruby-2.5.1.tar.bz2... -> https://cache.ruby-lang.org/pub/ruby/2.5/ruby-2.5.1.tar.bz2 Installing ruby-2.5.1... Installed ruby-2.5.1 to /home/ec2-user/.rbenv/versions/2.5.1 $ ruby -v ruby 2.0.0p648 (2015-12-16) [x86_64-linux] $ rbenv global 2.5.1 $ ruby -v ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
mysql2のgemをインストールする
なにもせず mysql2 のgemを入れようとするとmysqlがインストールされていないので怒られる
$ gem install mysql2 Fetching: mysql2-0.5.2.gem (100%) Building native extensions. This could take a while... ERROR: Error installing mysql2: ERROR: Failed to build gem native extension. current directory: /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2/ext/mysql2 /home/ec2-user/.rbenv/versions/2.5.1/bin/ruby -r ./siteconf20180916-10601-y92qux.rb extconf.rb checking for rb_absint_size()... yes checking for rb_absint_singlebit_p()... yes checking for rb_wait_for_single_fd()... yes checking for -lmysqlclient... no ----- mysql client is missing. You may need to 'apt-get install libmysqlclient-dev' or 'yum install mysql-devel', and try again. ----- *** extconf.rb failed *** Could not create Makefile due to some reason, probably lack of necessary libraries and/or headers. Check the mkmf.log file for more details. You may need configuration options. Provided configuration options: --with-opt-dir --without-opt-dir --with-opt-include --without-opt-include=${opt-dir}/include --with-opt-lib --without-opt-lib=${opt-dir}/lib --with-make-prog --without-make-prog --srcdir=. --curdir --ruby=/home/ec2-user/.rbenv/versions/2.5.1/bin/$(RUBY_BASE_NAME) --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysql-config --without-mysql-config --with-mysql-dir --without-mysql-dir --with-mysql-include --without-mysql-include=${mysql-dir}/include --with-mysql-lib --without-mysql-lib=${mysql-dir}/lib --with-mysqlclientlib --without-mysqlclientlib To see why this extension failed to compile, please check the mkmf.log which can be found here: /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0-static/mysql2-0.5.2/mkmf.log extconf failed, exit code 1 Gem files will remain installed in /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/mysql2-0.5.2 for inspection. Results logged to /home/ec2-user/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/extensions/x86_64-linux/2.5.0-static/mysql2-0.5.2/gem_make.out
MySQLをインストールしていないので、
mysql client is missing. You may need to 'apt-get install libmysqlclient-dev' or 'yum install mysql-devel', and try again.
と怒られています。それはそうですね...。ということで 'yum install mysql-devel'
をします。
mysql-develをインストールする
$ sudo yum install mysql-devel Loaded plugins: priorities, update-motd, upgrade-helper amzn-main | 2.1 kB 00:00:00 amzn-updates | 2.5 kB 00:00:00 Resolving Dependencies --> Running transaction check ---> Package mysql-devel.noarch 0:5.5-1.6.amzn1 will be installed --> Processing Dependency: mysql55-devel >= 5.5 for package: mysql-devel-5.5-1.6.amzn1.noarch --> Processing Dependency: /usr/bin/mysql_config for package: mysql-devel-5.5-1.6.amzn1.noarch --> Running transaction check ---> Package mysql55.x86_64 0:5.5.61-1.22.amzn1 will be installed --> Processing Dependency: real-mysql55-libs(x86-64) = 5.5.61-1.22.amzn1 for package: mysql55-5.5.61-1.22.amzn1.x86_64 --> Processing Dependency: mysql-config for package: mysql55-5.5.61-1.22.amzn1.x86_64 ---> Package mysql55-devel.x86_64 0:5.5.61-1.22.amzn1 will be installed --> Running transaction check ---> Package mysql-config.x86_64 0:5.5.61-1.22.amzn1 will be installed ---> Package mysql55-libs.x86_64 0:5.5.61-1.22.amzn1 will be installed --> Finished Dependency Resolution Dependencies Resolved =============================================================================================================================================================== Package Arch Version Repository Size =============================================================================================================================================================== Installing: mysql-devel noarch 5.5-1.6.amzn1 amzn-main 2.7 k Installing for dependencies: mysql-config x86_64 5.5.61-1.22.amzn1 amzn-updates 49 k mysql55 x86_64 5.5.61-1.22.amzn1 amzn-updates 7.5 M mysql55-devel x86_64 5.5.61-1.22.amzn1 amzn-updates 201 k mysql55-libs x86_64 5.5.61-1.22.amzn1 amzn-updates 816 k Transaction Summary =============================================================================================================================================================== Install 1 Package (+4 Dependent packages) Total download size: 8.6 M Installed size: 32 M Is this ok [y/d/N]: y Downloading packages: (1/5): mysql-config-5.5.61-1.22.amzn1.x86_64.rpm | 49 kB 00:00:00 (2/5): mysql-devel-5.5-1.6.amzn1.noarch.rpm | 2.7 kB 00:00:00 (3/5): mysql55-5.5.61-1.22.amzn1.x86_64.rpm | 7.5 MB 00:00:00 (4/5): mysql55-libs-5.5.61-1.22.amzn1.x86_64.rpm | 816 kB 00:00:00 (5/5): mysql55-devel-5.5.61-1.22.amzn1.x86_64.rpm | 201 kB 00:00:00 --------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 15 MB/s | 8.6 MB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : mysql55-libs-5.5.61-1.22.amzn1.x86_64 1/5 Installing : mysql-config-5.5.61-1.22.amzn1.x86_64 2/5 Installing : mysql55-5.5.61-1.22.amzn1.x86_64 3/5 Installing : mysql55-devel-5.5.61-1.22.amzn1.x86_64 4/5 Installing : mysql-devel-5.5-1.6.amzn1.noarch 5/5 Verifying : mysql-config-5.5.61-1.22.amzn1.x86_64 1/5 Verifying : mysql55-libs-5.5.61-1.22.amzn1.x86_64 2/5 Verifying : mysql55-5.5.61-1.22.amzn1.x86_64 3/5 Verifying : mysql55-devel-5.5.61-1.22.amzn1.x86_64 4/5 Verifying : mysql-devel-5.5-1.6.amzn1.noarch 5/5 Installed: mysql-devel.noarch 0:5.5-1.6.amzn1 Dependency Installed: mysql-config.x86_64 0:5.5.61-1.22.amzn1 mysql55.x86_64 0:5.5.61-1.22.amzn1 mysql55-devel.x86_64 0:5.5.61-1.22.amzn1 mysql55-libs.x86_64 0:5.5.61-1.22.amzn1 Complete!
yum installに指定したパッケージのは mysql-devel
ですが、
Dependencies Resolved =============================================================================================================================================================== Package Arch Version Repository Size =============================================================================================================================================================== Installing: mysql-devel noarch 5.5-1.6.amzn1 amzn-main 2.7 k Installing for dependencies: mysql-config x86_64 5.5.61-1.22.amzn1 amzn-updates 49 k mysql55 x86_64 5.5.61-1.22.amzn1 amzn-updates 7.5 M mysql55-devel x86_64 5.5.61-1.22.amzn1 amzn-updates 201 k mysql55-libs x86_64 5.5.61-1.22.amzn1 amzn-updates 816 k Transaction Summary =============================================================================================================================================================== Install 1 Package (+4 Dependent packages)
のように、mysql-develは mysql55
に依存しているのでMySQLのクライアント、およびサーバのプログラムも入ります*5。
これだけ書くと yum install mysql
でよさそうな気もしますが、別途試したところ、mysql2のgemのCの部分をコンパイルするために mysql-devel
パッケージ内のヘッダが必要みたいです。
あらためてmysql2のgemをインストール
$ gem install mysql2 Building native extensions. This could take a while... Successfully installed mysql2-0.5.2 Parsing documentation for mysql2-0.5.2 Installing ri documentation for mysql2-0.5.2 Done installing documentation for mysql2 after 0 seconds 1 gem installed
成功しました。
もうちょっとよくわからないトラブルが起きてそのトラブルシューティングで知見をためようとおもっていたらすんなり進んで若干がっかりしていますが、まあいいですね。
現場からは以上です。
*1:https://www.gnu.org/software/bash/manual/html_node/Bourne-Shell-Builtins.html#Bourne-Shell-Builtins
*2:http://e-words.jp/w/gcc.html
*3:https://qiita.com/unsoluble_sugar/items/1403ddf0ac9709b1aae6#xcode%E3%82%92%E6%9C%80%E6%96%B0%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%87%E3%83%BC%E3%83%88 など
*4:https://ja.wikipedia.org/wiki/GNU_Readline irbとかで上キー押したら前のコマンド見れる、とかそういうところなんでしょうか...?
*5:mysql55だとサーバとクライアントの両方が入るんですが、一つのホストに必要なのは片方だけであることも多いので、サーバプログラム、クライアントプログラムをわけてインストールすることも可能 https://dev.mysql.com/doc/refman/5.6/ja/linux-installation-rpm.html