AWS Cloud9 で Rails 開発環境をつくる

 Cloud9 が AWS に買収され、AWS Cloud9 としてリリースされてからもう結構経ってしまいましたが、 Lambda 等のサーバレスなサービスを使う機会が増えてきたり、コンテナ等を活用するようになってきたので、クラウドの IDE が便利に活用できるようなら使ってみたいということで、今更ではありますが Cloud9 で Rails の開発環境を作ってみました。

環境の作成

 まずは AWS のマネジメントコンソールから Cloud9 を検索して Cloud9 のコンソールにアクセスします。

f:id:akanuma-hiroaki:20190112132133p:plain

 リリースからそれなりに経っているものの、まだ東京リージョンでは Cloud9 は提供されていないので、東京リージョンを選択していると下記のようにリージョンの選択画面が表示されます。今回はシンガポールリージョンを使用します。

f:id:akanuma-hiroaki:20190112132325p:plain

 Cloud9 のコンソールが表示されたら Create environment をクリックします。

f:id:akanuma-hiroaki:20190112132646p:plain

 環境の作成フォームで環境の名前を設定します。今回は rails-dev としました。説明はオプションなので設定しなくても問題ありません。入力したら Next step をクリックします。

f:id:akanuma-hiroaki:20190112132837p:plain

 次に環境の設定を行います。今回は全てデフォルト値をそのまま使います。

 Cloud9 では IDE の接続先を EC2 かその他のリモート環境に ssh で接続するかを選択できます。今回は EC2 を使用するので、デフォルトの Create a new instance for environment [EC2] を選択します。

 EC2 への接続を選択した場合は EC2 インスタンスが新たに作成されますが、そのインスタンスタイプも選択できます。デフォルトの t2.micro を使用します。

 また、 Cloud9 では使用していない時間が続くと EC2 が停止しますが、停止するまでの時間も選択できます。これも今回はデフォルトのまま、 After 30 minutes を使用します。

 Next step をクリックして次へ進みます。

f:id:akanuma-hiroaki:20190112133313p:plain

 設定内容の確認画面が表示されますので、内容に問題がなければ Create environment をクリックします。

f:id:akanuma-hiroaki:20190112133408p:plain

 環境が作成されるまでには少し時間がかかります。作成されるまでの間は下記のような画面が表示されます。

f:id:akanuma-hiroaki:20190112133526p:plain

 環境が作成されると下記のように IDE の画面が表示されます。作成されたインスタンスのホームディレクトリには environment というディレクトリが作成され、デフォルトの構成では、左ペインに environment ディレクトリ配下のファイルがツリー表示されます。右側の上部ペインにはエディタ、下部ペインにはターミナルが表示されます。

f:id:akanuma-hiroaki:20190112133925p:plain

 ファイルツリーからファイルをダブルクリックすると右側のエディタに表示されます。

f:id:akanuma-hiroaki:20190112134033p:plain

 右上の設定マーク(歯車マーク)等から設定画面を開くことができ、エディタ等の設定を変更することができますので、とりあえずいくつか設定してみます。

 まず Code Editor の設定で Soft Tabs をデフォルトの 4 から 2 に変更します。

f:id:akanuma-hiroaki:20190112134533p:plain

 私は普段エディタには Vim を使ってるので、 Keyboard Mode を Vim に変更します。

f:id:akanuma-hiroaki:20190112134729p:plain

 テーマもターミナルっぽい方が好きなので、 Cloud9 Night に変更してみます。

f:id:akanuma-hiroaki:20190112134959p:plain

 ターミナルのスタイルも変更できますので、背景色を黒、文字色を白に変更します。また、スクロールバックのバッファもデフォルトの 1,000 だと少ないので、 10,000 に変更しておきます。

f:id:akanuma-hiroaki:20190112135545p:plain

 設定変更後の画面は下記のような感じになります。

f:id:akanuma-hiroaki:20190112135633p:plain

 ターミナルで作業するときにはターミナルを全画面表示することもできます。

