概要
下記記事を参考に、RailsアプリをAWS上で動かす設定をしていたが、unicornの起動から色々とハマった。
その際の解決方法について。
環境
-
アプリ
- ruby 3.0.2
- rails 6.1.4
- mysql 8.0.31
-
EC2AMI
- Amazon Linux2 AMI
unicorn起動
ターミナル(EC2)
# xx-xx-xx-xxはパプリックIPアドレス
[ec2-user@ip-xx-xx-xx-xx <app名>]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
エラー発生
master failed to start, check stderr log for details
エラー内容確認
ログをチェック
cat log/unicorn.stderr.log
エラー内容抜粋
関係ありそうなログの記述は大きく下記の2つ。
log/unicorn.stderr.log
エラー①
Access denied for user 'ec2-user'@'localhost' (using password: NO) (ActiveRecord::ConnectionNotEstablished)
エラー②
Unknown MySQL server host 'db' (-2) (ActiveRecord::ConnectionNotEstablished)
確認事項1:そもそもDBは作ったか?
ターミナル(EC2)
[ec2-user@ip-xx-xx-xx-xx <app名>]$ mysql -u root -p
Enter password: パスワードを入力
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 68
Server version: 8.0.31 MySQL Community Server - GPL
# データベースを確認
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.04 sec)
データベースが作成されていないことが判明。
# データベースを作成
[ec2-user@ip-xx-xx-xx-xx <app名>]$ rails db:create RAILS_ENV=production
実行すると、別のエラーが発生。
Caused by:
Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2)
確認事項2:本番環境のdatabase設定は正確に行っているか?
エラー②と同じように、「'db'という名前のhostに接続できない」ことでエラーとなっている様子。
DBのhost名称設定は、config/database.ymlで規定している。
config/database.yml
default: &default
adapter: mysql2
encoding: utf8mb4
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
username: root
password: <%= ENV['DATABASE_DEV_PASSWORD'] %>
host: db
--中略--
production:
<<: *default
database: <%= Rails.application.credentials.db[:database] %>
username: <%= Rails.application.credentials.db[:username] %>
password: <%= Rails.application.credentials.db[:password] %>
socket: <%= Rails.application.credentials.db[:socket] %>
production環境のhostは、defaultで規定した'db'となっている。
これを、productionのみ'localhost'としてみる。
# 一旦本番環境のソースを直接修正
[ec2-user@ip-xx-xx-xx-xx <app名>]$ vim config/database.yml
config/database.yml修正後
--修正箇所抜粋--
production:
<<: *default
database: <%= Rails.application.credentials.db[:database] %>
username: <%= Rails.application.credentials.db[:username] %>
password: <%= Rails.application.credentials.db[:password] %>
socket: <%= Rails.application.credentials.db[:socket] %>
host: localhost
これにより、下記DB作成が正常に実行できた。
# データベースを作成
[ec2-user@ip-xx-xx-xx-xx <app名>]$ rails db:create RAILS_ENV=production
unicorn起動
ターミナル(EC2)
[ec2-user@ip-xx-xx-xx-xx <app名>]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
エラーの発生は無し。
起動自体はできていることを確認。
ターミナル(EC2)
[ec2-user@ip-xx-xx-xx-xx <app名>]$ ps -ef | grep unicorn | grep -v grep
ec2-user 22015 1 0 11:32 ? 00:00:01 unicorn_rails master -c config/unicorn.rb -E production -D
ec2-user 22017 22015 0 11:32 ? 00:00:00 unicorn_rails worker[0] -c config/unicorn.rb -E production -D
最後に
より良い方法や間違い等ありましたらご指摘いただけますと幸いです!