RDS (Aurora) のカスタムエンドポイントの設定変更は通信断がある

## はじめに
[公式ドキュメント: カスタムエンドポイントの編集](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/Aurora.Overview.Endpoints.html#aurora-endpoint-editing) に記載されている

```
編集アクションによる変更の進行中は、カスタムエンドポイントへの接続やカスタムエンドポイントの使用はできません。エンドポイントのステータスが [使用可能] に戻り、再度接続できるようになるまでに数分かかることがあります。
```
「使用できません」とは？
「再度接続できるようになる」までの間どういう状況なの？
設定変更したいときどうしよう？

という興味で試してみた。

※AWS側の仕様変更などで将来的に確認結果は変わる可能性はあるので現状 (2019/2/22現在)の参考までに。

## 確認方法
Auroraクラスタに対してDNS Lookupの状況の変化＋mysqlコマンドでの接続可否がどう変化するのかを見ていく。

※以下のような雑な確認用スクリプトにて...。

```shell
#!/bin/bash

BEGIN=1
END=1800
LOG=$1

for i in `seq ${BEGIN} ${END}`
do
  echo "---`date`---" >> ${LOG}
  dig +short tomy-sre-aurora-read.cluster-custom-xxxxxxx.ap-northeast-1.rds.amazonaws.com >> ${LOG}
  echo "------------" >> ${LOG}
  mysql -udba -pxxxx -htomy-sre-aurora-read.cluster-custom-xxxxxxx.ap-northeast-1.rds.amazonaws.com --skip-column-names -e "select version()" >> ${LOG}
  echo "" >> ${LOG}
  sleep 5
done
```

## 今回のエンドポイントの初期状態
- 後ほど実施していく動作のために以下のような状態を作っておいた。
<img width="1036" alt="スクリーンショット 2019-02-22 14.27.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/69887/4f16a5de-d8c0-0a0a-dd73-e24c37908017.png">
<img width="829" alt="スクリーンショット 2019-02-22 14.28.54.png" src="https://qiita-image-store.s3.amazonaws.com/0/69887/cc8862b9-94fa-26f4-1306-fafdbe8b2966.png">
★追加設定「今後追加されるインスタンスをこのクラスターにアタッチする」はチェックを外した状態で始める。

- AWS CLIで確認してみると以下のようになっていた。

```json
$ aws rds describe-db-cluster-endpoints | jq .
：
    {
      ：
      "Status": "available",
      "EndpointType": "CUSTOM",
      "CustomEndpointType": "ANY",
      "StaticMembers": [
        "tomy-sre-aurora2"
      ],
      "ExcludedMembers": [],
      ：
    }
```
※チェックが入っているインスタンスが StaticMembersに入っている。
※`追加設定「今後追加されるインスタンスをこのクラスターにアタッチする」`にチェックが入っていない＝StaticMembers

## 既存のカスタムエンドポイントの設定変更をしていってみる
### 1) DBインスタンスを追加してみる
- 以下のように `tomy-sre-aurora3` にチェックを追加して [Save endpoint] で保存
<img width="839" alt="スクリーンショット 2019-02-22 14.40.12.png" src="https://qiita-image-store.s3.amazonaws.com/0/69887/e392a7b8-5757-348d-5430-f2e91927df3e.png">

- CLIで確認すると以下の状態になった。

```json
$ aws rds describe-db-cluster-endpoints | jq .
：
    {
      ：
      "Status": "available",
      "EndpointType": "CUSTOM",
      "CustomEndpointType": "ANY",
      "StaticMembers": [
        "tomy-sre-aurora2",
        "tomy-sre-aurora3"
      ],
      "ExcludedMembers": [],
      ：
    }
```
※チェックが入っているインスタンスが StaticMembersに入る。
※`追加設定「今後追加されるインスタンスをこのクラスターにアタッチする」`にチェックが入っていない＝StaticMembers

- 1分くらいでDNS Lookupできなくなり始めてmysqlコマンドで接続先が見つからなくなる ＝ `使用不可` の状態

```
ERROR 2005 (HY000): Unknown MySQL server host 'tomy-sre-aurora-read.cluster-custom-xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com' (2)
```

- 15分くらいでDNS Lookupが安定してできるようになった。

### 2) DBインスタンスを一部削除してみる
- `1)`が終わった状態で以下のように `tomy-sre-aurora2` のチェックをはずして [Save endpoint] で保存
<img width="830" alt="スクリーンショット 2019-02-22 14.59.43.png" src="https://qiita-image-store.s3.amazonaws.com/0/69887/850500da-b11c-2243-819a-01de92449684.png">

- CLIで確認すると以下の状態になった。

```json
$ aws rds describe-db-cluster-endpoints | jq .
：
    {
      ：
      "Status": "modifying",
      "EndpointType": "CUSTOM",
      "CustomEndpointType": "ANY",
      "StaticMembers": [
        "tomy-sre-aurora3"
      ],
      "ExcludedMembers": [],
      ：
    }
```
※チェックが入っているインスタンスが StaticMembersに入る。
※`追加設定「今後追加されるインスタンスをこのクラスターにアタッチする」`にチェックが入っていない＝StaticMembers

- 1分くらいでDNS Lookupできなくなり始めてmysqlコマンドで接続先が見つからなくなる

```
ERROR 2005 (HY000): Unknown MySQL server host 'tomy-sre-aurora-read.cluster-custom-xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com' (2)
```

- 15分くらいでDNS Lookupが安定してできるようになった。

### 3) 「追加設定」を変更してみる
- `2)`が終わった状態で以下のように `今後追加されるインスタンスをこのクラスターにアタッチする` にチェックして [Save endpoint] で保存
<img width="832" alt="スクリーンショット 2019-02-22 15.22.41.png" src="https://qiita-image-store.s3.amazonaws.com/0/69887/4bfd58ab-f6d7-52a8-0e6e-adda4824afe0.png">

- CLIで確認すると以下の状態になった。

```json
$ aws rds describe-db-cluster-endpoints | jq .
：
    {
      ：
      "Status": "modifying",
      "EndpointType": "CUSTOM",
      "CustomEndpointType": "ANY",
      "StaticMembers": [],
      "ExcludedMembers": [
        "tomy-sre-aurora1",
        "tomy-sre-aurora2"
      ],
      ：
    }
```
※`追加設定「今後追加されるインスタンスをこのクラスターにアタッチする」`にチェックが入っている＝ExcludedMembers
※今存在するインスタンスかつチェックが入ってなければ今後自動でアタッチされないのでExcludedMembersになっている。

- 1分半くらいでDNS Lookupできなくなり始めてmysqlコマンドで接続先が見つからなくなる

```
ERROR 2005 (HY000): Unknown MySQL server host 'tomy-sre-aurora-read.cluster-custom-xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com' (2)
```
※DBインスタンスの追加/削除よりも多そう。
※3分くらいでStatusは available になるが...しばらくDNS Lookup不安定。

- 15分くらいでDNS Lookupが安定してできるようになった。

### 4) 「追加設定」にチェックが入った状態で既存インスタンスを追加してみる 
- `3)`が終わった状態で以下のように `tomy-sre-aurora2` にチェックをして [Save endpoint] で保存
<img width="831" alt="スクリーンショット 2019-02-22 15.48.06.png" src="https://qiita-image-store.s3.amazonaws.com/0/69887/4b594d9d-e8e7-c633-43e7-ff562dc06db1.png">

- CLIで確認すると以下の状態になった。

```json
$ aws rds describe-db-cluster-endpoints | jq .
：
    {
      ：
      "Status": "modifying",
      "EndpointType": "CUSTOM",
      "CustomEndpointType": "ANY",
      "StaticMembers": [],
      "ExcludedMembers": [
        "tomy-sre-aurora1"
      ],
      ：
    }
```
※`追加設定「今後追加されるインスタンスをこのクラスターにアタッチする」`にチェックが入っている＝ExcludedMembers
※今存在するインスタンスかつチェックが入ってなければ今後自動でアタッチされないのでExcludedMembersになっている。

- 1分半くらいでDNS Lookupできなくなり始めてmysqlコマンドで接続先が見つからなくなる

```
ERROR 2005 (HY000): Unknown MySQL server host 'tomy-sre-aurora-read.cluster-custom-xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com' (2)
```
- 15分くらいでDNS Lookupが安定してできるようになった。

### 5) 新規リーダー用インスタンスを追加してみる

- `4)`が終わった状態で同じクラスタ内にリーダーを追加
- 特に接続に問題なくカスタムエンドポイントに追加された

### 6) リーダー用インスタンスを1つ削除してみる

- `5)`が終わった状態で同じクラスタ内からリーダーを1つ削除
- 特に接続に問題なくカスタムエンドポイントから消えた

### 7) 新たに別のカスタムエンドポイントを追加で作成してみる

- `6)` が終わった状態で同じクラスタ内に別名の新カスタムエンドポイントを作成
<img width="1057" alt="スクリーンショット 2019-02-22 20.59.20 1.png" src="https://qiita-image-store.s3.amazonaws.com/0/69887/d3ab17bb-9e9d-7fbe-aa86-50345e2eeb09.png">

- 特に既存のカスタムエンドポイントへの接続に問題なく新たにカスタムエンドポイントが作られた

### 8) 旧カスタムエンドポイントを削除してみる

- `7)` が終わった状態で旧カスタムエンドポイント `tomy-sre-aurora-read.cluster-custom-xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com` を削除

- 特に新カスタムエンドポイントへの接続に問題なく旧カスタムエンドポイントが削除された

## まとめ
基本的に既存のカスタムエンドポイントの設定を変えるときにはドキュメントにある通り通信断が発生するので注意。
15分程度で安定する模様。

AWS Consoleからカスタムエンドポイントの設定に何らかの変更を加えたい場合、
新カスタムエンドポイントを別に作成＋利用開始、旧カスタムエンドポイントを削除、
が良さそうである。