EC2を踏み台にしたRDSに対してDB操作を実施する

## 概要
AWSのRDS（MySQL）を配置し、これに対してテーブルを定義するまでの手順を一通り起こす。
SS内に伏字にするべき内容がわんさか乗っているが、一応全部リソース全部消してから記事公開しているので無問題のつもりです。

教材には以下2つのUdemyの動画を利用しました。
会社支給のビジネスアカウントなので無料でした。最高！

[データベース基礎からAmazon RDSの構築・管理を網羅的に学習する講座（AWS実践力強化）](https://www.udemy.com/course/dbamazon-rds/?couponCode=JPLETSLEARNNOW)
AWSのリソース捜査関係のところ(手順1~4まで)についてはこちらで勉強しています。

[【22日間で学ぶ】SQL文、分析関数、テーブル設計、SQLチューニングまでMySQLで覚えるSQL実践講座](https://www.udemy.com/course/3sqlmysql/?couponCode=JPLETSLEARNNOW)
手順5のSQL分についてはこちらで勉強しました。

## 背景
本業でMySQLを触り始めたが、全体的に解像度が低いので、AWS上のRDSでテーブル定義するところまでを触っておきたかった。

## 手順
### 1. VPCの配置
プライベートサブネットにRDSを配置し、これに対してパブリックサブネットに配置したEC2を踏み台にして接続できるようにしたい。
そのためにまずVPCの環境を作る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/d621905c-b285-5eeb-6133-42a69fddb8c4.png)

「VPCなど」を選択してルーティング、サブネットの作成、エンドポイントの設定等全部一括で作る。
CIDRのマスクを16から24に変更しているが、今回はEC2とDBを1つずつ配置するだけなのでマスク範囲を広くしている。

### 2. EC2を作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/74fbe3d0-ca38-8fa0-207b-1fea188d62ee.png)

1.の手順で作成したVPC内の環境のうち、パブリックサブネットに当たるサブネットで配置されるように設定する。
このEC2に対してSSH接続するため、キーペアを作成し、パブリックIPも割り当てておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/c58246da-e687-503f-dc33-9d8bc03f5f54.png)

セキュリティグループ設定については初期設定のままで問題ない。

### 3. RDSを作成

まずRDSのページの画面左側にあるサイドナビゲーションから、サブネットグループを選択してサブネットグループを作成しておく。
選択するサブネットはプライベートサブネットとして割り当てられているものを選択する。
直接DBにアクセスできるような環境にしたくないからね...

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/73398f9f-6125-a555-8a6a-3c09699e605e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/d8572c34-b7b4-337e-5dc5-0be05b2ef77d.png)

以下スクショのような感じで設定してDBを作成する。

![ap-northeast-1.console.aws.amazon.com_rds_home_region=ap-northeast-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/4e672ab4-9894-e488-f2f8-7e00dacd3911.png)

環境構築のおさらいみたいな使い方を想定しているので無料利用枠を利用している。
マルチAZがしたいとかであればそれ相応のテンプレートを選択して下さい。
マスターパスワードは後々使うので残しておくこと。

DBサブネットグループは、先ほど作成したグループを割り当てる。

しばらく待ってDBが作成出来たら、DBに割り当てられたVPCのセキュリティグループに対し、インバウントルールの設定として、踏み台にしたEC2インスタンスのプライベートIPv4アドレスを割り当てる。
これをすることで、特定のEC2からDBに対してアクセスをすることができるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/138129b0-f859-a3f3-508b-8dea2f0ea3f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/1e7d10dc-97ef-916a-6238-a356a578a3fe.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/4fef581c-45a5-d4ce-8947-8dd56e6c89a9.png)

### 4. 接続

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/62cdafd6-8288-dfd3-ef1f-cd275c4fc34b.png)
[MySQL WorkBench](https://www.mysql.com/jp/products/workbench/)にて、こんな感じで設定を入力。

| 設定項目名 | 入力内容 |
|:-:|:-:|
|SSH Hostname|踏み台にするEC2のパブリックIPv4アドレス|
|SSH Username|"ec2-user"で固定|
|SSH Password|入力しない|
|SSH Key File|EC2インスタンスを作成するときに一緒に作ったキーペアのpemファイル|
|MySQL Hostname|作成したDBのエンドポイント|
|MySQL Server Port|作成したDBのポート|
|Username|変更していなければ"admin"|
|Password|DBを作成するときに指定したパスワード|
|Default Schema|入力しない|

設定がうまくいっていれば、これで接続できるはず。

なお、DBのエンドポイントとポートについては以下赤丸を参照。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/a8c87b39-0d0c-b10b-c105-848a789141b6.png)