rvm のアンインストール

 ひとまず Cloud9 の環境としては作成されたので、 Rails の環境を作っていきます。まずは Ruby からですが、デフォルトでも Ruby は使えるようになっています。

$ ruby -v
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]

 デフォルトでは Ruby の実行環境の管理には rvm が使われています。

$ which ruby
/usr/local/rvm/rubies/ruby-2.4.1/bin/ruby

 Rails も入っています。

$ which rails
/usr/local/rvm/rubies/ruby-2.4.1/bin/rails
$ rails -v
Rails 5.2.2

 これは好みですが、私は rvm より rbenv の方が好きなので、 rvm をアンインストールして、 rbenv をインストールしたいと思います。 rvm のアンインストールは rvm implode でできますが、 root 権限が必要なので、 sudo でフルパス指定で実行します。

$ sudo /usr/local/rvm/bin/rvm implode
Are you SURE you wish for rvm to implode?
This will recursively remove /usr/local/rvm and other rvm traces?
(anything other than 'yes' will cancel) > yes
Removing rvm-shipped binaries (rvm-prompt, rvm, rvm-sudo rvm-shell and rvm-auto-ruby)
Removing rvm wrappers in /usr/local/rvm/bin
Hai! Removing /usr/local/rvm
/usr/local/rvm has been removed.

Note you may need to manually remove /etc/rvmrc and ~/.rvmrc if they exist still.
Please check all .bashrc .bash_profile .profile and .zshrc for RVM source lines and delete or comment out if this was a Per-User installation.
Also make sure to remove `rvm` group if this was a system installation.
Finally it might help to relogin / restart if you want to have fresh environment (like for installing RVM again).

 これで rvm がアンインストールされ、 Ruby も使えなくなりました。

$ which ruby
/usr/bin/which: no ruby in (/home/ec2-user/.nvm/versions/node/v6.15.1/bin:/usr/local/bin:/bin:/usr/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/aws/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin:/home/ec2-user/.local/bin:/home/ec2-user/bin)

rbenv のインストール

 では rbenv をインストールします。と言っても特に Cloud9 固有なことはありません。 git はデフォルトで入っているので、 rbenv を git clone します。

$ git clone https://github.com/rbenv/rbenv.git ~/.rbenv
Cloning into '/home/ec2-user/.rbenv'...
remote: Enumerating objects: 2744, done.
remote: Total 2744 (delta 0), reused 0 (delta 0), pack-reused 2744
Receiving objects: 100% (2744/2744), 523.32 KiB | 532.00 KiB/s, done.
Resolving deltas: 100% (1720/1720), done.

 そしてコンパイルします。

$ cd ~/.rbenv && src/configure && make -C src
make: Entering directory `/home/ec2-user/.rbenv/src'
gcc -fPIC     -c -o realpath.o realpath.c
gcc -shared -Wl,-soname,../libexec/rbenv-realpath.dylib  -o ../libexec/rbenv-realpath.dylib realpath.o 
make: Leaving directory `/home/ec2-user/.rbenv/src'

 起動時にパスが通るように .bash_profile に設定を追加します。

$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile

 また、起動時に実行されるように設定を .bash_profile に追加します。

$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

 別ターミナルを起動して rbenv コマンドが使えるようになっていることを確認します。

$ rbenv -v
rbenv 1.1.1-39-g59785f6

 続けて ruby-build を git clone します。

$ git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
Cloning into '/home/ec2-user/.rbenv/plugins/ruby-build'...
remote: Enumerating objects: 29, done.
remote: Counting objects: 100% (29/29), done.
remote: Compressing objects: 100% (18/18), done.
remote: Total 9620 (delta 9), reused 22 (delta 7), pack-reused 9591
Receiving objects: 100% (9620/9620), 2.03 MiB | 1.40 MiB/s, done.
Resolving deltas: 100% (6275/6275), done.

 Ruby 2.6 は12月にリリースされたばかりで、まだ Rails のバージョンとの相性等は確認してませんが、今回はとりあえず細かいことは考えずに最新の 2.6 をインストールしてみます。

