Amazon RDS for MySQLインスタンス作成手順

はじめに
===

Amazon Web Serviceが提供するマネージド型リレーショナルデータベースサービス「Amazon RDS」でMySQLデータベースのインスタンス(Amazon RDS for MySQLインスタンス)を作成する手順です。

Amazon RDS for MySQLインスタンス(MySQLバージョン5.6.27のMySQLデータベースサーバ)を作成し、Amazon EC2インスタンス(Amazon Linux)からMySQLデータベースへ接続して利用開始するまでの手順について記載致します。

Amazon RDSについて
===
Amazon RDSのサービス詳細については、以下をご参照下さい。

https://aws.amazon.com/jp/rds/

EC2インスタンス作成時に使用したAMI
===

Amazon RDS接続テスト用のEC2インスタンスについては、以下のAMIを選択して作成します。

・Amazon Linux AMI 2015.09.2 (HVM), SSD Volume Type - ami-59bdb937

Amazon RDS for MySQLインスタンス作成の事前準備
===

**(1) Amazon RDS for MySQLインスタンス用のセキュリティグループを作成します。**
---

Amazon RDS for MySQLインスタンスに割り当てるセキュリティグループ[example-rds-mysql-server]を作成します。

後述の手順で作成するAmazon RDS for MySQLインスタンスには[example-rds-mysql-serverセキュリティグループ]を割り当てます。

今回の例では、[example-rds-mysql-server]セキュリティグループに、[example-server]セキュリティグループからのMySQL(TCP3306ポート)を接続するようルールを追加します。

まずは、AWS Management ConsoleでAmazon RDS for MySQLインスタンスを作成するAWSアカウントへログインします。

AWS Management Consoleへのログイン後、[EC2]->[セキュリティグループ]->[セキュリティグループの作成]をクリックします。

![WS000000.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/3ddef3b5-775d-68bf-5daa-d5ce3e55998a.jpeg)

[セキュリティグループの作成]画面が表示されます。
[インバウンド]をクリックします。

![WS000001.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/5ac9a6df-0adb-6e83-2f84-b8305f135924.jpeg)

作成する｢セキュリティグループ名]や[説明]を以下のように入力します。今回の例では[VPC]としてdefault-vpcを選択します。

| セキュリティグループ名 | 説明 | VPC |
|--------|-----------|-----------|
| example-rds-mysql-server | example-rds-mysql-server | default-vpcを選択する | 

[ルールの追加]をクリックします。

![WS000002.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/a35a1596-6fb2-0959-e4b4-f96633da014a.jpeg)

[インバウンド]に以下のルールを追加します。追加したら[作成]をクリックし、セキュリティグループを作成します。

| タイプ | プロトコル | ポート範囲 | 送信元 | Amazon RDS for MySQLへの接続を許可したいセキュリティグループの指定 |  
|--------|-----------|-----------|-------|---------------|
| MYSQL/Aurora | TCP | 3306 | カスタムIP | example-serverセキュリティグループIDを入力する |

![WS000003.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/08f1f339-084d-4974-0194-fe0c8fa85854.jpeg)

**(2) セキュリティグループが作成された事を確認します。**
---

[example-rds-mysql-server]セキュリティグループが作成された事を確認します。[インバウンド]に[MYSQL/Aurora]の接続ルールが設定されている事を確認します。

![WS000006.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/0a850620-e046-293c-34f9-a825a7072fe3.jpeg)

**(3) Amazon RDS for MySQLインスタンス用のDBサブネットグループを作成します。**
---

Amazon RDS for MySQLインスタンスを作成する際、インスタンスをどのネットワークで稼動させるか指定する為、DBサブネットグループを作成します。

AWS Management Consoleへのログイン後、[RDS]->[サブネットグループ]をクリックします。

![WS000007.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/775736f4-48a8-ea94-c625-1f84d13777b2.jpeg)

[サブネットグループ]->[DBサブネットグループの作成]をクリックします。

![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/5599fcfd-5eb8-faae-9311-ec67415191b0.jpeg)

[DBサブネットグループの作成]画面が表示されます。

![WS000009.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/5e93a71c-0f2d-ed46-2993-619cf308414f.jpeg)

作成するサブネットグループの[名前]や[説明]を以下のように入力します。サブネットグループをどのVPCに作成するか選択します。

| 名前 | 説明 | VPC ID |
|--------|-----------|-----------|
| example-rds-mysql-server | example-rds-mysql-server | default-vpcのVPC IDを選択する |

