【Amazon Aurora】日本の環境で快適に使うための初期設定手順 ～ 文字コード、タイムゾーン、パブリックアクセス ～

わずか数分でデータベースを作成、起動できてしまうAmazon RDS。
とっても便利ですが、デフォルトのままだと文字化けしてしまったり、時刻がズレていたりと歯がゆい思いをすることになりかねません。
今回は、Amazon Auroraを日本の環境（日本時間、日本語）で快適に使うために、やっておきたい初期設定手順をまとめてみました。

## 環境
- Amazon Aurora(MySQL5.7)2.07.2（「開発/テスト」用）
- クライアントOS：Windows10

## 手順
### 1. Amazon Aurora DBクラスターの作成
[Amazon Aurora DBクラスターの作成](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.CreateInstance.html)に記載の手順を参照しつつ、作成します。
公式サイト（リンク先）に詳しく書かれているので、ここでは割愛します。

### 2. DBクラスターのパラメータグループの作成
Amazon Aurora(MySQL5.7)の場合、デフォルトのパラメータグループ、DB クラスターのパラメータグループの設定は以下のようになっています。

|タイプ  |名前 |
|---|---|
|パラメータグループ  |default.aurora-mysql5.7|
|DB クラスターのパラメータグループ  |default.aurora-mysql5.7|

これらデフォルトのパラメータグループの設定は変更できないので、別途パラメータグループを作成し、DBインスタンスに割り当てます。
今回は、DB クラスターのパラメータグループのみでOK！

以下の通り設定を進めていきます。

1. AWS > RDSとアクセスしたら、左ペインにて、「パラメータグループ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/13a8fe5b-5a39-0a0a-71e1-bad7054c66ed.png)

2. 「パラメータグループの作成」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/165c8f57-c14a-d578-893d-aa337c4c37a2.png)

3. タイプに「DB Cluster Parameter Group」（①）、グループ名（②）、説明（③）に任意の内容を入力し（入力自体は必須）、「作成」（④）をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/b91f3cc8-186c-63bd-9bc2-207e7c02fd94.png)

4. 作成したパラメータグループの名前をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/f95913a9-996c-e3a7-c0e2-bab6f6385943.png)

5. 検索ボックスに「character」と入力し（①）、「パラメータの編集」（②）をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/f9265a5c-747c-8542-55da-d2bad7b49a8a.png)

6. キャプチャのように「値」がセレクトリストになるので（①）、下記の表の通り編集して「変更の保存」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/96aff4ee-414d-fd63-9b98-d05d6da9c02c.png)

|名前|値|
|---|---|
|character_set_client|utf8mb4|
|character_set_connection|utf8mb4|
|character_set_database|utf8mb4|
|character_set_results|utf8mb4|
|character_set_server|utf8mb4|
|time_zone（※）|Asia/Tokyo|

※time_zoneについては、検索ボックスにて別途「time_zone」と入力＆検索する

### 3. DBインスタンスへのDBクラスターのパラメータグループ適用（＋パブリックアクセスの有効化）
手順2で新しく作成したDBクラスターのパラメータグループをDBインスタンスに適用します。
また、外部から接続する場合、パブリックアクセスを有効にする必要があるので、こちらも合わせて設定しておきます。

1. 左側ペインにて「データベース」をクリックし、対象のDBインスタンスを選択した後（②）、「変更」をクリック（③）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/4c67b425-6151-4c22-4349-4a47eb3a7c9e.png)

2. 変更ページが開くので、中ほどまでスクロールして、「ネットワーク＆セキュリティ」の「パブリックアクセシビリティ」にて「はい」を選択する（パブリックアクセスの許可）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/d6696653-2e61-a404-1288-0b0decfbee26.png)

3. さらに下方にスクロールし、「データベースの設定」の「DBクラスターのパラメータグループ」にて作成したパラメータグループを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/07f63562-8a99-d6c3-307f-1473fefd2bf9.png)

4. いちばん下までスクロールし、「次へ」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/ec70f6e3-ebd2-8a6f-abae-3da5a18b20b1.png)

5. 画面遷移したら、「変更スケジュール」を「すぐに適用」に変更し（←重要！そのままだと、次回メンテナンスまで変更がが適用されません！）、「DBインスタンスの変更」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/e6d7256b-73d8-95db-eb8b-ceb0ff96e773.png)

### 4. アクセス許可設定の変更
手順3にて、外部からのアクセスが許可されましたが、そのままでは特定のIP以外接続できません。
以下の手順により、適切な接続元からのアクセスを許可します（今回は全てのIPアドレスからの接続を許可します）。

