Route53PrivateHostedZone内でDNSフェイルオーバー（Active-Active）を設定

[前回](https://qiita.com/tonkatsu_oishi/private/31aa7d2c17cac4b6ca84)は、Route53のPrivateHostedZoneにてDNSフェイルオーバー（Active-Passive）を設定する手順をご紹介しました。

今回は、Route53のPrivateHostedZoneにてDNSフェイルオーバー（Active-Active）を設定する手順をご紹介していきたいと思います。

### 構成の確認

#### 現在の構成
現在の環境を構成図で確認します。
現在、VPC上にパブリックサブネットが一つ、プライベートサブネットが二つ存在します。
パブリックサブネット上には踏み台サーバーが、プライベートサブネット上には一台ずつWEBサーバーが存在します。
VPCにはRoute53のPrivateHostedZoneを紐づけ、「web-test.https-demo.com」というドメイン名でDNSフェイルオーバー（Active-Passive)の設定を行っています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/1c3ab7c5-a544-a197-d83e-e46292165d1f.png)


#### 今回の構成
今回は、一度DNSフェイルオーバーのレコードを削除したうえで、
DNSフェイルオーバー（Active-Active）の設定を行います。
Active-ActiveのDNSフェイルオーバーを設定する場合は、Route53のルーティングポリシーを「加重ルーティング」「レイテンシーベースルーティング」などで設定します。

[参考：フェイルオーバー（Active-Active)](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/dns-failover-types.html#dns-failover-types-active-active)

今回はルーティングポリシーに加重ルーティングを使用し、WEB1/WEB2のサーバーそれぞれに同じ加重（加重10)を割り当てます。

こうすると、平常時はWEB1/WEB2に対して同じ比率でルーティングが行われます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/519b1795-90b3-6bfc-de55-9fef31d86996.png)


#### Active-Activeの場合のヘルスチェックについて
##### 平常時の挙動
DNSフェイルオーバーをActive-Activeで設定する場合は、どちらのレコードにもRoute53ヘルスチェックを紐づける必要があります。
今回の場合は、WEB1のRoute53ヘルスチェックには、WEB1に対するStatusCheckFailed_systemのCloudWatchアラームを紐づけます。
WEB2のRoute53ヘルスチェックには、WEB2StatusCheckFailed_systemのCloudWatchアラームを紐づけます。
加重ルーティングの加重をWEB1/WEB2で同じ値にしているため、平常時（両サーバーに対するヘルスチェックが成功している時）は、WEB1/WEB2に同じ割合でルーティングされます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/0a5aa3cc-2ffc-b115-1255-79374b00bc5c.png)


##### 異常検知時の挙動
ヘルスチェックが失敗したサーバーについては、次にヘルスチェックが成功するまでの間ルーティング対象から外れます。
下記画像の例では、WEB1のヘルスチェックが失敗し、ルーティング対象から外されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/f35d11d7-1001-421c-03ea-cf315d8bab8c.png)

### 作業の流れ
作業は下記流れで行います。
今回はRoute53のレコード設定作業をメインにご紹介します。
Route53PrivateHostedZoneの作成やApacheの設定は[前回の記事](https://qiita.com/tonkatsu_oishi/private/31aa7d2c17cac4b6ca84)でご紹介しているので、手順が分からない場合はそちらをご参照ください。
また、VPCやサブネット・EC2の設定は[こちら](https://qiita.com/tonkatsu_oishi/items/cded18d47108fb04961d#vpc%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E8%B8%8F%E3%81%BF%E5%8F%B0%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E4%BD%9C%E6%88%90)の記事群でご紹介しています。

[1.Route53でPrivateHostedZoneを作成し、VPCに紐づける](https://qiita.com/tonkatsu_oishi/private/31aa7d2c17cac4b6ca84)
[2.EC2（WEB1/2）にApacheをインストールし、テスト用ページを配置する](https://qiita.com/tonkatsu_oishi/items/cded18d47108fb04961d#vpc%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E8%B8%8F%E3%81%BF%E5%8F%B0%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E4%BD%9C%E6%88%90)
3.Route53のヘルスチェックを作成
4.Route53のフェイルオーバールーティング（Active-Active)を設定
5.動作確認

### 構築手順
#### Route53のヘルスチェックを作成
今回は、WEB1/WEB2両方のレコードに対してRoute53のヘルスチェックを紐づけます。
PrivateHostedZoneでRoute53のヘルスチェックを利用する場合は、CloudWatchアラームをヘルスチェックに紐づける形となります。
※詳しくは[前回](https://qiita.com/tonkatsu_oishi/private/31aa7d2c17cac4b6ca84#route53%E3%81%AE%E3%83%98%E3%83%AB%E3%82%B9%E3%83%81%E3%82%A7%E3%83%83%E3%82%AF%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)をご参照ください。

前回の記事でWEB1に対してのヘルスチェックを設定しているので、今回はWEB2に対するヘルスチェックを設定していきます。
##### WEB2に対してCloudWatchAlarmを設定
WEB2に対しても、CloudWatchアラームを作成していきます。
監視するメトリクスは、WEB1と同様に「StatusCheckFailed_System」を設定します。

CloudWatchのトップページに移動し、左メニューから「アラーム」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/975e0c74-caf1-4660-a7b9-fef1d6e9560e.png)
メトリクスの選択画面が表示されます。
「メトリクスの選択」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/cd5d8c03-194c-9c6a-ce06-408e989709c3.png)

「EC2」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/2f753716-c016-49e0-2af3-324be018e55a.png)

「インスタンス別メトリクス」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/00b4aab4-e703-9de3-cbb6-bf65ebb42341.png)