アベイラビリティゾーンとしては[ap-northeast-1a][ap-northeast-1c]の両方を選択します。それぞれのゾーンのサブネットを選択して[追加]をクリックし、サブネットグループのサブネットを指定します。

![WS000010.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/912e5417-271c-ed5f-9e18-b2615669c228.jpeg)


![WS000011.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/f7ef8bda-1596-cf44-33f3-bf8678323e82.jpeg)

[作成]をクリックして、DBサブネットグループを作成します。

![WS000012.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/7673a96c-4280-8c24-25b4-f5922cba206f.jpeg)

**(4) DBサブネットグループが作成された事を確認します。**
---

DBサブネットグループが作成された事を確認します。

![WS000013.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/32fbcb90-52ab-e751-b31b-fd0715436142.jpeg)

**(5) Amazon RDS for MySQLインスタンスに割り当てるパラメータグループを作成します。**
---

Amazon RDS for MySQLインスタンスに割り当てるパラメータグループを作成します。

AWS Management Consoleへのログイン後、[RDS]->[パラメータグループ]をクリックします。

![WS000014.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/a42e140e-fffd-131c-4d6f-0af1723d93d6.jpeg)

[パラメータグループの作成]画面が表示されます。

作成するパラメータグループとして[パラメータグループファミリー]は[MySQL 5.6]、[グループ名]や[説明]を以下のように入力します。

| パラメータグループファミリー | グループ名 | 説明 |
|--------|-----------|-----------|
| mysql 5.6 | example-rds-mysql-server | example-rds-mysql-server |

![WS000015.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/83aff6b8-7bd0-fadc-8e1e-a94c5da0af57.jpeg)

**(6) パラメータグループが作成された事を確認します。**
---

パラメータグループが作成された事を確認します。
![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/07818eb4-0eba-817e-72b9-a7ff8f604dd8.jpeg)


Amazon RDS for MySQLインスタンス作成手順
===

**(7) 作成するAmazon RDSインスタンスのデータベースエンジンを選択します。**
---

Amazon RDS for MySQLインスタンスの作成を開始します。

AWS Management Consoleへのログイン後、[RDS]->[インスタンス]->[DBインスタンスの起動]をクリックします。

![WS000017.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/6311fb41-3a89-6315-c592-770fbe614fe9.jpeg)

[エンジンの選択]画面が表示されます。
[MySQL]を選択して[選択]をクリックします。

![WS000019.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/0f22b0c7-1e42-0ebe-09e6-8d2e75433259.jpeg)

**(8) 作成するAmazon RDS for MySQLインスタンスが[本番稼動用]か[開発/テスト]か選択します。**
---

[本番稼動用にこのデータベースを使用する予定はありますか?]画面が表示されます。
今回の例では[開発/テスト]のMySQLを選択し、[次のステップ]をクリックします。

![WS000020.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/b0927d8a-2e6b-7337-d897-0eef22238e4b.jpeg)


**(9) 作成するAmazon RDS for MySQLインスタンスの設定を選択及び入力します。**
---

[DB詳細の指定]画面が表示されます。

作成するAmazon RDS for MySQLインスタンスの設定について、以下のように選択または入力していきます。
設定の選択や入力が終わったら[次のステップ]をクリックします。

| 設定項目                | 設定項目に選択や入力する値 |
|------------------------|---------------------------|
| ライセンスモデル         | General Public License   |
| DBエンジンのバージョン   | 5.6.27                   |
| DBインスタンスのクラス   | db.t2.micro              |
| Multi-AZ配置            | いいえ                   |
| ストレージタイプ         | 汎用 (SSD)               |
| ストレージ割り当て       | 5 GB                     |
| DBインスタンス識別子     | example-rds-mysql-server |
| マスターユーザの名前     | root                     |
| マスターパスワード       | マスターユーザのパスワードを入力します。|
| パスワードの確認         | マスターユーザのパスワードを入力します。|

![WS000021.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/ec46104c-8af6-84b6-0983-d16387f33041.jpeg)

![WS000022.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/727bcb40-e9a0-647a-2354-fbb7f3a5604f.jpeg)

![WS000023.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/97cb2067-4464-e3db-d7b2-8cfa2d29562a.jpeg)

**(10) 作成するAmazon RDS for MySQLインスタンスの設定を選択及び入力します。**
---

[詳細設定の設定]画面が表示されます。

作成するAmazon RDS for MySQLインスタンスの設定について、以下のように選択または入力していきます。
設定の選択や入力が終わったら[DBインスタンスの作成]をクリックします。

