文系出身エンジニアが学ぶMySQLサーバーの構築(AWS)

# 記事を書く背景
『Amazon Web Services 基礎からのネットワーク＆サーバー構築』を読み進める中で、AWSにMySQLサーバーを構築する際のつまずいたところとその対処方法を記載しようと思います。

# 環境
OS : Amazon Linux release 2 (Karoo)

# つまずきポイント１：MySQLをインストールできない
下記コマンドを打つとエラーが発生。

```
$ sudo yum -y install mysql-server
```

##原因
Amazon EC2のyumリポジトリにMySQLのリポジトリが存在していないため。
下記コマンドで確認できます。

```
$ yum list installed | grep mysql
```

##対処方法
下記コマンドでAmazon EC2のyumリポジトリにMySQLのリポジトリを追加

```
$ sudo yum localinstall http://dev.mysql.com/get/mysql57-community-release-el7-7.noarch.rpm
```

これでめでたくMySQLをインストールする準備が整いました。
そして、下記コマンドでMySQLをインストールします。

```
$ sudo yum -y install mysql-community-server
```

無事にインストールできていることを確認します。

```
$ mysqld --version
mysqld  Ver 5.7.29 for Linux on x86_64 (MySQL Community Server (GPL))
```

##ちなみに、、、
Amazon EC2にはMySQL派生版のMariaDBがインストール済みだそうです。
こちらは使わないのでアンインストールしました。

```
// MariaDBがインストールされていることを確認
$ sudo yum list installed | grep mariadb

// MariaDBの削除
$ sudo yum remove mariadb-libs
```

# つまずきポイント２：Passwordの設定ができない
passwordの変更をしようと下記コマンドを打つとエラーが出てしまい、ログインパスワードの変更ができない。

```
$ mysqladmin -u root password
ERROR 1045 (28000): Access denied for user 'ec2-user'@'localhost' (using password: NO)
```
##原因
rootユーザの権限設定がされていない

##対処方法
１. MySQLを停止させる

```
$ sudo systemctl stop mysqld
```
２. MySQLの環境変数にオプションを追加
→権限システムを使用しないで起動することが可能になる

```
$ sudo systemctl set-environment MYSQLD_OPTS="--skip-grant-tables"
```

３. MySQLの起動

```
$ sudo systemctl start mysqld
```

４. MySQLにログイン

```
$ mysql -u root
```

５. rootユーザーのPasswordを設定

```sql

mysql> UPDATE mysql.user SET authentication_string = PASSWORD('設定したいPassword') WHERE User = 'root' AND Host = 'localhost';
mysql> FLUSH PRIVILEGES;
mysql> quit
```

*以下は環境変数にオプションを追加したのを戻す作業*
６. MySQLを停止させる

```
$ sudo systemctl stop mysqld
```
７. MySQLの環境変数にオプションを元に戻す

```
$ sudo systemctl unset-environment MYSQLD_OPTS
```

８. MySQLの起動

```
$ sudo systemctl start mysqld
```

# つまずきポイント3：Passwordを設定したと思ったらALTER USER statementが使えない
これでようやくPasswordも設定できたと思い、ログインして`CREATE DATABASE`したところまたもエラー発生。

```
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.
```

##原因
rootのパスワードを初回設定から変えていないときに表示される

##対処方法
下記コマンドで新しいパスワードを設定する

```
ALTER USER 'root'@'localhost' IDENTIFIED BY '新しいパスワード';
```

# つまずきポイント4：MySQLのパスワードポリシーに怒られる
新しいパスワードを設定する際に例えば`pass`などの小文字４字で設定しようとするとデフォルトの設定ではMySQLのパスワードポリシーに違反してしまいます。 

```
ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
```

##原因
| ポリシー | Passwordに必要な条件 |
|:--|:--|
| 0 または LOW | 長さ |
| 1 または MEDIUM | 長さ; 数字、小文字/大文字、および特殊文字 |
| 2 または STRONG | 長さ; 数字、小文字/大文字、および特殊文字。辞書ファイル |

現在のポリシーは以下のコマンドで確認できます。 

```sql
mysql> SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 8     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | MEDIUM|
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.00 sec)

```

##対処方法
１.　Passwordをポリシーに合わせる。
おとなしくMySQLに従う。。

２. ポリシーを変更する

```sql

-- 最低限の長さの変更
mysql> SET GLOBAL validate_password_length=4;

-- ポリシーの変更
mysql> SET GLOBAL validate_password_policy=LOW;

-- 変更の確認
SHOW VARIABLES LIKE 'validate_password%';
+--------------------------------------+-------+
| Variable_name                        | Value |
+--------------------------------------+-------+
| validate_password_check_user_name    | OFF   |
| validate_password_dictionary_file    |       |
| validate_password_length             | 4     |
| validate_password_mixed_case_count   | 1     |
| validate_password_number_count       | 1     |
| validate_password_policy             | LOW   |
| validate_password_special_char_count | 1     |
+--------------------------------------+-------+
7 rows in set (0.00 sec)

```


#参考文献
[AWSのEC2で行うAmazon Linux2（MySQL5.7）環境構築](https://qiita.com/2no553/items/952dbb8df9a228195189)
[AWS Amazon Linux2にMySQL5.7を構築する](https://qiita.com/himatani/items/e1e650992dbc12b8a9b3)
[Change mysql root password on Centos7](https://stackoverflow.com/questions/33510184/change-mysql-root-password-on-centos7)
[MySQL 5.7.16 でERROR 1820 (HY000): You must reset your passwordの対処法（windows用）](http://swiftfe0.hatenablog.com/entry/2016/11/22/010631)
[Mysql 5.7* パスワードをPolicyに合わせるとめんどくさい件について](https://qiita.com/keisukeYamagishi/items/d897e5c52fe9fd8d9273)