[AWS]ドメインの登録

# Webページが表示される仕組み
私たちが利用するインターネット上には様々なサーバーが接続されており、そのサーバーそれぞれを識別するのに、数字の羅列で表現されるIPアドレスが存在し、それを人が識別するのは少々難しいところがあります。しかし、このIPアドレスをよりわかりやすくするために数字以外の文字などを利用して、人が理解しやすい表現に置き換えるドメインというものがあります。例えば私たちがよく利用する"google.com"のようなものがドメインです。

ドメイン名からIPアドレスを決定する仕組みをDNSと呼びます。DNSサーバーがあるおかげで、私たちはIPアドレスを意識しなくとも、目的のサーバーにリクエストを行うことができます。

まずは、DNSサーバーからWebページが閲覧できる仕組みを見ていきます。

![AWS_DNS.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/e050bca1-0534-e7cb-1178-930165e8ff42.png)

①まずクライアントがブラウザからURLを入力したものの内、ドメイン名を抽出してドメインのIPアドレスをDNSサーバーに問合せを行います。

②DNSサーバーが管理するドメインのドメイン名が存在していれば、保存されているIPアドレスをクライアントに返します。また、送信したDNSサーバー上に対象のドメインが存在してなければ、また別のDNSサーバーに問い合わせを行い続けます。

③判明したIPアドレスを元に、対象のWebサーバーにコンテンツをクライアントに返すようにリクエストを行います。さらにURLにある"XXX/index.html"といったパスからどのページを表示するのかといった問い合わせも行います。

④要求を受けたWebサーバーは、対象のページをクライアントに返します。特に、画像や動画といったWebページを表示するために必要なデータが存在する場合は、クライアントがさらにWebサーバーに必要なデータを要求し続けます。

# ドメインの取得
まずは、VPC内にDNSサーバーを設置して外部に公開するDNSと外部に公開しないDNSを作成していきます。そのためにもまずはDNSサーバーを用意する必要があります。AWSにはRoute53といったDNSサーバーの機能を提供しているマネージドサービスが存在しているため、これを使っていきます。

外部に公開するDNSとして、クライアントからのリクエストに対して、Route５３からクライアントにIPアドレスを返すDNSと、外部に公開しないDNSとしてデータベースサーバーに問い合わせを行うために、WebサーバーからのリクエストからRoute53がDBのIPアドレスを返すDNSを作成していきます。

# ドメインの購入方法
まず、AWSコンソール画面よりRoute53=>登録済みドメイン=>ドメインの登録をクリックします。

そこで自分の好きなドメインを登録します。入力したらチェックして、指定したドメイン名が取得可能かをチェックします。重複がなければそのドメインを登録できます。

次に、お問合せ画面から名前や住所を登録し、購入していきます。ドメイン購入が完了すると、保留中のリクエストに先ほど購入したドメインが登録されています。少し時間がかかりますが、登録済みドメインに移行しているのを確認できれば、購入手続きが完了します。

# DNSにリソース情報を追加する

![DNS4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/8ea65f99-961a-bd5d-68fb-6a2d7efdbcdf.png)


## 外部向けDNSの作成

まずは、踏み台サーバーのドメイン登録をしていきます。コンソール画面にて、Route53=>ホストゾーン=>購入したドメイン=>詳細=>レコードの作成　をクリックします。

次に、ルーティングポリシーをシンプルルーティングを選択し、シンプルなレコードを定義するをクリックします。以下の設定で構築していきます。

|レコード名|レコードタイプ|値|ルーティング先|
|:---:|:---:|:---:|:---:|
|bastion|A|レコードタイプに応じたIPまたは値|踏み台サーバーのパブリックIPアドレス|

![レコード作成.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/6b8a3829-4719-2e33-e7a0-6bd177b01909.png)

![レコード作成②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/e1a8e691-6d6e-6a0a-3cf9-b9969e1016b5.png)

次に、ロードバランサーのドメインを登録をしていきます。同様の手順で作成します。

| レコード名 | レコードタイプ | 値 | リージョン | ロードバランサー |
|:--:|:--:|:--:|:--:|:--:|
| www | A | レコードタイプに応じたIPまたは値 | 　LBのあるリージョン | 作成したLB |

![レコード作成③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/0d149773-cc52-d0c8-27b9-a6342aeb3cfd.png)

![レコード作成④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/454f9214-d2b7-19dc-43d4-5992c2344489.png)

###  動作確認