| 設定項目                | 設定項目に選択や入力する値 |
|------------------------|---------------------------|
| VPC                    | default-vpc              |
| サブネットグループ       | example-rds-mysql-server |
| パブリックアクセス可能   | いいえ                    |
| アベイラビリティゾーン   | ap-northeast-1a          |
| VPCセキュリティグループ  | example-rds-mysql-server |
| データベースの名前       | exampledb                |
| DBパラメータグループ     | example-rds-mysql-server |
| オプショングループ       | default:mysql-5-6        |
| タグのスナップショットへコピー | チェックなし (デフォルト設定) |
| 暗号を有効化         　　| いいえ (いいえ以外選択できないのでこのままとする) |
| バックアップの保存期間      | 7日                      |
| バックアップウィンドウ      | 下図のように設定する       |
| 拡張モニタリングを有効にする | いいえ                   |
| マイナーバージョン自動アップグレード | はい              |
| メンテナンスウィンドウ      | 下図のように設定する       |          

![WS000024.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/ee40f28e-5746-2fba-29b4-9556352b3d61.jpeg)

![WS000025.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/411419f6-732a-a57a-8ad5-4d2be375ef84.jpeg)

![WS000026.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/a0a99fdb-cc24-48c5-61d7-6fef686dacc1.jpeg)

![WS000027.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/46b32541-c54d-f1ea-57ae-224fc17c5a73.jpeg)

**(11) Amazon RDS for MySQLインスタンスの作成が開始されます。**
---

[作成中]画面が表示されるので少し待ちます。

![WS000028.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/61252d71-b8cd-d473-f249-f99050deabec.jpeg)

以下のような画面が表示されたら[DBインスタンスの表示]をクリックします。

![WS000029.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/1f83b0e0-293c-33ee-604a-fafad6a3b5c0.jpeg)

**(12) Amazon RDS for MySQLインスタンスの作成が完了するのを待ちます。**
---

Amazon RDs for MySQLインスタンスの作成が開始されます。
[ステータス]が[作成中]から[利用可能]になるまで待ちます。
作成するストレージタイプや容量等によりインスタンス作成完了までの所要時間は変わりますが、利用可能になるまで少々待ちます。

![WS000030.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/431430b2-06e1-20ef-bc72-98c34422826b.jpeg)

**(13) Amazon RDS for MySQLインスタンスの作成完了を確認します。**
---

Amazon RDs for MySQLインスタンスの[ステータス]が[作成中]から[利用可能]に変わったら作成完了です。

Amazon RDs for MySQLの[エンドポイント]に表示されているFQDNを指定する事で、セキュリティグループ[example-rds-mysql-server]で接続を許可したインスタンスから、Amazon RDs for MySQLインスタンスに対して接続出来るようになります。