EC2のメトリクス一覧から、メトリクス名が「StatusCheckFailed_system」かつ「インスタンス名」がWEB2（この画像ではHTTPS_DEMO_02)となっているものを見つけ、チェックボックスにチェックを入れます。
「メトリクスの選択」を押下します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/6fa4cae7-5a09-a4d5-f609-91344a174be8.png)
メトリクスの監視条件設定画面が表示されます。
「統計」を「最大」に設定し、「期間」を「1分」に設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/833c53b9-f425-0b32-87ec-46b2d8582c86.png)
「条件」のセクションまでスクロールします。
しきい値の種類は「静的」を選択します。
アラーム条件には「以上(>=しきい値)」を設定し、しきい値には「1」を設定します。

「StatusCheckFailed_system」メトリクスは、EC2が停止している間は記録されない状態となります。
メトリクスが欠落（記録されない）している状態でもDNSフェイルオーバーとなるよう、
「欠落データの処理」を「欠落データを不正（しきい値を超えている）として処理」に設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/f6b04df9-41ca-123b-a79f-4ae9e78c2f27.png)

全ての設定を終えたら、「次へ」を押下します。
アクションの設定画面が表示されます。
「アラーム通知トリガー」を「アラーム状態」にします。
SNSトピックを「既存のSNSトピックを選択」に指定し、プルダウンからSNSトピックを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/91c1ed5e-9769-a7fc-4b03-28e52d697abb.png)
その他のアクションは指定せず、「次へ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/e7e9e84d-00ea-eff2-e89a-4de71007bd32.png)
「名前と説明を追加」の画面が表示されます。
アラーム名を入力し、「次へ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/2af7ec94-d79f-2adb-2882-f235c188f5f8.png)
プレビュー画面で設定内容を確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/636f55b4-4c8e-30d8-57cf-e2feec8963e5.png)
設定に間違いがなければ、「アラームの作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/6685261b-3265-7575-6c2b-6725b9dba0be.png)
アラームが正常に作成されていることを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/7fd50030-27fa-f17e-3bdf-adf74845106f.png)

これで、WEB2に対するCloudWatchAlarmの設定が完了しました。

##### Route53のヘルスチェックを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/9a5ccd0c-c955-459a-e046-f969feb7105c.png)

ヘルスチェックのトップ画面が表示されたら、「ヘルスチェックの作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/21af181d-8f32-c621-de93-daec1b1e3cbc.png)

ヘルスチェックの設定が表示されます。
ヘルスチェックの名前を入力します。
「モニタリングの対象」は「CloudWatchアラームの状態」を設定します。
「CloudWatchリージョン」を対象のサーバーが存在するリージョン（今回は東京リージョン）に設定します。
「CloudWatchAlarm」には、先ほど作成したCloudWatchAlarmを設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/33d001c3-7286-3259-1a18-cd261c516854.png)

下にスクロールします。
ヘルスチェックステータスについて、「アラームが不足状態にある場合、そのステータスは正常です」を選択します。
全ての設定を完了したら、「次へ」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/c2d3f5b1-f074-76de-09f7-14ab294be467.png)

ヘルスチェックが失敗した際の通知についての設定画面が表示されます。
「アラームの作成」は「いいえ」を選択し、「ヘルスチェックの作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/73de3770-ccb9-2ede-d76f-543775edfa40.png)

「ヘルスチェックの作成に成功しました」と表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/3172c145-cf5f-887d-1c7a-910295df3578.png)
画面を更新すると、作成したヘルスチェックが確認できるようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/0d51ede9-7a59-4978-5189-3f55723c4c78.png)



#### Route53PrivateHostedZoneの状況確認
前回Active-Passiveフェイルオーバールーティングの設定を行ったため、Route53PrivateHostedZoneは画像のような状態となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/6393b53f-525f-e552-d105-f569c0c19a1a.png)

「web-test.https-demo.com」のフェイルオーバールーティングレコードが残っている状態だと加重ルーティングの設定が行えないため、該当のレコードを削除していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/34a15c3c-4656-6450-6f04-598ef0e570c2.png)

削除が完了した状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/f0272d02-79e8-f897-8e63-4eb187b5873a.png)

#### Route53のフェイルオーバールーティング（Active-Active)を設定
今回は、このタイミングでDNSフェイルオーバーのレコード設定も行います。
##### WEB1のレコード作成
「レコードを作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/9659b5c6-c6bf-f21b-7c28-b51a2ac29d96.png)

