本番環境(EC2)上でunicornが起動できない時に確認すべきこと

# 概要
下記記事を参考に、RailsアプリをAWS上で動かす設定をしていたが、unicornの起動から色々とハマった。
その際の解決方法について。

https://qiita.com/gyu_outputs/items/b123ef229842d857ff39#%E3%83%A6%E3%83%8B%E3%82%B3%E3%83%BC%E3%83%B3%E3%82%92%E8%B5%B7%E5%8B%95

# 環境
- アプリ
  - ruby 3.0.2
  - rails 6.1.4
  - mysql 8.0.31

- EC2AMI
    - Amazon Linux2 AMI 

## unicorn起動
```terminal:ターミナル（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
```

## エラー発生
```terminal
master failed to start, check stderr log for details
```

## エラー内容確認
### ログをチェック
```terminal
cat log/unicorn.stderr.log
```

### エラー内容抜粋
関係ありそうなログの記述は大きく下記の２つ。
```terminal: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は作ったか？
```terminal:ターミナル（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)
```
データベースが作成されていないことが判明。


```console
 # データベースを作成
[ec2-user@ip-xx-xx-xx-xx <app名>]$ rails db:create RAILS_ENV=production
```

実行すると、別のエラーが発生。
```console
Caused by:
Mysql2::Error::ConnectionError: Unknown MySQL server host 'db' (-2)
```
## 確認事項2：本番環境のdatabase設定は正確に行っているか？
エラー②と同じように、「'db'という名前のhostに接続できない」ことでエラーとなっている様子。
DBのhost名称設定は、config/database.ymlで規定している。

```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'としてみる。

```console
# 一旦本番環境のソースを直接修正
[ec2-user@ip-xx-xx-xx-xx <app名>]$ vim config/database.yml
```

```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作成が正常に実行できた。
```console
 # データベースを作成
[ec2-user@ip-xx-xx-xx-xx <app名>]$ rails db:create RAILS_ENV=production
```

## unicorn起動
```terminal:ターミナル（EC2）
[ec2-user@ip-xx-xx-xx-xx <app名>]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D
```
エラーの発生は無し。

起動自体はできていることを確認。
```terminal:ターミナル（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
```


# 最後に
より良い方法や間違い等ありましたらご指摘いただけますと幸いです！