【AWS】Terraformでアクセスを分散、WebサーバーをHTTPS化する その2(Route53)

## 概要
TerraformでAWSサービスを使用して、

- 負荷分散
- 独自ドメインの設定
- SSL証明書を作成してHTTPS化

上記の3つを含めた構成を作成する手順をまとめました。

## 目次
本記事は「2. Route53でDNS設定」について記述。
「1. ALBの作成」まではこちら → [【AWS】Terraformでアクセスを分散、WebサーバーをHTTPS化する その1(ALB) ](https://qiita.com/ramunauna/items/250d1dfc16468c5b8522)

1. アプリケーションロードバランサー(ALB)の作成
  - ALBの作成
  - ターゲットグループの作成 / ターゲットの登録
  - リスナーを設定
  - ALBのDNS名からHTTPアクセス確認
1. Route53でDNS設定 __←本記事はここから__
  - ドメインの取得（例はfreenomの無料ドメイン）
  - ホストゾーンの作成
  - DNSレコードの定義
  - ネームサーバーの設定を加える
  - 取得したドメインへHTTPアクセス確認　__←ここまで__
1. AWS Certificate Manager(ACM)でSSL証明書の作成
  - SSL証明書の作成
  - SSL証明書の検証
  - HTTPSリスナーの定義
  - HTTPSアクセス確認

## 構成図
目標構成図はこちら。
![ALB_Route53_ACM.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1813991/ac0da77b-d9fa-f1cc-5fd0-63f304929274.png)


## 2. Route53でDNS設定
### ドメインの取得
まずはドメインを取得。
今回は勉強用ということで、freenomというドメインプロバイダを使って、無料の独自ドメインを一時的に登録する。
freenom (https://www.freenom.com/ja/index.html) にアクセスし、アカウントを作成orサインイン。
ヘッダーの「Services」タブでメニューを開き、「Register a New Domain」を選択。

取得したいドメイン名をインプットフィールドに入力し、「Check Availability」をクリック。
ドメイン名が利用可能であればチェックアウトをする。
![スクリーンショット 2021-08-21 22.33.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1813991/3e90ce9a-e971-3247-aebe-cb374056f121.png)
![スクリーンショット 2021-08-21 22.34.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1813991/fbbc370c-b15d-9245-df4c-a35cafeeb17f.png)
その後、利用期間や料金などを確認して、ドメインを取得。（今回は一時的な取得のため、無料かつ期間も適当。）
![スクリーンショット 2021-08-21 22.36.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1813991/8ae69c20-857c-8cf3-6785-893ef3508cb4.png)


### ホストゾーンの作成
同ディレクトリにroute53.tfを作成。
取得したドメインをホストゾーンとしてRoute53の設定を記述していく。

```terraform:route53.tf
# 新規のホストゾーンを作成
resource "aws_route53_zone" "hostzone" {
  name = # 取得したドメイン
}
```
ホストゾーンでは、ドメインのトラフィックをルーティングする情報(DNSレコード）を束ねて保持している。

### DNSレコードの定義
続いてDNSレコードを定義する。

```terraform:route53.tf
# DNSレコード
resource "aws_route53_record" "dns_record" {
  zone_id = aws_route53_zone.hostzone.zone_id
  name    = aws_route53_zone.hostzone.name
  type    = "A" # Aレコード

  alias {
    name                   = aws_lb.alb.dns_name
    zone_id                = aws_lb.alb.zone_id
    evaluate_target_health = true
  }
} 
```

- `alias`  
AWS独自拡張のレコードであるaliasレコードを定義。ALBのDNS名とゾーンIDを指定することで、ALBのIPアドレスへ名前解決をしている。

__aliasレコード__
DNS名を持つAWSリソースに対して直接ドメインを登録することができ、CNAMEレコードと比較して名前解決のパフォーマンスが良い。

- 名前解決の流れの比較例  
  - CNAMEレコード： `ドメイン名 → xxxxxxxxxx.ap-northeast-1.elb.amazon.aws.com → IPアドレス`  
  - aliasレコード: `ドメイン名 → IPアドレス`

要するにDNSクエリが1回で済み、名前解決までのステップが少ないため、パフォーマンスが良い。
IPアドレスのAレコードを直接定義すれば良いとも考えられるが...
IPアドレスが動的に変化する可能性のあるAWSリソースには最適な方法ではないため、aliasレコードが使われる。

ここまで`terraform apply`を実行し、マネジメントコンソールで確認。

### ネームサーバーの設定を加える
これだけではまだドメインにアクセスできないため、下記の手順でネームサーバーの設定を加える。

1. freenomのMy Domainページにて、「Manage Domain」をクリック。
1. 「Management Tools」タブの「Nameservers」を選択する。
1. ラジオボタンで「Use custom name servers (enter below)」を選択し、マネジメントコンソールのDNSレコードのNSタイプの値をそれぞれ設定する。  
1. 「Change Nameservers」で設定を保存する。（反映に数分かかる。）

![スクリーンショット 2021-08-22 0.01.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1813991/6f54d59a-92bd-751b-8c26-bb07a06a8fe9.png)
![スクリーンショット 2021-08-22 0.10.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1813991/eef79b5c-4596-12e2-e3db-ba43df044a9d.png)

### 取得したドメインへHTTPアクセス確認
Nameservers設定の反映を数分待ち...取得したドメイン名にHTTPアクセスしてみる。
ALBからの分散先ページが問題なく表示されたら、Route53でのDNS設定は成功！

## 終わりに
今回はRoute53でのDNS設定をまとめました。
次の記事で今回設定したドメインのSSL証明書を取得して、HTTPSアクセスができるようにします。