VPC内におけるDNSとDHCP、Route53リゾルバの整理

# そもそものところ、DNS VS DHCP？
### DNS（Domain Name System）
・名前解決:
人間が認識しやすいドメイン名（例：www.example.com）を、デバイスが理解できるIPアドレス（例：192.168.1.1）に変換する役割を担います。

・ドメイン情報の管理
DNSは、WebサイトやサービスがどのIPアドレスに紐づいているかを管理する「電話帳」のような役割を果たしています。

・サーバー間の連携
DNSサーバーは階層構造で世界中に分散され、各ドメインの管理を効率化しています。

### DHCP（Dynamic Host Configuration Protocol）
・IPアドレスの自動割り当て
ネットワークに接続するデバイスに対して、自動的にIPアドレスを割り当てる機能です。

・ネットワーク設定の自動化
DHCPはIPアドレスだけでなく、デフォルトゲートウェイやDNSサーバーのアドレスも自動的に設定します。

・一時的なアドレスの提供 
DHCPで割り当てられるIPアドレスはリース期間が設定されるため、期限が切れると再度アドレスを取得する必要があり、リソースを効率的に利用できます。

# VPC作成時に「DNS解決（DNS Resolution）」と「DNSホスト名（DNS Hostnames）」の設定を有効にすると、どうなる？

この設定↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3538617/3670050a-41f1-3440-cc64-b05d2f093567.png)

### DNS解決（DNS Resolution）
「DNS解決」を有効にすることで、VPC内のインスタンスがAmazon提供のDNSサービス（**AmazonProvidedDNS**）を利用して、ホスト名やサービスエンドポイント（例えば、S3やRDSなどのAWSサービス）に対して名前解決を行えるようになります。

Amazon提供のDNSサーバーは「169.254.169.253」という固定IPアドレスで利用され、これによって、プライベートエンドポイントや外部ドメインの名前解決が可能になります。

### DNSホスト名（DNS Hostnames）
「DNSホスト名」を有効にすると、VPC内のEC2インスタンスに対して自動的にホスト名が割り当てられます。

例：
```
プライベートDNSホスト名: 　ip-10-0-0-1.us-west-2.compute.internal
パブリックDNSホスト名:　 ec2-203-0-113-25.us-west-2.compute.amazonaws.com
```

これにより、インスタンス同士が内部のホスト名でアクセスでき、特にプライベートネットワーク内での通信に役立ちます。

### この設定は、DHCP機能の提供とは関係ない！！！
Amazon VPCでは、デフォルトでDHCP機能も提供されており、デバイスがネットワークに接続する際に自動的にIPアドレスやDNSサーバーなどのネットワーク設定を配布します。

ただし、DHCP設定は「DHCPオプションセット」という独立した設定で管理されています！！！

「DNS解決」や「DNSホスト名」を有効にしても、DHCPの機能や設定が変更されるわけではありません。

# 「DNS解決（DNS Resolution）」と「DNSホスト名（DNS Hostnames）」の無効にした場合はどうなるか？

### DNS解決（DNS Resolution）が無効の場合

Amazon提供のDNSによる名前解決ができなくなるため、インターネットやAWSの各種サービスのドメイン名（例：S3のエンドポイント）を使ったアクセスができません。

代わりに、アクセスにはIPアドレスを「**直接指定**」する必要があります。

VPC内のリソース間でのプライベートDNSも機能しないため、内部のホスト名（例：ip-10-0-0-1.region.compute.internal）でのアクセスが「**不可能**」です。

### DNSホスト名（DNS Hostnames）が無効の場合
インスタンスに自動でホスト名が割り当てられなくなります。

そのため、インスタンスの内部ホスト名での通信ができず、インスタンスごとに一意のホスト名を持たない状態になります。

AWSのプライベートIPアドレスを使用する他のリソースやサービスも、内部ホスト名でのアクセスができなくなります。

### 両方が無効の場合の影響
・AWSサービスに制限
**プライベートリンク**や**VPCエンドポイント**など、DNSを使って名前解決を行うサービスエンドポイントへのアクセスができません。

これにより、VPC内からAWSのプライベートサービスに接続するのが難しくなります。

・外部接続の困難
VPC内のインスタンスが外部インターネットに接続する場合、ホスト名を使ったアクセスが不可となり、IPアドレスベースでのみの接続となります。

・管理の複雑化
DNS解決が無効だと、ホスト名が使用できないため、複数のインスタンス間の接続設定が複雑化します。

すべての通信にIPアドレスを「**手動**」で設定する必要が生じ、管理が面倒になることがあります。

# VPC内にAmazonProvidedDNSを使えば、すべて名前解決ができるか？
AmazonProvidedDNS（AWSが提供するデフォルトのDNSサーバー）は、VPC内外の一部のリソースについて名前解決が可能ですが、すべてのケースに対応しているわけではありません。

### VPC内部の名前解決　→OK
AmazonProvidedDNSは、同じVPC内のインスタンスやリソースに対するプライベートIPアドレスを名前解決します。

例えば、ip-10-0-0-1.us-west-2.compute.internal のような内部ホスト名が解決可能です。

### AWSサービス（S3など）の名前解決　→OK

