[Rails6]AWS Cloud9(Amazon Linux)で動かしてみる

Rails

思いのほか苦労したので、まとめておく。SQLiteを使いたい場合は、2020/01/18現在、Amazon Linuxだと無理なので、Ubuntu Serverを利用してください。

開発環境

AWS Cloud9 (Amazon Linux AMI, 2018.03)

Ruby 2.6.3

Rails 6.0.2

結論(これしたらできる)

Railsのバージョンアップ

デフォルトではRails 5.0.0がインストールされているので、バージョンアップの必要がある。

$ gem i rails

以前に書いた下記の記事を参照。

インストールの確認

$ rails -v
Rails 6.0.2.1

PostgreSQLをインストールする

デフォルトではPostgreSQLがインストールされていないので、インストールしてあげる必要がある。バージョンに注意。下記の手順で行えば大丈夫。Is this ok [y/d/N]は yを入力してエンター。

$ sudo yum install postgresql95-devel postgresql95-server postgresql95-contrib

インストールの確認

$ psql --version
psql (PostgreSQL) 9.5.15

初期化とスタート

$ sudo service postgresql95 initdb
$ sudo service postgresql95 start

ec2-userを作成する

$ sudo -u postgres createuser -s ec2-user

could not change directory to “/home/ec2-user/environment”: Permission denied と言われるが無視。

Yarnのインストール

デフォルトではYarnもインストールされていないため、インストールしてあげる。Rails6からwebpackerを利用するのに必要になった。

まずはお約束のyumのアップデート

$ sudo yum update

レポジトリにyarnを追加する

$ curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo

yarnをインストール(聞かれる質問は全部 y を入力、エンター。)

$ sudo yum install yarn

インストールの確認

$ yarn -v
1.21.1

いつものRailsアプリ作成

$ rails new test-yuruli-app -d postgresql
$ cd test-yuruli-app
$ rails g scaffold user name:string nationality:string
$ rails db:create
$ rails db:migrate

Rails.hostsの追加

config/environments/development.rb にCloud9のドメインを追加する。Cloud9の開発環境のドメインを登録する。Preview > Preview Running Applicationで表示されるサイトのドメインを下記のように設定する。

Rails.application.configure do
  ・・・
  config.hosts << "7c90d6e4fc9e4c4d98478bc676ae43f6.vfs.cloud9.ap-northeast-1.amazonaws.com"
end

rails s

完成!!

下記は興味のある方やハマった方はぜひ読んでみてください!

試したことやトラブルシューティング

SQLiteを試した

結論から言うと、現状のAmazon Linuxだとできないらしい。どうしてもSQLiteを使いたい場合は、Cloud9の環境作成時にUbuntu Serverを選択するしかないとのこと。

まずはRailsアプリを作成する。

$ rails new test-yuruli-app
$ cd test-yuruli-app

本番環境はHerokuを想定しているので、DBのGemをproductionはpg, developmentとtestをsqliteとする。

group :production do
  gem 'pg', '>= 0.18', '< 2.0'
end

group :development, :test do
  # Use sqlite3 as the database for Active Record
  gem 'sqlite3', '~> 1.4'
end

デフォルトだとpostgreSQLはAmazon Linuxに入っていなくて、bundle installでこけるので、productionは読み来ないようにする。

$ bundle install --without production

Userモデルを作って、マイグレートをする。

$ rails g scaffold user name:string nationality:string
$ rails db:migrate
rails aborted!
Your version of SQLite (3.7.17) is too old. Active Record supports SQLite >= 3.8.

冒頭にも書いたが、このエラーが現状のAmazon Linuxだと解消できないとのこと。で諦める.。

下記のサイトを参考にさせていただきました。Ubuntu Serverでもよかったけど、Postgresでもいけるのではと思い、Postgresで試すことにした。

PostgreSQLで試す

Railsアプリを作成してbundle installする。

$ rails new test-yuruli-app -d postgresql
$ cd test-yuruli-app
$ bundle install

bundle install をすると Postgresが見つからないと言うことでエラーになるので、Cloud9にPostgreSQLをインストールこちらを参照。結果としてこの方法だとバージョンが古いので記事上部の結論を参考にしてください。

$ sudo yum install postgresql postgresql-server postgresql-devel postgresql-contrib
$ sudo service postgresql initdb
$ sudo service postgresql start

バージョンの確認(このバージョンだとRails6だと動かないっぽい。)

$ psql --version
psql (PostgreSQL) 9.2.24

再度bundle install→成功

$ bundle install

Userモデルを作成してマイグレートする

$ rails g scaffold user name:string nationality:string
$ rails db:migrate
rails aborted!
PG::ConnectionBad: FATAL:  role "ec2-user" does not exist

ec2-userは存在しないとのこと。psqlでuserを確認するとpostgresしかいない。なので、ec2-userを作成する。

$ sudo -u postgres createuser -s ec2-user
could not change directory to "/home/ec2-user/environment/test-yuruli-app2"

再度マイグレート

$ rails db:migrate
rails aborted!
ActiveRecord::NoDatabaseError: FATAL:  database "test_yuruli_app_development" does not exist

