Amazon Auroraハンズオンしてみた

# 目標
Amazon Auroraの下記5つの機能をハンズオンしていきます。

1.リーダーエンドポイント
2.カスタムエンドポイント
3.ポイントインタイム復元
4.フェイルオーバー
5.Auto Scaling

# Amazon Auroraとは？
>クラウド向けに構築された、MySQL および PostgreSQL と互換性のあるリレーショナルデータベースです。
商用データベースと同等のパフォーマンスと可用性を、10 分の 1 のコストで実現します。

https://aws.amazon.com/jp/rds/aurora/?trk=ps_a134p000003yMFOAA2&trkCampaign=pac_ps_Q2_620_Aurora_PDP_P_Brand_JP&sc_channel=ps&sc_campaign=pac_q2-6-2020_paidsearch_Aurora_EntApps_JP&sc_outcome=PaaS_Digital_Marketing&sc_geo=JAPAN&sc_country=JP&sc_publisher=Google&sc_category=Database&sc_detail=aurora&sc_content=aws_aurora_e&sc_matchtype=e&sc_segment=444112462461&sc_medium=PAC-PaaS-P|PS-GO|Brand|All|PA|Database|Aurora|JAPAN|JP|Text&s_kwcid=AL!4422!3!444112462461!e!!g!!aurora&ef_id=CjwKCAjw2P-KBhByEiwADBYWCtyl_X0HKqJ5fEssQJ015o6e5iFjJP6_uwInrycHOyOA4OCfD8Q1whoCcgoQAvD_BwE:G:s&s_kwcid=AL!4422!3!444112462461!e!!g!!aurora&aurora-whats-new.sort-by=item.additionalFields.postDateTime&aurora-whats-new.sort-order=desc

# 1.Auroraの作成
下記表を参照し、Auroraを作成します。

|項目|値|
|:--|:--|
|エンジンのタイプ|Amazon Aurora|
|エディション|Amazon Aurora MySQL 互換エディション|
|キャパシティータイプ|プロビジョニング済み|
|テンプレート|開発/テスト|
|マスターパスワード|※任意のパスワード|
|パスワードを確認|※任意のパスワード|
|マルチ AZ 配置|Aurora レプリカを作成しない|
|VPC セキュリティグループ|※3306ポート開放のSG|
|アベイラビリティーゾーン|ap-northeast-1a|
|▼追加設定<br>最初のデータベース名|testdb|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2088692/f7276999-feeb-fa75-6166-d99a8498b625.png)

# 2.リーダーインスタンスの追加
1.**[database-1]**を選択します。
2.**[アクション]**で、**[リーダーの追加]**を選択します。
3.下記表を参照し、入力後に**[Add reader]**を選択します。

|項目|値|
|:--|:--|
|DB インスタンス識別子|test1|
|アベイラビリティーゾーン|ap-northeast-1a|

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2088692/ab9ea5e9-8feb-a22a-3ab2-2ff494bc9404.png)

# 3.リーダーエンドポイント
リーダーエンドポイントでAuroraに接続を行い、リーダーインスタンスにのみ接続されるか検証します。

1.EC2からmysqlに接続します。

```
mysql -h [リーダーエンドポイント] -P 3306 -u admin -p
```

<details>
  <summary>リーダーエンドポイント確認場所</summary>
  1.**[test1]**を選択します。
  2.**[エンドポイントとポート]**の**[エンドポイント]**が、リーダーエンドポイントです。
</details>

2.接続先DBサーバのホスト名確認

```
mysql> show variables like "hostname";
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| hostname      | ip-172-23-1-179 |
+---------------+-----------------+
1 row in set (0.01 sec)
```

3.リーダーとライターどちらに接続しているか確認

```
mysql> show variables like "innodb_read_only";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_read_only | ON    |
+------------------+-------+
1 row in set (0.00 sec)
```

`innodb_read_only`がONになっている為、リーダーインスタンスです。

3.mysqlからログアウト

```
quit
```

上記手順を複数回試しましたが、接続が出来たのはリーダーインスタンスのみでした。
そのためリーダーエンドポイントでは、リーダーインスタンスにのみ接続される事が分かります。

# 4.カスタムエンドポイント
カスタムエンドポイントで指定したDBインスタンスにのみ接続が出来るか検証します。

1.**[database-1]**を選択します。
2.**[カスタムエンドポイントの作成]**を選択します。
![2021-12-02_15h10_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2088692/1f04abe2-482e-1ef1-04be-4785417c7f12.png)

3.エンドポイント名の入力後、**[test1]**を選択します。
4.**[エンドポイントの作成]**を選択します。
![2021-12-02_16h34_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2088692/eea0a0dc-87a5-43de-1920-b42b9f7e7f92.png)

