はじめに
2回目のデプロイ、新しくseedファイルに記述した情報を本番環境にも反映させたい!
しかしエラーが起きてしまったので解決までの流れを記載します✍️
エラー状況
デプロイを一通り行い、開発環境でログインできていた管理者側にログインするため
ターミナルからEC2にログイン、rails db:seed実行します。
EC2ログイン↓
ec2-user:~/environment/アプリ名 (main) $ ssh -i ~/.ssh/practice-aws.pem ec2-user@IPアドレス
アプリケーションへ移動↓
[ec2-user@ip-172-31-18-108 ~]$ cd アプリ名
rails db:seed実行(本番環境の時はRAILS_ENV=productionが必要)↓
[ec2-user@ip-172-31-18-108 アプリ名]$ RAILS_ENV=production rails db:seed
エラー文がこちら↓
rails aborted!
ActiveRecord::RecordInvalid: Validation failed: Email can't be blank, Password can't be blank
どうやらEmailとPasswordが空白になっていてバリデーションエラーが起きているようです!
seedsファイルを確認しにいきます!
Admin.find_or_create_by!(email: ENV['ADMIN_EMAIL']) do |admin|
admin.password = ENV['ADMIN_PASSWORD']
end
記述はちゃんとできている…ということはENVファイルの記述がおかしい?
ADMIN_EMAIL="管理者メールアドレス"
ADMIN_PASSWORD="管理者パスワード"
ENVファイルもちゃんと記述している…けどデータが取れていない可能性がある…?
ということでデータがちゃんと取れているか確認します!
エラー解決編
EC2にログインしたターミナルで、本番環境のenvファイルを確認します
[ec2-user@ip-172-31-18-108 アプリ名]$ cat .env
開発環境で.envに記述したものが出てこない!
というのもENVファイルはGitHubにアップしないので、
GitHubから最新版を取得しただけでは.envファイルは反映されません!!!(当たり前!!)
ということで、本番環境の.envファイルに直接記述していきます
[ec2-user@ip-172-31-18-108 アプリ名]$ vim .env
このコマンドでenvファイルをvi形式で修正して保存します(操作は割愛します)
rails cでデータが取れるか確認します
[ec2-user@ip-172-31-18-108 アプリ名]$ rails c -e production
irb(main):001:0> ENV['ADMIN_EMAIL']
=> ".envファイルに記述したメールアドレス"
出力されればOKです!exitで終了します
[ec2-user@ip-172-31-18-108 アプリ名]$ RAILS_ENV=production rails db:seed
データを追加しました
追加できた!!!よかった!!!
余談
余談ですが、このエラーが起きる前に別のエラーが出ておりそれも解決しましたのでメモしておきます。
エラー文↓
/home/ec2-user/.rvm/gems/ruby-3.1.2/gems/spring-4.2.1/lib/spring/application.rb:105:in `block in preload': Spring reloads, and therefore needs the application to have reloading enabled.
Please, set config.cache_classes to false in config/environments/production.rb.
(RuntimeError)
要するに、Springがアプリケーションの再ロードを行うためにconfig/environments/production.rb
ファイルを開き、config.cache_classes
の値をfalse
に変更してくださいとのことですね
ただ注意が必要なのが、こちらの記述は本番環境だとfalseに開発環境だとtrueにしないといけないことです
[ec2-user@ip-172-31-18-108 アプリ名]$ vim config/environments/production.rb
先ほどと同じようにviで該当箇所をfalseに修正して保存します
そこからrails:seedすればOKです
[ec2-user@ip-172-31-18-108 アプリ名]$ RAILS_ENV=production rails db:seed
最後に修正した箇所を元に戻します
viでもう一度修正してもいいですが他の方法があるので紹介します
[ec2-user@ip-172-31-18-108 アプリ名]$ git diff
diff --git a/config/environments/production.rb b/config/environments/production.rb
index 7a3f48b..683c48c 100644
--- a/config/environments/production.rb
+++ b/config/environments/production.rb
@@ -4,7 +4,7 @@ Rails.application.configure do
# Settings specified here will take precedence over those in config/application.rb.
# Code is not reloaded between requests.
- config.cache_classes = true
+ config.cache_classes = false
# Eager load code on boot. This eager loads most of Rails and
# your application in memory, allowing both threaded web servers
git diffコマンドを実行すると、修正された箇所を確認することができます
[ec2-user@ip-172-31-18-108 アプリ名]$ git checkout -- config/environments/production.rb
git checkout -- 修正ファイルパス、ファイル名を指定
上記コマンドで、修正した箇所を元に戻すことができます!
もう一度git diffを実行すると変更点が出てこなくなりました!
[ec2-user@ip-172-31-18-108 アプリ名]$ git diff
さいごに
初めてのデプロイでわからないことばかりですが、
なんとかフェーズ2も終わりを迎えそうです!
引き続き頑張ります!