EC2にMySQLをインストールしWorkbenchで操作できるようにする

## はじめに
AWSでDBを使用したい！となった場合にRDSを使用することが多いかと思います。
ですが今回EC2にDBを構築しGUI操作をしたので、備忘録として記事にしてみました。
初学者なので、間違っているところがあればご指摘ください…！

## 使用したもの
・AWS EC2(AmazonLinux2023)
・MySQL
・MySQL-Workbench(MySQLのGUIツール)

## 全体の流れ

1. EC2にMySQLリポジトリとMySQLサーバーをインストール
2. EC2のMySQLにrootユーザーでアクセスし、操作するユーザーを作成
3. EC2のセキュリティグループにポート3306を追加
4. WorkbenchでEC2のMySQLに接続できるコネクションを作成

## EC2にMySQLをインストール

EC2にSSH接続し、使用するバージョンの「MySQLリポジトリ」を追加し「MySQLサーバー」をインストールします。

まずはローカルリポジトリをyumでダウンロード。リポジトリのURLは公式にあります。
https://dev.mysql.com/downloads/repo/yum/
使用しているプラットフォームによってURLが変わるので注意！
(dnf 対応システムの場合、コマンドの yum を dnf に置き換えます)

```powershell
sudo yum localinstall https://dev.mysql.com/get/mysql80-community-release-el7-9.noarch.rpm
```

:::note info
yumリポジトリは、デフォルトで最新のバージョンがインストールされるよう設定されているので、特定のバージョンをインストールしたい場合は追加設定が必要！
詳しくは公式マニュアルに記載されています。
https://dev.mysql.com/doc/refman/8.0/ja/linux-installation-yum-repo.html
:::

リポジトリがダウンロードできたら、MySQLをインストールします！
```powershell
sudo yum install mysql-community-server
```

:::note info
GPG キーが古いか無いと怒られてインストールできなかった場合は、最新のGPG キーをインポートしてからインストールします。
私がバージョン5.7をインストールしたときは、2022年のキーも必要でした…。
```powershell
rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
```
:::

インストールが終わったら、念のためインストールできているか確認します。
下のコマンドでインストールしたバージョンが表示されればOKです！

```powershell
mysqld -version
```

## MySQLにrootユーザーでログインし新ユーザーを作成

最初から作成されているrootユーザーでMySQLにログインします。

初期パスワードはMySQLのlogに記載されているので確認。

```powershell
sudo cat /var/log/mysqld.log
```
確認できたらログインします。下のコマンドを打つとパスワードを要求されるので入力。
※パスワードを打っても画面には表示されません！

```powershell
mysql -u root -p
```

ログインできたらrootユーザーのパスワードを変更します。
※パスワードを変更しないと警告が出て、なにもできません！

```sql
SET PASSWORD = 'new_password';
```

次に新しいユーザーを作成します。
複数のホストでログインする場合は、同じ名前のユーザーをホスト名だけ変え、複数作成します。
※同じユーザー名であればホスト名が違っても、テーブルは同じものを共有できます。

今回は自分のPCのWorkbench用とlocalhost用で、同じ名前のユーザーを２つ作成しました。
同時に権限も付与します。

```sql
-- 特定のIPアドレスからの接続を許可（例: 203.0.113.0）
CREATE USER 'onigiri'@'203.0.113.0' IDENTIFIED BY 'your_password';

--locallhostからの接続を許可
CREATE USER 'onigiri'@'locallhost' IDENTIFIED BY 'your_password';

-- 必要な権限を付与
GRANT ALL PRIVILEGES ON your_database.* TO 'onigiri'@'203.0.113.0';
GRANT ALL PRIVILEGES ON your_database.* TO 'onigiri'@'locallhost';

-- 権限を反映
FLUSH PRIVILEGES;

-- 作成済みユーザーを確認
select user, host from mysql.user;
```

:::note info
ホスト名に「%(ワイルドカード)」を使用する場合、すべてのIPアドレスから接続を許可できますが「localhost」は含まれないので注意！

```sql
-- すべてのIPアドレスからの接続を許可
CREATE USER 'your_username'@'%' IDENTIFIED BY 'your_password';
```
:::

続いてEC2のMySQLをWorkbenchで操作する為に必要な設定をしていきます。

:::note info
MySQLのデフォルト設定では、localhost以外からの接続を受け付けない設定になっています。なので、自分のPCのWorkbenchで操作するには、他からの接続を許可する設定が必要！
:::

その設定方法ですが、MySQLの設定ファイルをviなどで開き、ある文を追加します。

```powershell
#スーパーユーザーの権限で”/etc”にあるMySQLの設定ファイル”my.cnf”を編集
sudo su 
cd /etc(/mysql)
vi my.cnf

#mysqldセクションに以下を追加、今回は全てのIPからの接続を許可
bind-address = 0.0.0.0

#設定を反映させるため再起動
sudo service mysql restart
```
これでMySQL側の設定は終了です！

## EC2のセキュリティグループにポート3306追加

続いて、EC2のセキュリティグループの設定をしていきます。

セキュリティグループのインバウンドルールを追加します。
タイプ「MySQL」を選択し、ソースに「自分のPC(Workbenchを操作する機器)のIP」を指定します。
※ソースのタブで「マイIP」を選択すると現在使っている機器のIPを指定してくれます。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836047/6071621a-4215-05b3-637e-94ce4b1452d3.png)

EC2の設定も終了しました！次が最後です！

## Workbenchから接続できるようにする

最後にWorkbenchの設定に入ります！

EC2のMySQLに接続する用の新しいコネクションを作成します。

![Untitled1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3836047/d28b828a-2a1f-9f87-5cae-348c6dcd6119.png)

- **Connection Name(接続名)**: 任意の名前
- **Connection Method(接続タイプ)**: 「Standard」でOK
- **Hostname(ホスト名)**: EC2のパブリックIPアドレスまたはDNS名、固定IPなど
- **Port(ポート番号)**: 3306（MySQLのデフォルトポート）
- **Username(ユーザー名)**: EC2のMySQLで作成したユーザー名(＠以降は不要)
- **Password(パスワード)**:なにも押さない！上で指定したユーザーのパスワードだがこの欄では設定不要

すべて入力後、テスト接続を押し、不備がなければ指定したMySQLユーザーのパスワードを求められるので入力！
無事に接続できたら完了です！

:::note info
EC2のパブリックIPは、固定IPを取得しない限り毎回変わります。そのためIPを固定していない時は、Workbenchのコネクションで設定したEC2のホスト名も毎回変更する必要があります！
:::

## おわりに

初めて記事を書きましたが、自分の中の知識を分かりやすくまとめるのは、とても勉強になりました。ニッチな記事ですが、誰かの役に立てたら嬉しいです！