先ほど作成したドメイン名が、正しいIPアドレスに変換されているの確認していきます。踏み台サーバーとロードバランサーが変更されているのか確認していきます。
```
$ nslookup bastion.<ドメイン名>

$ nslookup www.<ドメイン名>
```


## 内部向けDNSの作成
Route53=>ホストゾーンの作成 をクリックします。
| ドメイン名 | 説明 | タイプ　|
|:--:|:--:|:--:|
| home | 任意の説明 | プライベートゾーン |


![内部DNS home.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/5d022bd2-4211-59ec-7e4b-9d931964ad88.png)


| リージョン | VPC |
|:--:|:--:|
|東京リージョン(1a)| 作成したVPC |

リージョンとVPCを選択して、ホストゾーンの作成をクリックします。

次に、踏み台サーバーと2つのWebサーバーのEC2を利用するために、3つの情報をホストゾーンに追加していきます。まずは、踏み台サーバー(bastion)から作成していきます。

homeのホストゾーン=>レコード作成=>シンプルルーティング=>シンプルなレコードを定義

| レコード名 | レコードタイプ　|　値/ルーティング先 |　入力欄 |
|:--:|:--:|:--:|:--:|
| bastion | A | レコードタイプに応じたIPまたは値 |　プライベートIP　|

![home.bastion.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/6a69f2ca-59c2-db20-aa60-4856e575a939.png)

2つのwebサーバーも同様に以下のような設定で作成指定いきます。

| レコード名 | レコードタイプ　|　値/ルーティング先 |　入力欄 |
|:--:|:--:|:--:|:--:|
| web02 | A | レコードタイプに応じたIPまたは値 |　プライベートIP　|

![home.web02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/790379/74f5070a-dfc6-9693-4760-2275dbdd6931.png)

## RDS情報リソースの追加
RDSも内部向けDNSに追加していきます。RDSはIPアドレスを持っていませんが、代わりにエンドポイントが用意されているため、これを登録していきます。

作成したデータベースの画面を開いて、「接続とセキュリティ」からエンドポイントを確認できます。以下の設定でhomeのホストゾーンに定義していきます。

| レコード名 |　レコードタイプ　|　値/ルーティング先　| 入力欄 |
|:--:|:--:|:--:|:--:|
| db | CNAME | レコードタイプに応じたIPまたは値 | エンドポイント |

### 動作確認
まずは踏み台サーバーに接続します。

```
$ ssh bastion
```
次にwebサーバーとデータベースが、IPアドレスとエンドポイントに変換されていることを確認していきます。
```
$ nslookup web01.home

$ nslookup db.home
```
最後にSSHのconfigファイル内の設定で、IPアドレスを登録したドメイン名に変更します。

```~/.ssh/config
Host bastion 
    Hostname bastion.<ドメイン名> ---------------- <変更箇所>
    User ec2-user 
    IdentityFile ~/.ssh/AWS_key.pem 

Host web01
    Hostname web01.home ------------------------ <変更箇所>
    User ec2-user
    IdentityFile ~/.ssh/AWS_key.pem
    ProxyCommand ssh bastion -W %h:%p 

Host web02
    Hostname web02.home ------------------------- <変更箇所>
    User ec2-user
    IdentityFile ~/.ssh/AWS_key.pem
    ProxyCommand ssh bastion -W %h:%p
```

# "server can't find nxdomain"エラー

外部向けDNS作成において、動作確認を行ったところ、タイトルのようなエラーが出ました。このエラーメッセージより、DNSサーバーがホスト名を解決できないことが原因だと考えました。エラー解決に向けてやったことは、２つで以下の記事を参考にしました。

https://qiita.com/N396184501/items/f5e5e2c296b9f7befdf8

https://qiita.com/fumiya-konno/items/f94ed3e3c114793c898a

①AWSにて、ドメインを購入した後に自分宛にメールがいくつか届きますが、その中に"以下のリンクをクリックしてメールを確認してください"といった内容のメールがあるので、リンクをクリックし認証をしましたが、今回のエラー解決にはつながりませんでした。

②次にVPCの設定を見直しました。VPC内の詳細を見てみると、"DNSホスト名"と"DNS解決"が両方有効になっている必要がありますが、"DNS解決"が無効になっていたため編集から有効にしました。約5分から10分ぐらいで有効が反映され、nslookupコマンドでWebとDBのドメイン名の解決ができることを確認できました。

# 参考
AWSではじめるインフラ構築入門 翔泳社出版


https://daeuwordpress.com/homepage-system/