【MySQL / Rails】パスワードエラーを解決（AWS アプリデプロイ時）

# はじめに
[(下準備編)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで](https://qiita.com/naoki_mochizuki/items/f795fe3e661a3349a7ce)
こちらの記事を参考にさせていただき、Rails のオリジナルアプリをAWSを利用しデプロイしようと試みました。

すると、こちらの記事
[(デプロイ編②)世界一丁寧なAWS解説。EC2を利用して、RailsアプリをAWSにあげるまで](https://qiita.com/naoki_mochizuki/items/5a1757d222806cbe0cd1#mysql%E3%81%AE%E8%A8%AD%E5%AE%9A)
デプロイ編②の「MySQLの設定」でかなり躓いたのでエラー内容と解決した方法を記述する。

# エラー内容から解決までの簡単な流れ

ターミナルでEC2インスタンスにログインし、MySQLを起動した状態で

1. rake db:create RAILS_ENV=productionを実行 → 「パスワードがないから、アクセスできないよ」とエラーがでる
2. コマンドを実行しパスワードを確認する
3. 確認したパスワードを database.yml に記述する
4. 再度rake db:create RAILS_ENV=productionを実行 → 「パスワードが有効期限切れだよ」とエラーがでる
5. パスワードを変更する
6. 変更したパスワードを database.yml に記述する
7. rake db:create RAILS_ENV=production 実行できた！！

以下でもう少し詳細に説明する

# 解決のためにやったことを説明
#### 1. rake db:create RAILS_ENV=productionを実行

```
$ rake db:create RAILS_ENV=production
# エラー文
Access denied for user 'root'@'localhost' (using password: NO)
```

「パスワードがないからアクセスできないよ」と拒否される。

確かに database.yml の production環境記述 password の部分は空欄になっていた

```database.yml
production:
  <<: *default
  database: thankshabit_production
  username: root
  password:           # ←ここが空欄
```


#### 2. コマンドを実行しパスワードを確認する
パスワードがわからないので、こちらのコマンドを実行しパスワードを確認する

```
$ sudo cat /var/log/mysqld.log | grep 'temporary password'
[Note] A temporary password is generated for root@localhost: XXXXXX
```

このコマンドを実行し表示された最後の部分「XXXXX」がパスワード。
この部分を database.yml に記述する

#### 3. 確認したパスワードを database.yml に記述する
アプリのディレクトリにいる状態で

```
$ vi config/database.yml
```

を実行し、確認したパスワードを database.yml に記載する

```database.yml
production:
  <<: *default
  database: thankshabit_production
  username: root
  password: XXXXX #　←ここに記述 
```
#### 4. 再度rake db:create RAILS_ENV=productionを実行

再度実行したらまた別のエラーがでる

```
$ rake db:create RAILS_ENV=production
# エラー文
Mysql2::Error: Your password has expired. To log in you must change it using a client that supports expired passwords.
```

「パスワードが有効期限切れだから、変更する必要がある」と言われている。

#### 5. パスワードを変更する
コマンドを実行し、パスワードを変更する

```
$ sudo mysql_secure_installation
NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!
In order to log into MySQL to secure it, we'll need the current
password for the root user.  If you've just installed MySQL, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.
Enter current password for root (enter for none): 
```

Enter を押す

```
OK, successfully used password, moving on...
Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
Set root password? [Y/n] y
```
パスワードを設定するかどうか聞かれているため、「y」＋「Enter」

```
New password: 
Re-enter new password: 
Password updated successfully!
Reloading privilege tables..
 ... Success!
```

新しいパスワードを確認含めて２回入力する
ここで注意なのですが、この**パスワードの文字制約がかなり厳しい**。
筆者は[こちら](https://www.luft.co.jp/cgi/randam.php)などを利用して制約をクリアするパスワードを設定した。

```
Remove anonymous users? [Y/n] y
 ... Success!

Disallow root login remotely? [Y/n] y
 ... Success!

Remove test database and access to it? [Y/n] y
 - Dropping test database...
 ... Success!
 - Removing privileges on test database...
 ... Success!

Reload privilege tables now? [Y/n] y
 ... Success!
Cleaning up...
```

全てに「y」＋「Enter」で返していく

これでパスワードの新規設定が完了！！

#### 6. 変更後のパスワードを database.yml に記述する
アプリのディレクトリにいる状態で

```
$ vi config/database.yml
```

を実行し、先ほど新規に設定したパスワードを記述し直す

```database.yml
production:
  <<: *default
  database: thankshabit_production
  username: root
  password: XXXXX #　←ここに新パスワードを記述し直す 
```

#### 7. rake db:create RAILS_ENV=production 実行

```
$ rake db:create RAILS_ENV=production 
```

無事実行できた！！


# 最後に
無事にこのつまずきを乗り越えてAWSでデプロイできました。色々な記事などを参考にさせていただきRailsアプリを無事にデプロイできました。
DBについてもネットワークやインフラ面についても理解はまだ浅いですが非常に勉強になりました。

参考にさせていただいた記事、サイトには本当に感謝しかないです。
ありがとうございました。

今回エラー解決に参考にさせていただいた記事↓↓　ありがとうございました！！

- [AWS Amazon LinuxサーバにMySQLをインストールした際に詰まった箇所の備忘録](https://qiita.com/Dough/items/7493ad374a51b24abb58)
- [EC2　MySQL 初期設定　root にパスワードの設定](https://qiita.com/TeamDowel/items/6b3d7b3828a2b28f16e3)
- [mysql5.7でパスワードを変更する](https://qiita.com/RyochanUedasan/items/9a49309019475536d22a)