DBが存在していないと言われるので、DBを作成する。

$ sudo -u postgres psql
# create database test_yuruli_app2_development;
CREATE DATABASE
# \q

作成完了(rails db:createでもいける)。改めてマイグレート。

$ rails db:migrate
rails aborted!
Your version of PostgreSQL (90224) is too old. Active Record supports PostgreSQL >= 9.3.

出ました。バージョンが古いとのことです。でも、諦めずにググりました。

下記のサイトを見つけ、PostgreSQLの9.5をインストールして、上記と同じようにec2-userを作成したりdbを作成しました。手順は記事上部の結論をみてください。

もはや憎くなってきたマイグレートを試す

$ rails db:migrate
== 20200117142952 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0090s
== 20200117142952 CreateUsers: migrated (0.0091s) =============================

できた!!!

いよいよrails sからのもう一難

ようやく準備が整ったので、rails sを実行することに。

$ rails s
・・・
/home/ec2-user/.rvm/gems/ruby-2.6.3/gems/webpacker-4.2.2/lib/webpacker/configuration.rb:92:in `read': No such file or directory @ rb_sysopen - /home/ec2-user/environment/test-app/config/webpacker.yml (Errno::ENOENT)
・・・
/home/ec2-user/.rvm/gems/ruby-2.6.3/gems/webpacker-4.2.2/lib/webpacker/configuration.rb:95:in `rescue in load': Webpacker configuration file not found /home/ec2-user/environment/test-app/config/webpacker.yml. Please run rails webpacker:install Error: No such file or directory @ rb_sysopen - /home/ec2-user/environment/test-app/config/webpacker.yml (RuntimeError)

エラー。。。どうやらwebpacker周りでエラーになっている。webpacker.ymlが見つからない、rails webpacker:installをしてくださいと書いてあるので、実行する。

$ rails webpacker:install
Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/

Yarnがインストールされてない。そういえば、rails new した時にyarnをインストールして的なことが書いてあった。ログを見直すと、rails newをした時にrails webpacker:installを実行してくれていた。

 rails  webpacker:install
Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/

yarnをインストールする。URLに接続する。Operating system: で CentOSを選択する。コマンドが表示されるので愚直に実行していく。

$ curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
[yarn]
name=Yarn Repository
baseurl=https://dl.yarnpkg.com/rpm/
enabled=1
gpgcheck=1
gpgkey=https://dl.yarnpkg.com/rpm/pubkey.gpg

2個目のコマンドはnodejsがない場合と書いてあるので省略。nodejsの確認。

$ node -v
v10.18.1

3個目のコマンドを実行。Is this ok [y/d/N] は全てy。

$ sudo yum install yarn
・・・
Complete!

Complete!が表示されたので、無事完了。再度, webpackerのインストール。

$ rails webpacker:install
Webpacker successfully installed

成功した。webpacker.ymlも作成されていた。

改めてサーバーを起動する。

$ rails s
=> Booting Puma
=> Rails 6.0.2.1 application starting in development 
=> Run `rails server --help` for more startup options
Puma starting in single mode...
* Version 4.3.1 (ruby 2.6.3-p62), codename: Mysterious Traveller
* Min threads: 5, max threads: 5
* Environment: development
* Listening on tcp://127.0.0.1:8080
* Listening on tcp://[::1]:8080
Use Ctrl-C to stop

できた!(エラーはないというぐらいの期待値に留めている。)

次は実際にアプリケーションに接続してみる。

Cloud9の場合は、Preview > Preview Running Application から確認。

エラー。まじで期待値下げておいてよかった。笑

環境設定にコードを追加しろって書いてある。Rails6になってhostsの管理みたいなのが追加されたのかわからないけど、言われた通りにやってみる。config/environments/development.rbの一番したのendの直前にコードを加える

Rails.application.configure do
  ・・・
  config.hosts << "7c90d6e4fc9e4c4d98478bc676ae43f6.vfs.cloud9.ap-northeast-1.amazonaws.com"
end

サーバーを再起動する。

7c90d6e4fc9e4c4d98478bc676ae43f6.vfs.cloud9.ap-northeast-1.amazonaws.com で接続が拒否されました。これはいつものやつ。原因はわからないが、IDE内のブラウジングだとエラーが出る、URLをコピーして、ブラウザの別タブで開く

おなじみの画面が表示された。だいぶほっとした。でもまだ油断ができないので、/usersにアクセスする。余談だが、Rails6では、Railsのマークだったり、絵が少し変更されているらしい。

無事アクセスできた! CRUDが動くかも確認する。

/users/new

/users/1

/users

できたーーーー!スクショはないがDestroyも上手くいった。

感想

別のことを試したくて安易な気持ちでRails 6 でやってみたらどハマりした。アプリの内容はscaffoldするだけでよかったので、通常 rails sまで数分で済むのに、5,6時間かかったと思う。
本当に疲れた。笑
でも、洗礼を受けたというかRails 6というものを少し知れたのは大きい。
業務の方でRails6にバージョンアップを考えているので、覚悟しないといけない。
同じようなことに困った人に役に立てたら嬉しい。

コメント