・パブリックエンドポイント
AmazonProvidedDNSは、S3やDynamoDBなど、AWSのパブリックエンドポイントに対して名前解決を行います。

パブリックエンドポイントであれば、通常のパブリックDNS名でアクセスできます。

・プライベートエンドポイント
VPCエンドポイント（PrivateLinkを経由したS3や他のAWSサービスへのプライベートアクセス）が設定されている場合、AmazonProvidedDNSでプライベートDNS名が解決可能です。

このため、VPC内からS3などのサービスにプライベート接続を利用してアクセスする場合にも対応します。

### AWS外部のインターネット上のリソース　→OK
AmazonProvidedDNSはインターネット上の一般的なドメイン（例：example.com）の名前解決もサポートします。

インスタンスにパブリックIPアドレスが付与されており、インターネットゲートウェイまたはNATゲートウェイ経由でインターネットに接続できる場合、AmazonProvidedDNSでインターネット上のドメインの名前解決もできます。

### オンプレミス環境やカスタムDNS名　→NG
AmazonProvidedDNSは、AWS外部のカスタムドメインやオンプレミスの独自ドメインには対応していません。

そのため、これらの名前解決には「**Route 53リゾルバ**」のアウトバウンドエンドポイントやカスタムDNSサーバーを使用する必要があります。

# 代わりに「Microsoft Active Directory Domain Controllers」とか外部DNSサーバーをVPC内に使う場合、どうなるか？

### VPC内部の名前解決 →△
AD DNSは、Active Directory内の名前解決を行うので、同じドメイン内やADに登録されているリソースに対する名前解決は可能です。

しかし、EC2インスタンス間の名前解決など、VPC内のホスト名解決も可能ですが、手動でAD DNSにインスタンス情報を登録するか、必要に応じてドメイン参加が求められます。

VPCエンドポイントやその他のAWSのプライベートサービスエンドポイント（例：S3やDynamoDBのプライベートリンク）の名前解決には、追加設定が必要です。

### AWSサービス（S3など）の名前解決 →NG
AD DNSは通常、AWSが提供するプライベートエンドポイントの名前解決をサポートしていません。

AWSサービスのプライベートDNS名が解決できない場合があります。

「**Route 53リゾルバ**」の「アウトバウンドエンドポイント」を利用するか、AD DNSサーバーにフォワーダー（転送設定）を追加し、AmazonProvidedDNSやRoute 53のアウトバウンドエンドポイントを経由させる設定が一般的です。

これにより、AWSサービスのプライベートエンドポイントにもアクセスできるようになります。

### AWS外部のインターネット上の名前解決 →△
AD DNSに転送設定（DNSフォワーダー）を追加することで、インターネット上のドメイン名（例：example.com）も名前解決できます。

「VPCのセキュリティ設定」や「NATゲートウェイ/インターネットゲートウェイ」の設定に依存します。

フォワーダーを経由して、インターネットの名前解決を行うには、AD DNSのフォワーダー先にISPのDNSサーバーなどを指定する必要があります。

### オンプレミス環境やカスタムDNS名 →△
VPN接続またはAWS Direct Connectを使用し、AD DNSに転送設定を追加してオンプレミスのDNSサーバーに対するクエリを転送させる、などの設定が必要です。

# だから、Route53リゾルバが助けにきた！！！
AmazonProvidedDNSだけで解決できないとき、AD DNSと併用したいとき、上記のようにいろいろ名前解決の制限があります。。。

Route 53 リゾルバは、AmazonのDNSサービスであるRoute 53の一部で、Amazon VPC内のリソースが外部のDNSサーバー（オンプレミスのDNSやActive Directory Domain Controllersなど）やインターネット上のドメインに対して名前解決を行うのをサポートする、双方向のDNS解決機能を提供します！

### インバウンドDNSリゾルバ

オンプレミスからVPCへの名前解決を行う場合に使用されます。

たとえば、オンプレミス環境からAWSのリソース（S3のプライベートエンドポイントやEC2インスタンスなど）にアクセスするときに、Route 53リゾルバがインバウンドのDNSリクエストを処理して、AWS内のリソース名を解決します。

### アウトバウンドDNSリゾルバ

VPCから外部DNSサーバーへの名前解決を行う場合に使用されます。

AWS VPC内のリソース（例：EC2インスタンス）が、VPC外のオンプレミスのActive Directoryや、カスタムDNSサーバーにクエリを投げて名前解決を行いたい場合に使います。

これは、AWSが提供するデフォルトのDNSサーバーでは名前解決できないドメインに対して有効です。

### エンドポイントの設定

特定のVPCサブネット内にエンドポイントを作成することで、VPC内外からの名前解決の方向性を指定できます。

例えば、オンプレミス環境からAWS内リソースへのインバウンド用、AWSからオンプレミスDNSサーバーへのアウトバウンド用のエンドポイントを設定できます。

### 名前解決のルール
クエリがどのDNSサーバーに向かうべきかを制御するルールを作成できます。

例えば、*.example.com というルールを作成し、これを特定のDNSサーバー（オンプレミスやActive Directory）に送信するよう指定することで、柔軟な名前解決が可能になります。

# 参考サイト
https://zenn.dev/fdnsy/articles/1b4933f719f98f