Route53 トラフィックフローでルーティングポリシーを組み合わせてみた

#目次
[1.はじめに](#はじめに)
[2.前提](#前提)
[3.トラフィックフローとは](#トラフィックフローとは)
[4.トラフィックフローの設定](#トラフィックフローの設定)
[5.ルーティング状況の確認](#ルーティング状況の確認)
[6.まとめ](#まとめ)

#はじめに
Route53とはAWSで提供されているDNSサービスであり、ユーザからのリクエスト通信でドメイン名とIPアドレスの変換を行った上、効率的に通信先のインフラストラクチャにルーティングをします。ルーティングの方法としていくつか種類がありますので、以下の表にまとめますが、複数のルーティングポリシーを組み合わせる等、複雑なルーティングを実装する場合は設定や管理が煩雑になります。そこで今回、「トラフィックフロー」という複雑なルーティングの設定/管理をサポートする機能を使ってみましたので、概要と設定の流れを簡単に整理します。

<table>
<tr>
 <td><b>項番</b></td>
  <td><b>ルーティングポリシー<b></td>
  <td><b>内容</b></td>
</tr>
<tr>
  <td><b>1</b></td>
  <td>シンプルルーティング</td>
　<td>単一のリソースへトラフィックをルーティングする</td>
</tr>
<tr>
  <td><b>2</b></td>
  <td>フェイルオーバールーティング</td>
  <td>プライマリとセカンダリでリソースを指定し、プライマリのリソースが正常でない場合はセカンダリへトラフィックをルーティングする</td>
</tr>
<tr>
  <td><b>3</b></td>
  <td>位置情報ルーティング</td>
　<td>ユーザの地理的場所(DNSクエリの送信元の場所)に基づいて、リソースを選択し、ルーティングする</td>
</tr>
<tr>
  <td><b>4</b></td>
  <td>地理的近接性ルーティング</td>
　<td>ユーザ(DNSクエリの送信元)とリソースの地理的場所に基づいて、トラフィックをルーティングする<br>※トラフィックフローの機能を用いる必要がある</td>
</tr>
<tr>
  <td><b>5</b></td>
  <td>レイテンシールーティング</td>
　<td>複数のAWSリージョンでアプリケーションがホストされている場合、ネットワークレイテンシーが最も低いAWSリージョンに基づいて、トラフィックをルーティングする</td>
</tr>
<tr>
  <td><b>6</b></td>
  <td>複数値回答ルーティング</td>
　<td>ルーティング先として複数のリソースを設定できる(最大8つ)<br>
※各リソースに対して、正常かどうかの確認をし、正常なリソースに対してルーティングする</td>
</tr>
<tr>
  <td><b>7</b></td>
  <td>加重ルーティング</td>
　<td>ルーティング先として複数のリソースを設定し、各リソースへのルーティングの割合を指定してトラフィックを分散させる</td>
</tr>
</table>




#前提
今回は上表にある項番2「フェイルオーバールーティング」と項番7「加重ルーティング」をトラフィックフロー機能を用いて、組み合わせてみました。トラフィックフローを設定する上で構築したAWS構成は以下の通りとなります。
![インフラ3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/4877c6ee-057c-7bc9-b19b-70a423cbb484.png)


構築における補足は次の通りです。

- 無料で使用できるドメインプロバイダ「Freenom」で独自ドメイン「aws-uni.ga」を取得しました。
- Freenomのマイドメイン管理画面でNameServerにAWS Route53のDNSサーバを指定しました。
- フェイルオーバールーティングで、通常時はALBへトラフィックをルーティングし、EC2インスタンスからWebページを返します。
- フェイルオーバールーティングで、EC2インスタンス障害時等はS3バケットに保存されたSorryページを返します。
- S3バケットでは静的Webサイトホスティング機能の有効化、読み取り専用のバケットポリシーを設定しました。
- 加重ルーティングを使用し、通常時のトラフィックを2つのVPCに7:3の割合で分散します。
- 構築したVPC/サブネット/EC2インスタンス/ALB/S3バケット/Route53の基本設定をまとめます。

■ VPC
![VPC.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/796ca3cc-73c1-c5c3-b9fa-c93df1b9a14a.png)
■サブネット
![サブネット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/56703017-7600-be31-87fa-0fdf28f8f1a0.png)
■EC2インスタンス
![EC2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/aa05afde-c0dc-c11a-3b94-ff264ada28df.png)
■ALB
![ALB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/8f0ae8ad-5815-47cf-ba72-61723a496ea2.png)
■S3 　
![S3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/90e99429-552a-fdfc-6274-7a5883dd2284.png)
■Route53
Freenomで取得したドメイン「aws-uni.ga」に対するパブリックホストゾーンの作成
![53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/59643597-58bb-6016-8780-79953436bbb7.png)


上記のような構成のもと、トラフィックフローを設定していきましたので、以降、概要と設定の流れをまとめておきたいと思います。

#トラフィックフローとは
Route53でのDNSレコード設定について、レイテンシー、フェイルオーバー、加重などの複数のルーティングポリシーを組み合わせて使用する場合、複雑な階層構造となり、レコードの管理が難しくなることがあります。このような複雑なルーティングのサポートをしてくれるのがトラフィックフローであり、主に次のような機能を提供します。
![トラフィックフロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/1f0a42ab-5fc0-0d48-e176-1ed7b7df454c.png)


###ビジュアルエディタ
トラフィックフロービジュアルエディタを使用すると、簡単なGUI操作でレコードの複雑な階層構造をトラフィックポリシーとして定義し、レコード間の関係を視覚的に管理することができます。また、トラフィックポリシーの作成数に上限はありません。

###バージョニング
作成したトラフィックポリシーはバージョン管理をすることができます。そのため、ポリシーに変更が発生した際も最初から作成し直す必要もありません。また、デフォルトでは1つのトラフィックポリシーに対し、1000バージョンまで管理することができます。

###地理的近接性ルーティングポリシー
Route53の地理的近接性ポリシーはトラフィックフローを使用する場合のみに使用できます。

※AWS公式によると、トラフィックフローの料金は「50.00USDポリシー記録ごと/月」でした。割と高めの料金かなと思いますので、設定した場合、不要であれば削除を忘れないようにしましょう。

#トラフィックフローの設定
それでは、「前提」で記載したAWS構成を構築するにあたり、トラフィックフローの設定の流れをまとめていきます。

- Route53の管理画面から「トラフィックポリシー」を押下します。
![Route53管理画面.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/397cb2f1-a40f-9e60-7ebe-4de6008bfab4.png)
- 「トラフィックポリシーの作成」を押下します。
![トラフィックフロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/2745323b-cd44-8159-f1bc-52bdceca27d2.png)
- 「ポリシー名」と適宜「バージョンの説明」を入力し、「次へ」を押下します。
![ポリシー名.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/a93c5102-1283-0e24-ae0d-cdf96c06cd7d.png)
- 次のようなエディタ画面が表示されます。DNSタイプはいくつかの選択肢から選べますが、今回はAレコードを指定します。
![選択肢.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/ef608d5a-ecd8-7e69-9281-fc9fcee196ef.png)
- 「＋...に接続」を押下します。
![エディタ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/bed53f70-a784-f9e5-17af-698b64008adf.png)
- 「フェイルオーバールール」を選択します。
![フェイルオーバー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/5f5ab946-82e4-76bd-c499-f75fcb76c0af.png)
- プライマリとセカンダリに分岐されるので、プライマリの方で「加重ルール」を選択します。
![加重.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/98ba510b-1e39-50ed-a181-faf1170b3c91.png)
- 分散させるウェイトを入力した上で、加重70%の方の「新しいエンドポイント」を選択します。
![ウェイト.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/a2942782-8e2f-2dfd-f47a-4a1a23d08a62.png)
- 様々なエンドポイントを指定できますが、今回は「ELB Applicationロードバランサー」を選択します。
![ELB.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/bd0e5466-f690-4f10-f23f-acef070a846f.png)
- 既に作成済のALBを指定します。
![ELB選択.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/41cb8631-da8b-6c58-32b7-38dda02e7e1b.png)
- 同様の手順で加重30%の方のエンドポイントも指定します。
![30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/fad4d993-8682-7541-0e93-edd0dd285206.png)
- 続いて、フェールオーバールーティングのセカンダリの方のエンドポイントとして「S3ウェブサイトエンドポイント」を選択します。
![セカンダリ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/382f7bb7-90b8-02d0-d0d4-45c27200cd79.png)
- 「値」の欄で既に作成済のS3バケットを指定します。
![バケット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/1b1c21f7-7b5e-07d1-4ea3-fb75408d2d13.png)
- トラフィックフローの全体図を作成できましたので、右下の「トラフィックポリシーの作成」を押下します。
![フロー全体.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/50b6eabd-b923-1d28-eb41-ab02910db262.png)
- トラフィックポリシーがバージョン番号1として作成されましたので、続いて「ポリシーレコードの作成」を押下します。
![ポリシーレコード.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/f36b1133-9800-349d-d444-a0e16a39f697.png)
- 「ホストゾーン」にFreenomで取得したドメイン名を入力、またポリシーレコードDNS名を入力し、「ポリシーレコードの作成」を押下します。
![レコード作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/1a455599-e149-0223-0d93-1d258c415c0a.png)
- ポリシーレコードが作成されたことを確認します。
![ポリシーレコードDNS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/f69c3a79-fd4f-ad43-5b2f-7132d1d7e606.png)

以上により、ポリシーレコードDNS名「blog.aws-uni.ga」を用いたフェイルオーバールーティング、加重ルーティングの組み合わせをトラフィックフローによって設定することができました。

#ルーティング状況の確認

最後に、上記で設定したルーティング状況の確認をしてみます。

###加重ルーティング
ブラウザにて「blog.aws-uni.ga」で接続したところ、2つのVPCへトラフィックが分散され、EC2インスタンス内のWebページが表示されることを確認できました。
○加重70%の方のEC2インスタンスから返されたWebページ
![bluea.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/a4fcb003-1c44-176a-f24b-07360011651e.png)
![bluc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/5be2cd13-3ebb-19af-eb8d-4ea417583e5a.png)
○加重30%の方のEC2インスタンスから返されたWebページ
![greena.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/f8b4c4b0-8868-81c7-1f07-93ed6200a762.png)
![greenc.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/9080c21f-2547-e38e-2b2d-f76aecba00fb.png)

###フェイルオーバールーティング
「前提」で記載した構成図上のEC2インスタンス4台を全て停止し、擬似的な障害を発生させた上で、ブラウザにて「blog.aws-uni.ga」で接続したところ、S3バケットに格納したSorryページが表示されることを確認できました。
![sorry.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1067765/8e0d5106-b4e4-b17c-1bcb-af3c714a24ec.png)

#まとめ
以上より、Route53のトラフィックフローを使用して、フェイルオーバールーティングと加重ルーティングの組み合わせを体験してみました。ルーティングポリシーの連携を簡単なGUI操作で設定でき、かつ視覚的にも管理できるため、非常に便利でした。

また今回はトラフィックフローの概要、設定にフォーカスをあてた為、以下の点については妥協しておりますので、また別の記事としてまとめていけたらなと思います。

- フェイルオーバールーティングのプライマリから返されるWebページが静的であり、S3バケットに格納したSorryページと同等なものがレスポンスされている。<br>
⇨今後、オリジナルアプリを作成し、EC2インスタンスへのデプロイを試したいなと思っています。
- HTTPS通信での暗号化
- 加重ルーティングのBlue/Greenデプロイメントでの利用。 Elastic Beanstalk やCodePipeline 等を組み合わせたBlue/Greenデプロイメント環境の構築も面白そうです。


以上、最後まで読んで頂きありがとうございました！

※この記事はAWS初学者を導く体系的な動画学習サービス「AWS CloudTech」の課題カリキュラムで作成しました。