1. RDSの左側ペインにて、「データベース」をクリックし（①）、対象のDBインスタンスをクリックします（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/ea5cef57-5c9b-1d1c-bdb7-5baeaf6eaae5.png)

2. 画面下部に「接続とセキュリティ」が表示されたら、VPCセキュリティグループのリンクをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/81be246a-a413-04e6-de50-1255c4506f28.png)

3. セキュリティグループのページが開くので、「インバウンドルールの編集」をクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/88b98fcd-c9f7-d1b2-3a5a-e42bf1d02302.png)

4. タイプが「MySQL/Aurora」となっている行の「ソース」で、「任意の場所」を選択し（①）、「ルールの保存」をクリック（②）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/1b54c9d9-4901-41ec-2d3c-1564ab89d2a7.png)


### 5. 接続と設定の確認
手順4までで必要な設定は一通り完了ですが、クライアントPCから接続、設定（文字コード、タイムゾーン）がうまくできているか、確認しておきましょう。

1. コマンドプロンプトを起動し、対象のDBインスタンスに接続します。

```
> mysql -h {エンドポイント} -P {ポート} -u {DBクラスター作成時に設定したユーザー名} -p
```

Enterを押すと、パスワードの入力を求められるので、DBクラスター作成時に設定したパスワードを入力します。
「エンドポイント」、「ポイント」には、RDSの左側ペイン「データベース」> 「対象のDBインスタンス」をクリックすると下部に現れる、「エンドポイント」（①）、「ポート」（②）を使用します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/356958/7b36189d-1122-77dd-a189-5ac8a5dbed04.png)

2.接続ができたら文字コードの確認をしましょう。

```
MySQL> show variables like '%char%';
```

以下のような結果になっていればOKです。
もし変更が反映されないようなら、一度再起動してみてください。
（今回変更したパラメータは全てdynamicなので、再起動は不要なはずではあるのですが、、）

```
+--------------------------+------------------------------------------------------------------+
| Variable_name            | Value                                                            |
+--------------------------+------------------------------------------------------------------+
| character_set_client     | utf8mb4                                                          |
| character_set_connection | utf8mb4                                                          |
| character_set_database   | utf8mb4                                                          |
| character_set_filesystem | binary                                                           |
| character_set_results    | utf8mb4                                                          |
| character_set_server     | utf8mb4                                                          |
| character_set_system     | utf8                                                             |
| character_sets_dir       | /rdsdbbin/oscar-5.7.mysql_aurora.2.07.2.0.1106.0/share/charsets/ |
+--------------------------+------------------------------------------------------------------+
```

### 6. オマケ：データベースとテーブルの作成時
Amazon Aurora2系はMySQL5.7互換なので、CHARACTER SETをutf8mb4とした場合は、COLLATIONはutf8mb4_general_ciとなります（MySQL8.0では、utf8mb4_0900_ai_ci）。
utf8mb4_general_ciは、濁点半濁点（「゛」、「゜」）は区別しますが、大文字小文字、所謂絵文字を区別しないので、左記全部を区別するutf8mb4_binにしてデータベースを作成しておきましょう。

以下、例です。

```
create database `test-db1` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin;
```

これで、対象のデータベースに作成されるテーブルも同じ設定となりますが、後々を考えるなら、以下のように設定を明記しておくとよいでしょう。

```
create table `test_table`(
  `id` int,
  `name` varchar(50)
)ENGINE=InnoDB DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
```


## 終わりに
データベースやテーブルを作ってしまってからの設定変更はいろいろと厄介。。
作成直後にサクッと必要な設定を済ませて、不要な作業や心配をなくしないところ。
（MySQL等を各々でインストールした場合もそうですが）

あと、使っていない時はDBインスタンスの停止 or 削除を忘れずに。

## 参考
- [VPC のパブリックサブネットまたはプライベートサブネットを使用する Amazon RDS インスタンスへの接続問題を解決するには、どうすれば良いですか? | aws](https://aws.amazon.com/jp/premiumsupport/knowledge-center/rds-connectivity-instance-subnet-vpc/)
- [RDSで日本語が文字化けする問題 | Qiita](https://qiita.com/reoy/items/e355debf1e2b2abd703b)
- [10.10 Supported Character Sets and Collations(version5.7) | MySQL](https://dev.mysql.com/doc/refman/5.7/en/charset-charsets.html)
- [10.10 Supported Character Sets and Collations(version8.0)](https://dev.mysql.com/doc/refman/8.0/en/charset-charsets.html)
- [MySQLの照合順序問題 | 株式会社クインテット](https://pando.life/qwintet/article/833)