5.**[リンクとなっているエンドポイント名]**を選択します。
先程指定した**[test1]**のみがエンドポイントメンバーに追加されている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2088692/80d8fc70-213b-71c7-9a01-be73ee5b49a2.png)

6.本記事[3.リーダーエンドポイント](https://qiita.com/drafts/1c67c5889ab379286718/edit#3%E3%83%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%82%A8%E3%83%B3%E3%83%89%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88)の手順を参考に、3.リーダーエンドポイントの時と同じホスト名である事を確認する。
カスタムエンドメンバーに選択した、**[test1]**にのみ接続される事が分かります。

# 5.ポイントインタイム復元
DBを指定した時間の状態に復元できるか検証します。

1.mysql接続

```
mysql -h [ライターインスタンスのエンドポイント] -P 3306 -u admin -p
```

2.DB指定

```
USE testdb;
```

3.テーブル作成

```
create table testdb.user (id int, name varchar(10));
```

4.テーブルが作成されたか確認

```
show tables;
```

5.データを入れる(復元の際に日時を指定する為、現在の時間を控える)

```
insert into user values (1, 'TestData1');
```

6.データ確認

```
SELECT * FROM user;
```

7.時間を空け、再度データを入れる

```
insert into user values (2, 'TestData2');
```

8.**[database-1]**を選択します。
9.**[アクション]**で、**[特定時点への復元]**を選択します。
10.下記表を参照し、DBを作成します。

|項目|値|
|:--|:--|
|復元する時点|カスタム(戻したい時間を指定)|
|DB インスタンス識別子|※任意|
|アベイラビリティーゾーン|※任意|
|最初のデータベース名|testdb|

11.新たに作成されたDBに接続し、データ確認

```
# mysql接続
mysql -h ライターインスタンスのエンドポイント -P 3306 -u admin -p

# DB指定
USE testdb;

# データ確認
SELECT * FROM user;
```

12.TestData2が消え、TestData1だけになっていれば復元成功

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/USER_PIT.html

# 6.フェイルオーバー
現在**[database-1-instance-1]**がライターインスタンスになっています。
フェイルオーバーを行い、**[test1]**をライターインスタンスに昇格させます。
![2021-12-02_16h42_16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2088692/2256dd89-ba69-bc9a-b32c-cf9b28b04375.png)

1.**[test1]**を選択します。
2.**[アクション]**で、**[フェイルオーバー]**を選択します。
3.**[フェイルオーバー]**を選択、反映まで時間がかかります。(通常30秒以内)
反映後**[test1]**がライターインスタンスになっていれば、フェイルオーバー成功です。
![2021-12-02_16h46_43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2088692/a379fd23-cfd4-5372-05da-a31eb319429d.png)

https://blog.tagbangers.co.jp/ja/2020/08/03/aurora-mysql-failover

# 7.Auto Scaling
DBにデータを入れる事で、自動拡張されるか検証します。

1.自動拡張されるようキャパシティータイプ**[サーバーレス]**でAuroraを作成します。

|項目|値|
|:--|:--|
|エンジンのタイプ|Amazon Aurora|
|エディション|Amazon Aurora MySQL 互換エディション|
|キャパシティータイプ|サーバーレス|
|マスターパスワード|※任意のパスワード|
|パスワードを確認|※任意のパスワード|
|最小 Aurora 容量ユニット|1 ACU|
|最大 Aurora 容量ユニット|2 ACU|
|スケーリングポイントが見つかる前にタイムアウトが期限切れになった場合は、次の操作を行います。|容量の変更を強制|
|既存の VPC セキュリティグループ|※3306ポート開放のSG|
|▼追加設定<br>最初のデータベース名|testdb|
|削除保護の有効化|✓を外す|

2.mysqlに接続し、データを入れます。

```
# mysql接続
mysql -h [エンドポイント] -P 3306 -u admin -p

# DB指定
USE testdb;

# テーブル作成
CREATE TABLE item (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(10),
  description VARCHAR(30),
  price INT UNSIGNED,
  created_at DATETIME
);

# ダミーデータの作成、コマンド実行毎に作成されるダミーデータが倍になります。
INSERT INTO item () VALUES (); # 1行作成
INSERT INTO item (id) SELECT 0 FROM item; # 2行になる
INSERT INTO item (id) SELECT 0 FROM item; # 4行になる
```

3.AWSコンソールで拡張されているか確認
**[ログとイベント]**タブの下記記載から、DBクラスターが自動で拡張された事が分かります。

```
原文
scaling DB cluster from 1 capacity unit to 2 capacity units for this reason: Autoscaling.

Google翻訳
この理由により、DBクラスターを1容量単位から2容量単位にスケーリングします。自動スケーリング。
```

4.**[モニタリング]**タブの**[Serverless のデータベース容量 (カウント)]**でも、自動拡張されている事が確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2088692/241a7a0f-4562-0784-fa09-8ec25bdf31a2.png)