【AWS】Laravel + Docker + RDS(MySQL) でデプロイした時のDB関連のエラーとその解決

# はじめに
AWS（EC2）にデプロイする際、DB関連のエラーで躓いたため記録として残します。
DB関連にフォーカスしているので、それ以外のインストールの手順は省いています。
# 前提
・今から`migrate`します
・EC2インスタンス作成済み
・sshログインできる

# 条件
```bash
macOS: "11.2.3 Big Sur"

php artisan -V
# > Laravel Framework 6.20.30

php -v
# > PHP 8.0.8 

nginx -v
# > nginx version: nginx/1.12.2

mysql -h エンドポイント -u マスターユーザー名 -p データベース名
Enter password:
# > Server version: 8.0.25

git --version
# > git version 2.32.0
```

# 1. `php artisan migrate`でエラー
MySQLをインストール

```terminal:ssh
sudo yum -y install mysql
```
`artisan`コマンドが使えるディレクトリに移動して`migrate`

```terminal
php artisan migrate
```
すると以下のエラーが...
![スクリーンショット 2021-07-24 10.46.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1379469/beb9d9f6-7d9c-5cdd-ba88-05e2d4a2b4a3.png)
<font color="tomato"><b>SQLSTATE[HY000] [2002]　Connection timed out</b></font>

DBに接続をしようとしたけどできてない様子。
`.env`を確認して何回か修正したが、改善せず。

|.envファイル|入れる値|
|:---|:---|
|DB_HOST|エンドポイント|
|DB_USERNAME|マスターユーザー名|
|DB_PASSWORD|マスターパスワード|

## 解決
AWSの`セキュリティグループ`→`インバウンドルール`を確認すると、`Type`がMySQLではなかったのが原因でした。
→`MySQL`に変更することで無事migrateすることができました。
![スクリーンショット 2021-07-25 11.01.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1379469/347cb183-17a6-386d-bbd0-ddd91693fb93.png)

```bash
php artisan migrate

# migrate成功
Migration table created successfully.
```

### 念の為テーブル確認

```terminal:ターミナル
mysql -h エンドポイント -u マスターユーザー名 -p データベースの指定
```
<font color="tomato"><b>-p の後は空白を開ける。空白を開けずに入力するとパスワードとなってしまいます。</b></font>
以下が表示されれば接続成功。

```terminal:ターミナル
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MySQL connection id is 174
Server version: 8.0.25 Source distribution

Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MySQL [(none)]>
```

もし、`-p`を指定せずに接続しても以下のように指定することで見ることができます。

`show databases;`とすることで、全てのdatabaseが表示。

```terminal:ターミナル
MySQL [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| lantern   ← このdetabaseを確認したい
| mysql              |
| performance_schema |
| sys                |
+--------------------+
```

`lantern`というdetabaseを見たかったら`use`で指定する。

```terminal:ターミナル
MySQL [(none)]> use lantern

Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
MySQL [lantern]>  ← lanternに変更された
```

### 参考
このエラーを解決するにあたって以下のサイトを参考にさせて頂きました。

https://laracasts.com/discuss/channels/servers/connect-laravel-to-remote-database-got-connection-timed-out-error

https://teratail.com/questions/102782


## 2. `php artisan db:seed`でエラー
![スクリーンショット 2021-07-24 12.17.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1379469/50d8e875-dc51-54ae-2e78-25fd46314f15.png)
<font color="tomato"><b>Class Faker\Factory</b></font>
`Faker\Factory`のクラスがないよと言われる。

## 解決
`Heroku`で同じようなことが起こっている人たちがいましたが、AWSでも同じようにすると解決できました。
結論から言うと、以下のように`fakerphp/faker`を`require-dev`から`require`へ移動しました。

```diff:composer.json
    "require": {
        "php": "^7.2.5|^8.0",
        "doctrine/dbal": "^3.1",
        "fideloper/proxy": "^4.4",
        "intervention/image": "2.5.1",
        "laravel/framework": "^6.20.26",
        "laravel/tinker": "^2.5",
+       "fakerphp/faker": "^1.9.1"
    },
    "require-dev": {
        "barryvdh/laravel-debugbar": "^3.6",
        "facade/ignition": "^1.16.15",
        "laravel/ui": "^1.0",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^3.0",
        "phpunit/phpunit": "^8.5.8|^9.3.3"
-       "fakerphp/faker": "^1.9.1"
    },
```

デプロイの際、パッケージのインストールで以下のように記述しました。

```bash
composer install --no-dev --prefer-dist
```
`--no-dev`とすることで、<b>「開発環境のみ必要で本番環境で必要ないパッケージはインストールしない」</b>とできます。
具体的には、`phpunit`や`debugbar`などは本番環境には必要ないためインストールされないようにしています。

「<b>開発環境のみ</b>」というのは`require-dev`の部分です。
上記のコマンドを実行すると`require-dev`で書かれているものはインストールされません。



修正後、gitにpushし本番環境でもcomposerをアップデートして反映させます。

```terminal
composer update
```

この後にもう一度`php artisan db:seed`をすると無事実行されました。

```terminal
php artisan db:seed

Database seeding completed successfully.
```

### 参考
このエラーを解決するにあたって以下のサイトを参考にさせて頂きました。

https://qiita.com/sts123123123/items/f41bffc63a270d2dce6f

# おわり
この他にも、ディレクトリの記述ミスで実行できなかったのもあり、これを機にディレクトリをしっかり意識するようになりました。
初歩的なミスばかりですが、おかげでデプロイの概要が少しずつ理解できてきたかなと感じます！

このまま自動デプロイ目指してやっていきます！


# 参考
https://qiita.com/yuuta_s/items/e925ac687eddfef359fa

https://qiita.com/nakm/items/0bcc6564538a0604b2ce

https://qiita.com/masataka715/items/6e46f1f5e53bdff6cd3d

https://qiita.com/wallkickers/items/47efb41dd200722a98fe

https://qiita.com/minato-naka/items/03f9dbd09eb3919a501f

https://qiita.com/yuuta_s/items/e925ac687eddfef359fa

https://teratail.com/questions/256816

https://qiita.com/ntm718/items/f896c8e4fb801777954b