$ rbenv install 2.6.0
Downloading ruby-2.6.0.tar.bz2...
-> https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0.tar.bz2
Installing ruby-2.6.0...
Installed ruby-2.6.0 to /home/ec2-user/.rbenv/versions/2.6.0

 インストールしただけだと下記のようにエラーになってしまってまだ使えません。

$ ruby -v
rbenv: ruby: command not found

The `ruby' command exists in these Ruby versions:
  2.6.0

 なのでデフォルトのバージョンを 2.6 に設定します。

$ rbenv global 2.6.0
$ ruby -v
ruby 2.6.0p0 (2018-12-25 revision 66547) [x86_64-linux]

 これでひとまず Ruby が使える環境ができました。ついでに gem インストール時にドキュメントがインストールされないように .gemrc に設定を追加しておきます。

$ printf "install: --no-rdoc --no-ri\nupdate:  --no-rdoc --no-ri\n" >> ~/.gemrc

Rails インストール

 では最後に Rails をインストールします。

$ gem install rails
Fetching rack-test-1.1.0.gem
Fetching activesupport-5.2.2.gem
Fetching i18n-1.5.1.gem
Fetching tzinfo-1.2.5.gem
Fetching thread_safe-0.3.6.gem
Fetching rack-2.0.6.gem
Fetching concurrent-ruby-1.1.4.gem
Fetching loofah-2.2.3.gem
Fetching rails-html-sanitizer-1.0.4.gem
〜〜〜以下略〜〜〜

 これで最新の Rails が使えるようになりました。ちなみに gem も rails も rbenv でインストールされた現在のバージョンの Ruby 環境に紐づいているので、 rbenv で Ruby のバージョンを切り替えたときには改めて rails 等もインストールする必要があります。

$ rails -v
Rails 5.2.2
$ which rails
~/.rbenv/shims/rails

 試しに Rails アプリを作成してみます。

$ rails new hello_cloud9
      create  
      create  README.md
      create  Rakefile
      create  .ruby-version
      create  config.ru
      create  .gitignore
      create  Gemfile
         run  git init from "."
Initialized empty Git repository in /home/ec2-user/environment/hello_cloud9/.git/
      create  package.json
      create  app
      create  app/assets/config/manifest.js
      create  app/assets/javascripts/application.js
      create  app/assets/javascripts/cable.js
〜〜〜以下略〜〜〜

 問題なく作成されたらアプリを起動してみます。

$ cd hello_cloud9/
$ rails s
=> Booting Puma
=> Rails 5.2.2 application starting in development 
=> Run `rails server -h` for more startup options
Puma starting in single mode...
* Version 3.12.0 (ruby 2.6.0-p0), codename: Llamas in Pajamas
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://localhost:8080
Use Ctrl-C to stop

 ローカルで開発しているときはブラウザを開いてアクセス確認をしますが、 Cloud9 の場合はコンソールからプレビュー用のメニューを選択します。

f:id:akanuma-hiroaki:20190112140019p:plain

 コンソール内にプレビュー用のペインが表示されますが、その中では表示されないので(原因はまだ調べてませんが)、ブラウザの別タブとして開くためのボタンをクリックします。

f:id:akanuma-hiroaki:20190112140444p:plain

 ブラウザの新しいタブで下記のように Rails のデフォルト画面が表示されれば成功です。

f:id:akanuma-hiroaki:20190112140535p:plain

まとめ

 今更ながらに Cloud9 で環境を作ってみましたが、思ったよりもかなり使いやすそうでした。エディタも用意されていますが、普段 Vim を使っているので、 Vim の環境を整えてターミナルの方を全画面表示してしまえば、ローカルで使っているのに近い感じで使えそうです。

f:id:akanuma-hiroaki:20190112141022p:plain

 クラウドの IDE はローカルの環境に依存せずに使えるのも良いですし、Lambda 等の AWS リソースとの連携もやりやすくなっているようなのでその辺りも今後試してみようと思います。

 利用料は Cloud9 自体は無料ですが EC2 の利用料金はかかるので、実際にどれぐらいになるかも確認してみたいと思います。