OCIでRuby(とRuby on Rails)をはじめよう (2022/01/29)
OCIでRuby(とRuby on Rails)をはじめよう (2022/01/29)
https://medium.com/oracledevs/getting-started-with-ruby-and-ruby-on-rails-on-oci-3ce2d4c65833
投稿者:Tim Clegg
Photo by Christina Morillo from Pexels
私はRubyが好きです。さまざまなアプリケーションで使わせてもらっていますが、その適応性の高さは本当に素晴らしいです。オブジェクト指向の良さは素晴らしいですね。必要な機能を必要な時に素早く簡単にモンキーパッチできるのは、恵みでもあり呪いでもあります。多くの柔軟性(私ではないのですが、多すぎると主張する人もいます)が、これから導入しようとする人の意欲をそぐかもしれませんが、それ以外の人にとっては、素晴らしいものです。
とはいえ、Rubyの人気は以前ほどではありません。Pythonが登場し、(少なくとも高級ランタイム言語としては)多くの脚光を浴びるようになったのです。特にPython 3ではオブジェクト指向がサポートされ、Pythonは良い言語だと思います。とはいえ、私は今でもRubyが好きです。C、C++、ASM、PHP、Python、その他多くの言語でプログラミングをしてきました。それでも、Rubyは私の心の中で特別な位置を占めているのです。
この記事は、OCIでRubyをより簡単に使うための一助になればという思いから生まれました。本当に基本的なトピックなので、必要ない/欲しいと思っているユーザーもいるかもしれませんが、多くの人が参考になる可能性が高いです。早速ですが、Ruby (と Ruby on Rails) 用の OCI インスタンスをブートストラップする方法について説明します。
ええと...これは単純な話です。なぜこの記事なのか?
ええ、わかっています。それが私の最初の反応でした。この特定のシナリオを、私の最初の反応より少し単純でなくするいくつかの変数があります。
- aarch64
- rbenv
aarch64アーキテクチャは、地球を揺るがすようなプラットフォームではないはずです。結局のところ、Raspberry Pi(およびその他の組み込み/IoT)デバイスの多さだけでも(企業におけるRISCベースのプラットフォームの復活は言うまでもなく)、aarch64が数年前にあったような奇妙な隣人ではないことを意味します。悲しいことに、すべての開発者が時代に追いついているわけではないので、aarch64では正しく動作しない(読んで字のごとく、まったくインストールできない)ライブラリやツールが時々存在します。これは変更されるでしょう。これは避けられないことなのです。時間と技術は容赦なく先に進みますから、時間の問題です。とはいえ、私はこのことにとても興奮しており、私のソリューションにおいて可能な限りポリグロット(AMD64とaarch64を利用する)になるよう最善を尽くしており、通常はもうaarch64をデフォルトとしています。
Rubyはdnf install rubyで利用できるので、rbenvは本当にここでの大きな要因の一つです。
[opc@ruby ~]$ dnf info ruby
Oracle Linux 8 BaseOS Latest (aarch64) 77 kB/s | 3.6 kB 00:00
Oracle Linux 8 BaseOS Latest (aarch64) 44 MB/s | 38 MB 00:00
Oracle Linux 8 Application Stream (aarch64) 103 kB/s | 3.9 kB 00:00
Oracle Linux 8 Application Stream (aarch64) 46 MB/s | 27 MB 00:00
Oracle Linux 8 Addons (aarch64) 69 kB/s | 3.0 kB 00:00
Available Packages
Name : ruby
Version : 2.5.9
Release : 107.module+el8.4.0+20203+c00aa653
Architecture : aarch64
Size : 87 k
Source : ruby-2.5.9-107.module+el8.4.0+20203+c00aa653.src.rpm
Repository : ol8_appstream
Summary : An interpreter of object-oriented scripting language
URL : http://ruby-lang.org/
License : (Ruby or BSD) and Public Domain and MIT and CC0 and zlib and UCD
Description : Ruby is the interpreted scripting language for quick and easy
: object-oriented programming. It has many features to process text
: files and to do system management tasks (as in Perl). It is simple,
: straight-forward, and extensible.
[opc@ruby ~]$
本格的なRubyの開発では、Rubyランタイム(Railsやその他のgemはもちろん)を制御する必要があります。そこで、rbenvが威力を発揮します。この記事は sudo dnf install ruby で回避することもできますが、yum repo でその時点で利用可能な特定のバージョンをインストールしてしまいます...これは私が望んでいることではありませんね。このチュートリアルの下の方で、yum repo のバージョン (上記) が 2.5.9 であるのに対し、私は 3.0.1 をインストールすることを選択したことにお気づきでしょう。多分、あなたにとって、それは世界の終わりではありませんが、私はもう少し制御できるものが欲しかったのです。他の多くのRuby開発者も、このレベルのコントロールを望んでいるのではないでしょうか。
OCIについて少し
話を続ける前に、ここで少し立ち止まり、これから起こることの背景を整理しておく必要があります。Oracle Cloud Infrastructure (OCI)です。まだOCIアカウントをお持ちでない方は、是非とも取得されることをお勧めします。
なぜOCIアカウントを取得する必要があるのでしょうか?
よくぞ聞いてくれました。OCI Always Freeのアカウントでは、コンピュート、ストレージ、DB、その他多くのOCIクラウドサービスを無料で利用することができます。いつまでも。ええ...その通りです。永遠に!私たちがここで仕事をする理由も、納得できますよね?アカウント登録はこちらから。私の尊敬する同僚、クリスが書いた素晴らしいハウツーをご覧ください。
Getting started
まず、OCI Computeインスタンスを作成し、ログインすることから始めます。もし、この方法がわからなければ、Chrisが別のチュートリアルを書いていますので、それを見てください。私は、A1ベースのシェイプ(VM.Standard.A1.Flex)で、その時点で利用可能な最新のOracle Linux 8のイメージを使用することにしました。私はインスタンスにarm CPUを選びましたが、amd64ベースのCPUでも同じように使えます。何かをする前に、システムをアップグレードしましょう。
[opc@ruby ~]$ sudo dnf update -y && sudo dnf upgrade -y
ゼロから始めた、新しいインスタンスです。さあ、お楽しみに rbenvのインストールにはいくつかの方法がありますが、私はrbenvのインストールスクリプトを使用することにします。では、やってみましょう。
[opc@ruby ~]$ curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash[opc@ruby ~]$ echo 'PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
[opc@ruby ~]$ source ~/.bashrc
[opc@ruby ~]$ echo 'eval "$(rbenv init - bash)"' >> ~/.bash_profile
[opc@ruby ~]$ source ~/.bash_profile
やったー これでrbenvのセットアップは完了です。あとは開発ツールやその他のパッケージ(ライブラリ)をインストールして、Rubyをローカルにビルド・インストールできるようにします(詳しくはこのページを参照してください)。
[opc@ruby ~]$ sudo dnf config-manager --set-enabled ol8_codeready_builder
[opc@ruby ~]$ sudo dnf groupinstall -y 'Development Tools'
[opc@ruby ~]$ sudo dnf install -y openssl-devel libffi-devel readline-devel gdbm-devel ncurses-devel libyaml-devel
libyaml-devel パッケージは ol8_codeready_builder の yum repo に入っているので (詳しくはこのページを参照)、これが有効になったということは言っておく必要があります。上記のコマンドはかなりの数のパッケージをインストールするので、その間はじっと我慢してください。これでRubyランタイムをビルドできるようになったので、最初のRubyランタイムをインストールしましょう。
rbenvを使ったRubyのインストール
システムにRubyランタイムが(まだ)インストールされていないことに注目してください。
[opc@ruby ~]$ ruby -v
-bash: ruby: command not found
[opc@ruby ~]$
rbenvでは、グローバルな(システム全体の、デフォルトの)Rubyランタイムの設定と、指定したディレクトリ(プロジェクトやアプリケーションを想定)に特定のRubyランタイムをインストールするオプションが用意されているのです。今回は、1つのグローバルなランタイムを設定することにします。まず、利用可能な最新のランタイムバージョンを確認する必要があります。
[opc@ruby ~]$ rbenv install -l
2.6.9
2.7.5
3.0.3
3.1.0
jruby-9.3.3.0
mruby-3.0.0
rbx-5.0
truffleruby-22.0.0.2
truffleruby+graalvm-22.0.0.2Only latest stable releases for each Ruby implementation are shown.
Use 'rbenv install --list-all / -L' to show all local versions.
[opc@ruby ~]$
あなたのマシンでこれを実行した場合、おそらく異なる出力が表示されるでしょう。私の場合は、3.1.0をインストールします(最新のものであれば、お好みでどうぞ)。
警告:バージョンは常に変化しています。あなたの環境に合ったバージョンを選んでください(この記事で紹介したバージョンとは異なる可能性があります)。
注意: dtrace
続ける前に...rbenv install を実行しようとすると、私がぶつかったような、dtrace が失敗する問題にぶつかる可能性があります。
[opc@ruby ~]$ rbenv install 3.1.0
Installing ruby-3.1.0...BUILD FAILED (Oracle Linux Server 8.5 using ruby-build 20220125)Inspect or clean up the working tree at /tmp/ruby-build.20220126152117.391237.wsPH1J
Results logged to /tmp/ruby-build.20220126152117.391237.logLast 10 log lines:
compiling vm_backtrace.c
compiling vm_dump.c
compiling vm_sync.c
compiling vm_trace.c
compiling yjit.c
assembling coroutine/arm64/Context.S
processing probes in object files
dtrace: failed to link script ./probes.d: an error was encountered while processing array.o
DTrace 2.0.0 [Pre-Release with limited functionality]
make: *** [Makefile:469: probes.o] Error 1
[opc@ruby ~]$
ネットで検索してみると、dtraceを無効化するという記事を見つけました。
前へ進む
ということで、インストールを進めていきましょう。./configure を実行するときに - disable-dtrace 引数を渡す RUBY_CONFIGURE_OPTS 環境変数を設定しているのは、そのためだとわかると思います。
[opc@ruby ~]$ RUBY_CONFIGURE_OPTS="--disable-dtrace" rbenv install -v 3.1.0
ここで、rbenvはこれをグローバルなRubyランタイムとして設定する必要があります。
[opc@ruby ~]$ rbenv global 3.1.0
これで、実際に動く、機能するRubyランタイムが手に入りました 見てみてください。
[opc@ruby ~]$ ruby -v
ruby 3.1.0p0 (2021-12-25 revision fb4df44d16) [aarch64-linux]
[opc@ruby ~]$
やったー これをちょっとだけリファクタリングして、rbenvコマンドを短くできるようにしましょう(シェルのデフォルトでRUBY_CONFIGURE_OPTS変数を設定します)。
[opc@ruby ~]$ echo 'export RUBY_CONFIGURE_OPTS="--disable-dtrace"' >> ~/.bashrc
[opc@ruby ~]$ source ~/.bashrc
これで、より短いコマンドでrbenvを実行できるようになりました。
[opc@ruby ~]$ rbenv install 2.7.5
ほらね うまくいきました。環境変数として「dtraceを無効にする」フラグを設定したので、これで完全にこれを無視して楽しく道を進むことができます(それはそこに、常に存在します)。これはちょっとした旅でしたが、とんでもなく巨大なものではありませんでした。それでも、Oracle Linux on OCI を使った Ruby 開発を手っ取り早く始めるための「簡単な道筋」を示すことは価値があります。
Railsのインストール
Rubyはとても素晴らしいものですが...Webアプリを作るなら、おそらくRails(別名Ruby on Rails、略称RoR)フレームワークを使いたいと思うことでしょう。Rubyがインストールされていれば、これは実に簡単です! Railsのインストール方法に従って、必要なものを以下に示します。
[opc@ruby ~]$ sudo dnf install -y nodejs
Yarnのインストールが必要です(インストール方法に従ってください)。
[opc@ruby ~]$ sudo npm i -g corepack
Railsが使用するいくつかのgemsで必要となるパッケージとライブラリをインストールしましょう。
[opc@ruby ~]$ sudo dnf install sqlite-devel
[opc@ruby ~]$ bundle config set force_ruby_platform true
2番目のコマンドを指定しない場合、nokogiriのインストールは失敗します。
...
ERROR: It looks like you're trying to use Nokogiri as a precompiled native gem on a system with glibc < 2.17:/lib64/libm.so.6: version `GLIBC_2.29' not found (required by /home/opc/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/nokogiri-1.13.1-aarch64-linux/lib/nokogiri/3.1/nokogiri.so) - /home/opc/.rbenv/versions/3.1.0/lib/ruby/gems/3.1.0/gems/nokogiri-1.13.1-aarch64-linux/lib/nokogiri/3.1/nokogiri.soIf that's the case, then please install Nokogiri via the `ruby` platform gem:
gem install nokogiri --platform=ruby
or:
bundle config set force_ruby_platform truePlease visit https://nokogiri.org/tutorials/installing_nokogiri.html for more help.
...
そして、glibc 2.28があるようです。
[opc@ruby ~]$ ldd --version
ldd (GNU libc) 2.28
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
[opc@ruby ~]$
そこで、指示に従い、bundler に Ruby プラットフォームを使用するように指示します。Rails のインストール手順でいくつか省略されていることに気づくかもしれませんが、これはシステムがすでに持っているためです。Rails gem のインストールから始めます。
[opc@ruby ~]$ gem install rails
Railsが見られていることを確認するためのテスト。
[opc@ruby ~]$ rails --version
Rails 7.0.1
[opc@ruby ~]$
Railsのプロジェクトを新規に作成する。
[opc@ruby ~]$ rails new my_app
そして、イグニッションができました これでRailsアプリをスピンアップできるようになりました。やりたいことによっては、他にも必要なものがあるかもしれません(Redisやそれに相当するもの、ターボストリームなどの使用など)。ここから先はお好きにどうぞ。次の素晴らしいRailsアプリケーションを構築するための強固なプラットフォームができたと言えば十分でしょう!!!
これを自動化する
これはすべて、コンピュートインスタンスのcloud-initの一部として自動化することができます。これは、コンピュートインスタンスをスピンアップするときに、OCIコンソールに直接コピー&ペーストすることができます。以下はその方法です。コンピュートインスタンスを作成する際、「Create」ボタンをクリックする前に、「Show Advanced Options」(画面下部)をクリックします。
次に、"管理 "タブで、"初期化スクリプト"の見出しの下にある "cloud-initスクリプトの貼り付け"のラジオ選択を選択します。
そして、次のテキストをテキストボックスに貼り付けてください。
#cloud-configruncmd:
- dnf config-manager --set-enabled ol8_codeready_builder
- dnf update -y && dnf upgrade -y
- dnf groupinstall -y 'Development Tools'
- dnf install -y openssl-devel libffi-devel readline-devel gdbm-devel ncurses-devel libyaml-devel
- su - opc -c "curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash"
- su - opc -c "echo 'PATH=\$HOME/.rbenv/bin:\$PATH' >> ~/.bashrc"
- su - opc -c "echo 'export PATH' >> ~/.bashrc"
- su - opc -c "echo 'eval \"\$(rbenv init - bash)\"' >> ~/.bash_profile"
- su - opc -c "echo 'export RUBY_CONFIGURE_OPTS=\"--disable-dtrace\"' >> ~/.bashrc"
# update this to whatever version of Ruby you'd like installed (this will be outdated and potentially unsafe very quickly)
- su - opc -c "rbenv install 3.1.0"
- su - opc -c "rbenv global 3.1.0"
# begin Rails part - remove if not needed
- dnf install -y nodejs sqlite-devel
- npm i -g corepack
- su - opc -c "bundle config set force_ruby_platform true"
- su - opc -c "gem install rails"
# let us know things are all done
- su - opc -c "echo '1' >> ~/cloud-init-status.txt"
これで、上記の内容がインスタンスに渡されます。もし必要であれば、コンピュートインスタンスのTerraformリソース定義にこれを埋め込みます。
resource "oci_core_instance" "my_compute" {
...
metadata {
...
user_data = "${base64encode(file("ror.tpl"))}"
...
}
...
}
そして、これが ror.tpl ファイルの内容です (上記と同じ内容であることに注意してください。インスタンスを作成する際に OCI コンソールにコピーした内容です)。
#cloud-configruncmd:
- dnf config-manager --set-enabled ol8_codeready_builder
- dnf update -y && dnf upgrade -y
- dnf groupinstall -y 'Development Tools'
- dnf install -y openssl-devel libffi-devel readline-devel gdbm-devel ncurses-devel libyaml-devel
- su - opc -c "curl -fsSL https://github.com/rbenv/rbenv-installer/raw/HEAD/bin/rbenv-installer | bash"
- su - opc -c "echo 'PATH=\$HOME/.rbenv/bin:\$PATH' >> ~/.bashrc"
- su - opc -c "echo 'export PATH' >> ~/.bashrc"
- su - opc -c "echo 'eval \"\$(rbenv init - bash)\"' >> ~/.bash_profile"
- su - opc -c "echo 'export RUBY_CONFIGURE_OPTS=\"--disable-dtrace\"' >> ~/.bashrc"
# update this to whatever version of Ruby you'd like installed (this will be outdated and potentially unsafe very quickly)
- su - opc -c "rbenv install 3.1.0"
- su - opc -c "rbenv global 3.1.0"
# begin Rails part - remove if not needed
- dnf install -y nodejs sqlite-devel
- npm i -g corepack
- su - opc -c "bundle config set force_ruby_platform true"
- su - opc -c "gem install rails"
# let us know things are all done
- su - opc -c "echo '1' >> ~/cloud-init-status.txt"
Ruby、rbenv、Railsがすぐに使える状態で、完全に機能するOCI コンピュートインスタンスを手に入れることができるのです。Railsが不要なら、その部分を省略すればいい......ということです。
cloud-initはバックグラウンドで(ほとんど無音で)実行されるため、完了したらファイルに書き出すことになります。このため、すべての作業が終了したらファイルに書き込むようになっています。もし、何をやっているのかモニターしたい場合は、これを試してみてください。
[opc@ruby ~]$ sudo tail -f /var/log/cloud-init-output.log
これで、何をしているのかがわかります。インスタンスの作成が完了するまでには、数分かかると思われます。しかし、数分でインスタンスを作成することができますので、安心してください。cloud-initが完全に完了した後、新しいシェルセッションを開かなかった場合は、忘れずに実行してください。
[opc@ruby ~]$ source ~/.bash_profile
そうでない場合は、シェル(SSH)セッションを終了し、新しいセッションを開始します。この時点で、Rubyにアクセスし、使用できるようになるはずです!
まとめ
これで、Ruby開発のための素晴らしいプラットフォームが手に入りました。手動でセットアップするだけでなく、完全に自動化された方法もあるのです。なんてクールなんでしょう! 次回まで、ハッピーコーディング、そしてビットを流し続けてくださいね。
コメント
コメントを投稿