AWSアソシエイト試験に向けて9(Route53について）

## 概要

AWSにおけるDNSサービス。
DNS(Domain Name System)とは名前解決のためのシステムで要はURLにおけるドメイン(www.sample.co.jpみたいなやつ)をIPアドレスとして機械が読み取れるように変換してくれるもの。
AWSではルーティングやリージョンやVPCに対してELB・フェイルオーバーのような使い方をしている印象を受けた。
DNSには権威DNSサーバー(名前解決機能がある)と一時期的にキャッシュとしてDNSを保持しておくためのキャッシュDNSサーバーがある。
Route53はAWSが提供する権威DNSサーバーでポート53で動作するのでRoute53と呼ばれているらしい。

## 特徴

- マネージド型サービス
- 主たる機能はドメイン登録/DNSルーティング/ヘルスチェックの3つ
- ポリシーでルーティングを設定する
- トラフィックルーティング/フェイルオーバー/トラフィックフロー等様々な条件でルーティングを設定できる
- AWS側で100％の可用性が保証されているSLA(Service Level Agreement)、なぜなら落ちたらルーティングが止まるから。

利用フローは以下の通り。

1. ドメインを登録
2. ドメイン名と同じホストゾーンと呼ばれるものが自動生成される
3. ホストゾーンにルーティング方法となるDNSレコードを作成する
4. トラフィックルーティングを設定する

## ホストゾーン

ドメインとサブドメインのトラフィックをルーティングする方法についての情報を保持するコンテナ。
タイプとしては以下の2パターンある。

### パブリックホストゾーン

- インターネット上に公開されたDNSドメインレコードを管理するコンテナ
- インターネットのDNSドメインに対するトラフィックのルーティング方法を定義する

### プライベートホストゾーン

- VPCに閉じたプライベートネットワーク内のDNSドメインのレコードを管理するコンテナ
- VPC内のDNSドメインに対してどのようにトラフィックをルーティングするかを定義する
- 1つのプライベートホストゾーンで複数VPCに対応できる
- VPCが相互アクセス可能であれば複数リージョンのVPCでも、同じホストゾーンを利用できる

## DNSレコード

ルーティング方法を設定するためにDNSレコードを作成し、各種レコードを設定する。
レコードの種類には以下の4つがある。
それ以外は[こちらを参照。](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/ResourceRecordTypes.html)

- SOA
→
ドメインのDNSサーバー/ドメイン管理者のメールアドレス/シリアル番号などを保持する。
保持した情報でゾーン転送時に情報が更新されているかどうか判断してくれる。

- A
→
ホスト名とIPアドレスの関連付けを定義するためのレコード。

- MX
→
メールの配送先(メールサーバー)のホスト名を定義するレコード。

- CNAME
→
正規ホスト名に対する別名を定義するレコード。
特定のホスト名を別のドメインに転送するときに利用する。
ドメインを他社から購入してAWSサービスのドメインとして使いたい場合はこちらのレコードを定義する。

### ALIASレコード

Route53固有の仮想リソースレコード。
特徴としては以下の通り。

- DNSクエリにAWSサービスのエンドポイントのIPアドレスを返答する
- 静的Webサイトとして設定されたS3バケット、CloudFront、ELB、ホストゾーン内のリソースレコードセットに対して設定できる
- DNSクエリに対するレスポンスが高速である
- CNAMEにマッピングできないZoneApex(ドメイン名そのもの)を設定可能
- ALIASレコードに対するクエリが無料であり、Route53と連携したDNSLookupを高速化する
- CloudFrontでのクエリ回数を削減する

## ルーティングパターン

主に以下の4つのルーティング方式を用いる。

- シンプルルーティング
→
レコードセットで事前に設定された値のみに基づいてDNSクエリに応答する。
性的なマッピングによりルーティングを決定。
要は一番普通のやつ、このドメインはこのIPアドレス(実際はそれが割当されているEC2インスタンス等)へ通してくださいってやるやつ。

- 加重ルーティング
→
複数エンドポイント毎に重み付けをしてそれに従ってDNSクエリを応答させる。
重み付けの高いエンドポイントに多くルーティングするようになる。

- フェイルオーバールーティング
→
Route53の大きな特徴の一つでもある。
RDSでのフェイルオーバーはAZ間だったが、こちらは例えば同じVPC構成を別リージョン等に作ってこちらを設定するとヘルスチェックの結果に基づいて、
プライマリなVPC構成があるリージョンからセカンダリなVPC構成へとフェイルオーバーしてくれる。
利用可能なリソースのみにルーティングされる。

- マルチバリュールーティング(複数値回答ルーティング)
→
ランダムに選ばれた最大8つの別々のレコードを使用してIPアドレスを設定することで、複数の値を返答する。
IPアドレス単位(つまりリソース及びそれが存在するリージョンごとに)でRoute53でヘルスチェックを作成し実行することで、正常なリソースの値を返す。
フェイルオーバーとは違い、設定したIPアドレスの分だけヘルスチェックが行われ通過したリソースのIPアドレスがすべて返ってくるので、
返ってきたIPアドレスのうち最も適切なところへルーティングすることでDNSを使用したアベイラビリティ及びロードバランシングを実現しているとも言える(ELBに似た役割)

またそれ以外に地理的な条件でルーティングする方法として以下の3つのルーティングが存在する。

- レイテンシールーティング
→
リージョンの遅延でDNSクエリをルーティングする、つまりリージョン間の遅延が少ない方へルーティングされる。
よって、基本的にはユーザーの最寄りのリージョンへとルーティングされる。

- 位置情報ルーティング
→
ユーザーのIPアドレスにより位置情報を特定して地域ごとに異なるレコードを返す。
ネットワーク構成に依拠しない、精度の高いレコードの区分けが可能。

- 地理的近接性ルーティング
→
ユーザーとリソースの場所に基づいて地理的近接性ルールを作成して、トラフィックをルーティングする。
例えばAWSリソースを使用している場合はリソースを作成したAWSリージョンに、AWS以外のリソースを使用している場合はリソースの緯度と経度に従ってルーティングされる。

必要に応じてバイアスを設定して特定のリソースにルーティングするトラフィックの量を変更できるが、トラフィックフローを利用する必要がある。

- トラフィックフロー
→
ルーティングパターンではないが、地理的近接性ルーティングを利用する際に設定しないといけないもの。
フロー図でルーティングのパターンを設定できる。

## ハンズオン

今回のハンズオンでは前述の通りドメインがないと話にならないのでどこかで用意しないといけない。
AWSで購入することもできるがいいお値段がするので、[Freenom](https://www.freenom.com/ja/index.html)のような様々な制約等があるが無料で利用できるドメインを使ってハンズオンすることになる。

なお今回はマルチAZ及びマルチリージョンでのフェイルオーバーをやるということが前提なので、リソースのコピーをやることになる。
EC2のコピーはAMIを作成してそれをリージョンを指定してコピーすることで、RDSはスナップショットを作成して同じようにリージョンを指定してコピーすることを復習として書いておく。
VPC等は改めて作る。

### ホストゾーン

例によってウィザードを使って設定していく。

![2021-06-05_01h32_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/78121f76-bbf0-d314-78d5-4c96378ea9b6.png)


ホストゾーンを作ると以下のように設定される。
Aレコードは自分で作成しないと出てこないがNS、SQAはホストゾーン作成と同時に作られる。
この2つを削除するにはこれ以外のレコードは削除しないといけない。
また、AWSから購入したドメインであるならばこれであとはルーティングに応じてレコードを作成すればいいのだが、それ以外のドメインの場合は先程作られたNSレコードのルーティング先にある値を購入したドメインサイト等の設定で当該ドメインと結びつける設定をしないといけない。

![2021-06-04_01h43_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/bec740f0-8495-bf17-6dec-de292e9df893.png)

### シンプルルーティング

ルーティングポリシーは以下のように選択できる。
![2021-06-04_01h43_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/fae1785c-1adb-d44f-1406-4ae7656670ec.png)
![2021-06-04_03h51_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/41c322cc-e624-3f74-b5a0-60682409fce2.png)
![2021-06-04_03h52_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/1beaae75-6d90-4813-5de6-5d412a142d1a.png)

あとはIPアドレスを設定すれば先程のようにAレコードができる。

### フェイルオーバールーティング

レコードタイプはA、ルーティング先をELBのエイリアスに設定するとリージョン及びそこに属するELBが選択できるので設定して、プライマリかセカンダリを選択する。
もちろんフェイルオーバー先の環境は用意しておく(今回はマルチAZかつマルチリージョンという要件だったので別リージョンへ作る)

![2021-06-04_03h31_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/175d8b82-022b-398d-62b4-dec9840147a0.png)

セカンダリも同じように設定。

![2021-06-04_03h30_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/a9d33e3d-903e-36fc-651b-a295582570b2.png)

試しにプライマリのApacheを停止してみる。

![2021-06-04_03h35_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/6029acec-d29f-8ce3-aba8-423c67f85c40.png)

するとindex.htmlが以下の通りだったのが

![2021-06-04_03h32_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/c604bc61-c2a6-a376-280d-ff57c482efd9.png)

こちらへとフェイルオーバーしているのが確認できる。

![2021-06-04_03h35_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/d8c3774b-2420-7b8f-1e23-ce74525666d9.png)

### 加重ルーティング

リソース毎にレコードをつける。
例えば2つのリソースへ重み付けを行う場合は2つのレコードを作成する。
以下のように設定して、2つ目も重量の項目だけ任意の数に設定する。
![2021-06-04_03h55_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/873aff02-e7ba-0e6e-6ece-4ac8d9d341c3.png)

すると以下のようになる。
![2021-06-04_03h56_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/2cbc4934-7819-88bb-ad8d-a5cffcf8bb55.png)

### レイテンシールーティング

例によってリソースのIPアドレスと今回はリージョンも設定する。
![2021-06-04_03h59_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/72ebd865-00df-a5e9-e7ad-6733ec0a9664.png)

複数ある場合は同じように設定する。
![2021-06-04_03h59_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/4e671b3e-6a1e-ab3a-9bdc-1a9fd3cec342.png)

設定すると以下の通りになる。
![2021-06-04_04h00_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/b5338367-6278-6d70-ffa3-adf7422b76eb.png)

### 位置情報ルーティング

リソースのIPアドレスの他に今度はリージョンではなく、地域を設定する。
例えば東京リージョンのリソースならアジアに、ロンドンリージョンなら欧州を選択するのが適切。
![2021-06-04_04h02_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/75824fee-a1e1-c9fb-da4a-a25e9a5ee4b9.png)
![2021-06-04_04h02_52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/aed98c07-b290-f6a5-8e30-cb5b554403db.png)

設定すると以下の通りになる。
![2021-06-04_04h03_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/4414cf0a-d8db-5094-5c6e-a0897f492ce7.png)

### マルチバリュールーティングとヘルスチェック

まずはリソースごとにヘルスチェックを作成する。
![2021-06-04_04h07_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/50089d5c-7b08-9f04-a49c-bca3593ffd74.png)

2つ作ると以下の通りになる。
ステータスでリソースの状態が確認できる(不明はリソースが存在しない状態、今回は試しに削除済みのリソースのIPアドレスで作っただけなのでこうなる)
![2021-06-04_04h08_07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/ed21d169-a802-cf63-79b6-e5c6f670e534.png)

あとはレコードを作る。
リソースごとにレコードを作るので2つなら2つレコードを作成する。
![2021-06-04_04h12_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/5d2f18ab-e24d-7b3f-17bc-c49d862aa099.png)

作成すると以下の通りとなる。
![2021-06-04_04h12_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/a467fddf-fb7f-b387-19b2-23541362fddf.png)