### 5. SQLを用いたDB操作

#### 作成されているデータベースの一覧を見る
```sql
show databases;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/dacdded4-3f2a-4c6a-ee58-d9c69a9d48f3.png)

#### データベースを作成する
```sql
create database qiita_db;
show databases;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/063049ea-34c2-c5a5-913b-9b5560c44037.png)
qiita_dbという名前でDBを作成できている。

#### データベースを削除する
```sql
drop database qiita_db;
show databases;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/8476a613-ec32-4ebb-11b1-e991cd6dcde0.png)
qiita-dbという名前で作成していたデータベースが削除されている。

#### 使用するデータベースを選択する
```sql
create database qiita_db;
use qiita_db;
select database();
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/f33f21a1-13d4-1c6f-0eee-b4267819cb7f.png)
`use`で利用するデータベースを宣言できる。
`select database()`で、現在利用中のデータベースの名称を確認できる。

#### 作成されているテーブルを見る
```sql
show tables;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/e6893af8-4b0e-04d0-f55f-9f89e29eca4c.png)
作成直後のデータベース内で作成されているテーブルの一覧を取得している。
空なので、何もないことが出力から確認できる。

#### データベース内にテーブルを作成する
```sql
create table users(
	id int,
    name varchar(10),
    age int,
    phone_number char(13),
    message text
);
show tables;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/1c5a050b-d3fa-9abd-ecda-0d070b3e74de.png)
空だったテーブル一覧に、usersテーブルが追加されていることがわかる。

#### テーブルの定義を取得する
```sql
describe users;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/3269c46d-bb62-b542-bfbd-77708e2d7fa1.png)
usersテーブルを作成する際に指定されたカラムの属性等が取得できる。

#### テーブルを削除する
```sql
drop table users;
show tables;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/420c66d7-2da6-1b07-4eb0-e963a82f8fbb.png)
作成したusersテーブルが削除されて、データベース内のテーブルがなくなったことを確認している。

#### テーブル名の変更
```sql
create table users(
	id int primary key,
    name varchar(10),
    age int,
    phone_number char(13),
    message text
);
alter table users rename to users_table;
show tables;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/527776f8-ea7a-7480-f9f5-47002a6e13d0.png)
usersという名称で作成したテーブルが、users_tableに変更されていることが確認できる。

#### カラムを削除する
```sql
alter table users_table rename to users;
alter table users drop column message;
describe users;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/5419a41a-d40c-c08c-f944-5d0721c863bd.png)
先頭行は、テーブルの名称をusersに戻している。
messageカラムが削除されている。

#### カラムを追加する
```sql
alter table users add post_code char(8);
alter table users add gender char(1) after age;
alter table  users add new_id int first;
describe users;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/7d6c756f-ca1b-a3b3-7ac4-e42b306592cb.png)
post_codeという列を8文字で作成している。
場所の指定について何もない場合は、一番最後にカラムが追加される。
`after`句をつけると、指定したカラムの後にカラムを作成することができる。
`first`句をつけると、先頭にカラムが作成される。

#### カラムのデータ型を変更する
```sql
alter table users modify name varchar(50);
describe users;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/be5d7d4f-31c0-4d82-9f0a-737c35760089.png)
name列がvarcharの文字数10だったのが、50に変更されている。

#### カラム名称・カラム位置の変更
```sql
alter table users change column name namae varchar(50);
alter table users change column gender gender char(1) after post_code;
describe users;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2831069/2d57addd-a8c9-41a7-9a2f-2d3ba3de2609.png)
name列がnamae列へと名称が変更されている。
また、gender列がpost_codeの後ろに位置が移動している。

## さいごに

やること多くてむずかしいですね