思いのほか苦労したので、まとめておく。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が動くかも確認する。
できたーーーー!スクショはないがDestroyも上手くいった。
感想
別のことを試したくて安易な気持ちでRails 6 でやってみたらどハマりした。アプリの内容はscaffoldするだけでよかったので、通常 rails sまで数分で済むのに、5,6時間かかったと思う。
本当に疲れた。笑
でも、洗礼を受けたというかRails 6というものを少し知れたのは大きい。
業務の方でRails6にバージョンアップを考えているので、覚悟しないといけない。
同じようなことに困った人に役に立てたら嬉しい。
コメントを残す