AWS の EC2(Amazon Linux 2023) に MySQL インストールして外部から接続

AWS の EC2 の Amazon Linux 2023 に MySQL インストールして外部から接続した時の備忘録メモ
初期パスワードは探すの大変だった．．．log から取得しかないかは謎です．．．
実施したのは 2024/04/03 時点です
ざっくり流れは．．．

1. EC2インスタンス起動
1. EC2ログイン
1. MySQLインストール
1. MySQLユーザ作成
1. 外部からMySQL接続

# EC2インスタンス起動

AMI は Amazon Linux 2023にして ssh で接続するのでキーペアとかちゃんと設定する
MySQL に外部から接続できるようにセキュリティグループを追加
そのほかは自由でOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/e11c5e37-04d1-42a4-b165-7821c0f5381f.png)

# EC2 ログイン

windows pc で作業したので putty 使ってログイン
TeraTermがv5になったのでそれでも良いかも
putty の ppk 指定は [Connection] - [Auth] - [Credentials] のところから 

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/cced714b-075d-ba4f-1e24-a7b137d39f5c.png)

# root でログイン

```terminal
sudo -i
```

# MySQLインストール

- リポジトリ
    実行したら入力もとめらるので `y` を入力してエンター（コマンドに `-y` 追加でもOK）
    ```terminal
    dnf localinstall https://dev.mysql.com/get/mysql80-community-release-el9-5.noarch.rpm
    ```

- パッケージ
    実行したら入力もとめらるので `y` を入力してエンター（コマンドに `-y` 追加でもOK）
    ```terminal
    dnf install mysql-community-server mysql-community-client mysql-community-devel
    ```

# MySQLサーバ起動

```terminal
systemctl start mysqld
```

# MySQL の root パスワード設定、外部接続用ユーザ作成

- MySQL の root の初期パスワード確認

    ```terminal
    cat /var/log/mysqld.log | grep root@localhost
    ```
    ```terminal
    # 実行結果はこんな感じ
    2024-04-02T16:10:50.386960Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Pas*********
    ```

- MySQL に root でログイン
    コマンド実行でパスワード入力になるので上のパスワードをコピペ

    ```terminal
    mysql -u root -p
    ```

- MySQL の root のパスワード変更
    なんとなく初期パスワード忘れそうなので適当なやつに変更しておく
    大文字・小文字・数字・記号含む8文字以上がポリシーになってる
    ```sql
    set password = 'Abc1****';
    ```

- 外部接続用のユーザ作成
    ユーザ、パスワードは適当に変更する
    ```sql
    # ユーザ作成
    create user 'user'@'%' identified by 'Abc1****';
    ```

    ```sql
    # 権限追加
    grant all on *.* to 'user'@'%';
    ```

    ```sql
    # 確認用SQL
    select user, host from mysql.user;
    ```

# 外部から接続確認

windows pc の MySQL Workbench からアクセスしてみる
Hostname に EC2 のパブリックIP 、Username はさっき作ったユーザ使う
Test Connection でパスワード入力で接続設定つくってつながればOK

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51758/dae9904f-f941-5484-a974-04cc54686b01.png)

# パスワードのリセット方法

MySQL の root ユーザや作ったユーザのパスワードを忘れることがあるのでリセット方法
EC2にログインして root ユーザになってから実施する
ざっくり手順はこんな感じ
1. MySQL定義ファイルに認証スキップの設定追加
1. MySQL リスタート
1. MySQL rootログイン（設定変えたのでパスワード不要）
1. 認証スキップしたテーブルリロードしてからパスワード変更
1. MySQL定義ファイルに追加した認証スキップの設定削除
1. MySQL リスタート

- MySQL定義ファイル my.cnf に認証スキップの設定追加
    - my.cnf ファイルひらく
        ```terminal
        vi /etc/my.cnf
        ```
    - 最後の行に以下を追加 (パスワード無でログイン可能になる)
        ```terminal
        skip-grant-tables
        ```
- MySQL サービス リスタート
    ```terminal
    systemctl restart mysqld
    ```
- MySQL rootログイン（設定変えたのでパスワード不要）
    ```terminal
    mysql -u root
    ```
- MySQL スキップした管理テーブルリロードからパスワード変更
    - スキップした管理テーブルリロード
        ```sql
        FLUSH PRIVILEGES;
        ```
    - MySQL ユーザのパスワード変更 (以下は root リセットの例)
        パスワードは大文字・小文字・数字・記号含む8文字以上がポリシーになってる
        ```sql
        ALTER USER 'root'@'localhost' IDENTIFIED BY 'Abcd1***';
        ```
- MySQL ログアウト
    ```sql
    quit
    ```
- MySQL定義ファイル my.cnf に追加した認証スキップ削除
    - my.cnf ファイルひらく
        ```terminal
        vi /etc/my.cnf
        ```
    - 最後の行の以下を削除 ( or コメントアウト)
        ```terminal
        # skip-grant-tables
        ```
- MySQL サービス リスタート
    ```terminal
    systemctl restart mysqld
    ```
- MySQL パスワード入れてログインしてみる
    ```terminal
    mysql -u root -p
    ```