ネイキッドドメインとALIASレコード〜組合せではまったこと〜

BIND4の末期からBIND8・9と渡り歩いてきて、外部のDNSやレンタルサーバー（VPSも）を使う機会が少なかったのですが、ここ数年はクラウドサービスしか使わなくなりましたw。 
BIND9の感覚でいたら、レンタルサーバー(VPS)＋ネイキッドドメインの環境構築でがっつりはまったので、忘れないようにメモっておきます。
※WEBサイトの設定を前提としています、NSやMX・TXTなどの設定は省略しているのでご注意ください。

###はまった現象
レンタルサーバー（VPS）を契約して、ネイキッドドメインを独自ドメインとして設定しようとすると↓のようになってしまい、DNSサーバーを変更しないと独自ドメインが利用できない事象です。
　- `ALIASレコード`にxxx.hoge.comを登録してくださいと表示される
　- DNSサーバーに登録しようとすると`そのレコードは使用できませんorそもそも表示されない`ため、設定ができない

###問題が起きる環境
 - 利用するレンタルサーバー（VPS）のプラットフォームに**AWSを利用していること**（ロリポップとか、herokuとか）
 - DNSサーバーを提供している事業者とレンタルサーバー(VPS）が違うこと  
 （ex:よくぶち当たる例としては、DNSサーバーがお名前.comでサーバーがロリポップなど）

####<おさらい>DNSの基本的な動作
Q.ドメインって？
　それぞれの呼び方をおさらい。ここでは一般的なWEBサイトを想定しています。

|1|exlample.com|ドメイン|
|:-:|:-----|:-----|
|2|aaa.example.com|サブ**ドメイン**|
|3|example.com/bbb|example.comのサブ**ディレクトリ**|
|4|aaa.example.com/bbb|aaa.example.comのサブ**ディレクトリ**|

　1のドメインのことをネイキッドドメインと呼びます。ドメイン名の前に何もついていないですね。
　2は、代表的なものとしてはwww.example.comのように、ドメイン名の前にホスト名（www）がつくものですね。
　3と4は、DNS関係ないですねw。そのホストに作成したディレクトリのことです。

Q.DNSって？
　Domain Name System、略してDNSです。
　WEBサイトに限定していうと、1に記載したドメイン名あるいはサブドメイン名とホストを紐付けるサービスです。
　この紐付けを**名前解決**とも呼びます。
　[DNS & BIND 第5版]
(https://www.oreilly.co.jp/books/9784873113906/)が書籍としては有名です。自分で検証環境を構築できる方はやってみると楽しいと思います。
　→必ずその時の最新の版を選びましょう。

Q.名前解決の仕組みって？
　上位側の動作は[JPNIC](https://www.nic.ad.jp/ja/basics/beginners/dns.html)に詳しい解説が記載されているのでそちらを参考にしてください。
　ここでは、example.comの名前解決について見ていきます。
　　①あるクライアントがWEBサイト（http: //example.com）にアクセスするためにDNSサーバーへ問い合わせをします
　　②DNSサーバーは自分が持っているリストに一致しているものがあるか探します
　　　→ネイキッドドメインなので、頭に何もついていないレコードが対象です
　　③一致したものが見つかったので、アクセス先のIPアドレスを回答します
　　④クライアントはWEBサーバーにアクセスしてコンテンツを表示することができます
　　　　![3-standard.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669960/6bd3b8a8-10e4-6fa5-678f-37987c363f52.png)

　**ここで、DNSサーバーの設定はこのように設定されています**

|ホスト名|タイプ|値|
|:---:|:--------:|:--:|
|（空白）|A|10.0.0.1|
|aaa|A|10.0.0.2|

ネイキッドドメイン＝ドメイン名の前に何もついていないので、ホスト名は**空白**になります。
Aというタイプに設定する値は、**IPアドレス**です。
※DNSには`A`というタイプの他にもいろいろなタイプがあり、RFCという規定で国際的に定義されています。
　[JPNIC　RFC1034/1035日本語訳参照](https://jprs.co.jp/topics/2020/200515_2.html)


### <本題>ネイキッドドメインを独自ドメインとして利用する場合
前段で、DNSで使用するタイプはRFCで定義されていると書きましたが、AWSのRoute53は独自のタイプを持っていて
それが**```ALIAS```**レコードです。
これを非AWS系のDNSサーバーでは利用できないがために、最初に記載した現象が発生します。
※AWSで完結できる場合は、とっても便利なものですので、[AWSのサポート](https://docs.aws.amazon.com/ja_jp/Route53/latest/DeveloperGuide/resource-record-sets-choosing-alias-non-alias.html)を参考に使ってみてください！
  ----
通常、レンタルサーバーやVPSを契約すると、自動的にaaaaaaaaa.example.comのような任意の文字列のホスト名が割り当てられます。
そのホスト名を独自ドメインとして利用する場合、↓のように設定したいですよね。
　```hoge.com　→　aaaaaaaaa.example.com```
　この場合、*CNAME*レコード(canonical NAME)を使うと別のホストを転送先として設定できるのですが（↓）
　```xxxx　CNAME  aaaaaaaaa.example.com```

　***最上位ノード（=ネイキッドドメイン）には、CNAMEレコードを登録できない***というRFCのお約束があって設定することができません。
　 ```（空白） CNAME  aaaaaaaaa.example.com```　　←NG！

---
######サーバーあらかた構築しちゃったよ、どうしよう？？
対応策としては、3つ考えられます。1つずつ見ていきます。

- ALIASが利用できるDNSサーバーに変更する
- IPアドレスを調べて`A`レコードとして登録する
- サブドメインにする

　1. ALIASが利用できるDNSサーバーに変更する（おすすめ）
　　　一番簡単な解決方法です。この場合、変更先としてはサーバーと同じ事業者を選択することが望ましいです。
　　　AWSのセキュリティ上、別アカウントのリソースにはアクセスできないため、**AWSベースだから大丈夫とはなりません。**
　　　実際Route53にゾーン作ればいいじゃんとやってみましたが撃沈しました。。（そりゃそうだ）
 
　　　※DNSサーバーの変更は、既存の契約内容によっては他のサービス（メールなど）の解約を伴う場合がありますので、
      問題がないことを確認した上で進めてください。

　2.IPアドレスを調べて`A`レコードで設定する
　　ロリポップなどは、こちらが記載されていますね。
　　こちら問題が2つあって、あまりおすすめはできません。一時的な利用に留めて、その間に１の対策を講じた方が良さそうです。
　　- １ホストに対してIPアドレスが1つとは限らない
　　- そのIPアドレスは、何かのタイミングで変更される可能性がある
　　
　　ちなみに、IPアドレス調べてみるにはhostコマンドが便利です。
　　```$ host 調べたいホスト名（ex: aaa.example.com）```

　3.サブドメインにする
　　新規のドメインで対外的な告知をしておらず、URLが変更になっても支障がない場合は、変更を検討するのも良いと思います。
　　既に利用しているドメインの場合は、印刷物や各種リンクの変更が伴いますので事前の洗い出しが必要です。ご注意ください。

----
#####（メモ）AWS系と非AWS系
ホストのIPが52.xx、54.xx、18.xx始まりだったらだいたいAWS系