![WS000031.JPG](https://qiita-image-store.s3.amazonaws.com/0/63647/be83464a-9033-c326-be57-c3f8dd3055b4.jpeg)

Amazon EC2インスタンスから作成したAmazon RDS for MySQLインスタンスへの接続手順
---

**(14) Amazon RDS for MySQLへの接続テスト用にAmazon EC2インスタンスを作成します。**
---

Amazon RDS for MySQLインスタンスへの接続用として、Amazon LinuxでEC2インスタンスを新規作成します。

EC2インスタンスのセキュリティグループには、Amazon RDS for MySQLインスタンスのセキュリティグループ[example-rds-mysql-server]に対するMySQL接続許可を追加した[example-server]セキュリティグループを割り当てます。

Amazon LinuxのEC2インスタンスを作成したら、mysqlをインストールします。

```console:mysqlインストール
[ec2-user@example-server ~]$ sudo yum -y install mysql
```

**(15) Amazon EC2インスタンスから作成したAmazon RDS for MySQLインスタンスへ接続します。**
---

Amazon EC2インスタンスで以下のようなmysqlコマンドを実行する事で、作成したAmazon RDS for MySQLインスタンスへ接続出来ます。

Amazon RDS for MySQLインスタンス作成時に指定したマスターユーザ名、マスターユーザのパスワードを入力して接続します。

mysql -u でマスターユーザ名を指定、-h でAmazon RDS for MySQLインスタンスのエンドポイント名を指定します。

MySQLデータベースへ接続できたら、Amazon RDS for MySQLインスタンスの作成は完了です。


```console:MySQL接続コマンド例
[ec2-user@example-server ~]$ mysql -u root -p -h example-rds-mysql-server.carvmoii2uds.ap-northeast-1.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.6.27-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
mysql> SELECT version();
+------------+
| version()  |
+------------+
| 5.6.27-log |
+------------+
1 row in set (0.00 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| exampledb          |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)

mysql> \q
```

[参考] Amazon RDS for MySQLインスタンスへのMySQLユーザ追加やテーブル作成手順
===

ここからはAmazon RDS for MySQLインスタンスにMySQLユーザを新たに追加したり、テーブルを作成する手順等について、ご参考までに記載致します。

**(16) Amazon RDS for MySQLインスタンスへMySQLユーザ追加します。**
---

Amazon RDS for MySQLインスタンスにMySQLユーザを追加したい場合、以下のようなGRANT文を実行します。

今回の例では、Amazon RDS for MySQLインスタンスにexample_userユーザを追加します。example_userユーザからのMySQL接続を許可するネットワークも指定します。こちらは例示用のネットワークとして198.51.100.0/255.255.255.0と記載していますが、実際にはEC2インスタンスを起動するプライベートサブネットのネットワークを指定したりします。
IDENTIFIED BYの部分でexample_userユーザのパスワードを指定します。


```console:mysqlユーザ追加コマンド例
[ec2-user@example-server ~]$ mysql -u root -p -h example-rds-mysql-server.carvmoii2uds.ap-northeast-1.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 5.6.27-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON exampledb.* TO example_user@'198.51.100.0/255.255.255.0' IDENTIFIED BY '**************';
Query OK, 0 rows affected (0.01 sec)

mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP ON exampledb.* TO example_user@'192.0.2.0/24/255.255.255.0' IDENTIFIED BY '**************';
Query OK, 0 rows affected (0.01 sec)

mysql> SELECT user, host FROM mysql.user WHERE user = 'example_user';
+--------------+----------------------------+
| user         | host                       |
+--------------+----------------------------+
| example_user | 192.0.2.0/24/255.255.255.0 |
| example_user | 198.51.100.0/255.255.255.0 |
+--------------+----------------------------+
2 rows in set (0.00 sec)

mysql> \q
```

example_userユーザでAmazon RDS for MySQLユーザへ接続出来る事を確認します。

```console
[ec2-user@example-server ~]$ mysql -u example_user -p -h example-rds-mysql-server.carvmoii2uds.ap-northeast-1.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.6.27-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> \q
```

**(17) Amazon RDS for MySQLインスタンスにテーブルを作成します。**
---

Amazon RDS for MySQLインスタンスにテーブルを作成する場合の例も記載致します。

Amazon RDS for MySQLインスタンスのタイムゾーンのデフォルトはUTCなので、JSTでデータを扱いたい場合、Amazon RDS for MySQLインスタンスのパラメータグループで「time_zone」パラメータを「Asia/Tokyo」へ変更する、または、MySQLへ接続する度に「SET SESSION time_zone = 'Asia/Tokyo'」を実行します。

今回の例では「SET SESSION time_zone = 'Asia/Tokyo'」を実行し、MySQL接続セッションのタイムゾーンをUTCからJSTへ変更した上で、作成したテーブルにレコードを追加しています。


```console:MySQLテーブル作成とデータ追加例
[ec2-user@example-server ~]$ mysql -u example_user -p -h example-rds-mysql-server.carvmoii2uds.ap-northeast-1.rds.amazonaws.com
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 5.6.27-log MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> CREATE TABLE `exampledb`.`example_table`( `id` int(12), `insert_date` datetime ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected (0.02 sec)

mysql> SELECT * FROM exampledb.example_table;
Empty set (0.00 sec)

mysql> SELECT now();
+---------------------+
| now()               |
+---------------------+
| 2016-02-20 17:30:15 |
+---------------------+
1 row in set (0.00 sec)

mysql> SET SESSION time_zone = 'Asia/Tokyo';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT now();
+---------------------+
| now()               |
+---------------------+
| 2016-02-21 02:30:21 |
+---------------------+
1 row in set (0.00 sec)

mysql> SELECT * FROM exampledb.example_table;
Empty set (0.01 sec)

mysql> INSERT INTO exampledb.example_table( id, insert_date) VALUES( 1, now() );
Query OK, 1 row affected (0.01 sec)

mysql> SELECT * FROM exampledb.example_table;
+------+---------------------+
| id   | insert_date         |
+------+---------------------+
|    1 | 2016-02-21 02:30:31 |
+------+---------------------+
1 row in set (0.01 sec)

mysql> \q
Bye
[ec2-user@example-server ~]$
```

***

長くなりましたが、以上になります。