レコード作成画面が表示されます。
レコード画面が表示されます。
「レコード名」は「web-test」と入力します。
「レコードタイプ」は「A」に設定します。
「値」は10.0.1.4を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/fd77a660-17fc-5935-963e-c0412c984f3e.png)
「TTL」は「60」を指定します。
「ルーティングポリシー」には「加重」を選択し、「重量」は「10」に設定します。
「ヘルスチェックID」のプルダウンメニューから、WEB01用のRoute53ヘルスチェックを選択します。
「レコードID」には「web-test-01」を入力します。
レコードの設定入力が完了したら、「別のレコードを追加」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/649c92a9-3cf6-02b9-466d-2fbee07ac902.png)

##### WEB2のレコード作成
WEB02のレコードも、同じ要領で作成します。レコード名は先ほどと同様「web-test」を設定します。
「値」にはWEB2のIPアドレス（10.0.5.4）を設定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/03389fc0-a7c0-01a7-53ed-4f4317911c2e.png)

TTL・ルーティングポリシー・加重については、WEB01と同様に設定します。
「ヘルスチェックID」のプルダウンメニューから、先ほど作成したWEB02用のヘルスチェックを選択します。
「レコードID」は「web-test-02」を入力し、「レコードを作成」を押下します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/5c40b08a-6550-af15-8f29-378f65a139ce.png)

レコードの作成が完了した状態です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/aaaafc31-5311-9ee9-1ae1-62aa8d71c65c.png)

#### 動作確認
##### 平常時
接続確認を行います。
踏み台サーバー（Windows)にログインし、ブラウザを立ち上げます。
ブラウザに「http://web-test.https-demo.com 」と入力すると、タイミングによってWEB1とWEB2のテストページがランダムに表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/b59a8c12-fc88-2581-010a-6de47fba5c1b.png)

今回は、加重ルーティングでWEB1/WEB2を同じ割合にしています。
[re:postの記事](https://repost.aws/ja/knowledge-center/route-53-fix-dns-weighted-routing-issue)を参考に、Linuxの踏み台サーバーから加重ルーティングポリシーの設定が本当に動作しているかテストしてみます。

Linuxサーバーにて下記コマンドを実行してみます。

    for i in {1..20000}; do domain=$(dig web-test.https-demo.com. @10.0.0.2 +short); echo -e  "$domain" >> RecursiveResolver_results.txt; done

:::note info
for i in {1..20000}; do……ループを1から10000回実行
domain= \\$(dig web-test.https-demo.com. @10.0.0.2 +short)……10.0.0.2のDNSリゾルバに対して「web-test.https-demo.com」を問い合わせ、結果を簡易表示したものを変数「domain」に格納
echo -e "$domain" >> RecursiveResolver_results.txt……変数「domain」を「RecursiveResolver_results.txt」に書き込み
:::
上記コマンドを実行すると、「dig web-test.https-demo.com. @10.0.0.2 +short」を2万回実行し、結果を「RecursiveResolver_results.txt」に書き込みます。

「RecursiveResolver_results.txt」には画像のような形で、digコマンドの実行結果が書き込まれています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/b06a0b84-c3c8-bb6d-c343-662f12c37b47.png)

下記コマンドを実行し、「RecursiveResolver_results.txt」に記録されているdigコマンドの実行結果を、IPアドレス別に集計します。

    sort RecursiveResolver_results.txt | uniq -c | sort -nr

:::note info
sort RecursiveResolver_results.txt……「RecursiveResolver_results.txt」ファイルの内容をソートする
uniq -c……ファイル内の重複する行を削除し、各行の前に出現回数を出力する
sort -nr……データを降順にソートする
:::

コマンドを実行してみると、「web-test.https-demo.com」に対して10.0.1.4が返された回数が7934回、10.0.5.4が返された回数が12066回のようです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/b1631b01-5b42-646b-0f2e-baf3a3bbda7f.png)


何度かdigコマンドを実行して集計してみました。
タイミングによってばらつきはありますが、「web-test.https-demo.com」に対して10.0.1.4と10.0.5.4の両方が返されており、Active-Activeの状態であることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/364c5c6d-1328-9477-31c1-8e4315206243.png)

##### フェイルオーバーの確認
WEB2のサーバーを落とし、WEB1のみにルーティングされるのか確認してみます。
踏み台サーバー（Windows）でWEB2の画面を表示しておきます。
この状態でWEB2のインスタンスを停止させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/d2d8682d-8785-4ad5-1c7b-229556c79cc3.png)

Route53のヘルスチェックが失敗状態になるまで待機してから踏み台サーバー（Windows）のブラウザを更新すると、WEB1の画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/88317d12-10c6-d4e0-4ba5-85d9a7670c1d.png)

逆に、WEB2を起動させてWEB1を停止した状態にしてみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/4f340665-e009-13a8-70d8-358ae560571d.png)

Route53のヘルスチェックステータスが更新されるまで待ってから踏み台サーバー（Windows）のブラウザを更新すると、WEB2の画面が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2237429/99e0df6f-14b6-ebdf-4b28-61985aec8b0c.png)

これで、今回ご紹介する手順は以上となります。
ここまでお読みいただきありがとうございました。