【初心者】Amazon Route 53 Resolver インバウンド/アウトバウンドエンドポイント を使ってみる

# 1. はじめに
- AWSのネットワーク関連の復習をしている。AWSと外部(オンプレミスなど)を接続した際のお互いの名前解決の方法について確認したかったため、実機での設定を行い基本的な仕組みを理解する。

# 2. やったこと
- AWS VPCとGCP VPCネットワークがVPNで接続されている環境を用いる。(環境の構築記事： [【初心者】AWS Site-to-Site VPN を使ってみる (GCPとのVPN接続)](https://qiita.com/mksamba/items/f6f2896a9456dd68bed8))
- GCP内のインスタンスから、Route 53 Resolver(インバウンドエンドポイント)を用いて、AWS側VPC内の名前解決を行う。
- AWS内のインスタンスから、Route 53 Resolver(アウトバウンドエンドポイント)を用いて、GCP側VPCネットワーク内の名前解決を行う。

# 3. Route 53 Resolver インバウンド/アウトバウンドエンドポイントとは(自分の理解)
- そもそも Route 53 Resolver とは、VPCを作成すると必ず付属するリゾルバ機能で、x.x.x.2とかのIPアドレス指定で、インスタンスで自動的に使えるように設定されているもの。
- Route 53 Resolver(インバウンドエンドポイント)は、AWS VPCの外部(ダイレクトコネクトやVPNで接続されているオンプレミスやGCPなど)から、VPC内のRoute 53 Resolverを使用して、VPC内の名前解決を可能にするためのエンドポイント。
- Route 53 Resolver(アウトバウンドエンドポイント)は、AWS VPCの内部から、Route 53 Resolverを経由して、インターネット以外の外部(オンプレミスやGCPなど)の名前解決を可能にするためのエンドポイント。

# 4. 構成図(自分の理解)

![r53構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/30e6a3cf-2648-9e2b-6e75-08a19d92476d.png)


# 5. 手順

## 5.1 事前準備
### サブネットの追加
- 以前の検証で構築した、AWSとGCPがVPN接続されている環境を用いる。（環境の構築記事： [【初心者】AWS Site-to-Site VPN を使ってみる (GCPとのVPN接続)](https://qiita.com/mksamba/items/f6f2896a9456dd68bed8))
- 上記の環境ではAWS側のパブリックサブネットが10.0.0.0/24の1個しかなかったが、Route 53 Resolverのインバウンド/アウトバウンドエンドポイントを作成する際、2つのAZが必要になるため、パブリックサブネット 10.0.1.0/24 を別AZで追加する。

### プライベートホストゾーンの作成
- Route 53 Resolverの検証上は必須ではないが、利用イメージをわかりやすくするため、プライベートホストゾーン(mksamba-aws.local)を作成し、VPCに紐づける。 


![r53-01a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/4e83607d-59b1-e4db-f13f-e2f4c7667bff.png)

![r53-02a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/476b6824-aad9-0143-a132-92740a4175a7.png)


- instance.mksamba-aws.local のIPアドレス(10.0.0.27)をAレコードで登録する。

![r53-03a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/e0153a90-0f2c-ee71-db7e-7f331daef70d.png)

- AWS VPC内のインスタンスにて、instance.mksamba-aws.local が名前解決できることを確認する。

```
[ec2-user@ip-10-0-0-27 ~]$ nslookup instance.mksamba-aws.local
Server:         10.0.0.2
Address:        10.0.0.2#53

Non-authoritative answer:
Name:   instance.mksamba-aws.local
Address: 10.0.0.27
```

## 5.2 インバウンドエンドポイント

### インバウンドエンドポイントの作成

- VPC内の2つのサブネット(別々のAZに存在)を指定して、インバウンドエンドポイントを作成する。

![r53-04a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/6909dc86-0e6c-1ad4-f655-707447b012c6.png)
![r53-05a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/a258ab1c-f254-7ba4-4935-0dc05f7fafe6.png)
![r53-06a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/1884b878-d5bc-565a-3865-4535c88c816a.png)

- 10.0.0.43, 10.0.1.173 がインバウンドエンドポイントとして作成される。

![r53-07a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/cfa6d1b3-4b6c-0d49-7956-16948ba03a0c.png)

### インバウンドエンドポイントを利用した外部からの名前解決

- VPN接続されたGCP内のインスタンスから、インバウンドエンドポイントを利用してAWS側VPC内の名前解決を行う。
- GCP内のインスタンスにて、インバウンドエンドポイント(10.0.0.43)をDNSサーバとして指定して、instance.mksamba-aws.localの名前解決ができることを確認する。

```
[mksamba_gcp@instance3 ~]$ ping 10.0.0.43
PING 10.0.0.43 (10.0.0.43) 56(84) bytes of data.
64 bytes from 10.0.0.43: icmp_seq=1 ttl=253 time=9.09 ms
64 bytes from 10.0.0.43: icmp_seq=2 ttl=253 time=7.47 ms
^C
[mksamba_gcp@instance3 ~]$ nslookup instance.mksamba-aws.local
Server:         169.254.169.254
Address:        169.254.169.254#53

** server can't find instance.mksamba-aws.local: NXDOMAIN

[mksamba_gcp@instance3 ~]$ nslookup instance.mksamba-aws.local 10.0.0.43
Server:         10.0.0.43
Address:        10.0.0.43#53

Non-authoritative answer:
Name:   instance.mksamba-aws.local
Address: 10.0.0.27
```

## 5.3 アウトバウンドエンドポイント

### 事前準備
- GCP内インスタンスにDNSサーバ(bind)を構築し、instance.mksamba-gcp.local のIPアドレス(10.1.0.3)をAレコードとして登録する。手順は省略するが、以下のようなサイトを参照。
    - [【Linux】BINDでDNSサーバを構築しよう](https://uepon-blog.com/linux-bind/)
    - [BINDによるDNSサーバの構築](https://tex2e.github.io/blog/linux/bind-dns-server)

- GCP内インスタンス(bindを立てたインスタンス)で、自分自身(10.1.0.3)をDNSサーバとして指定して、instance.mksamba-gcp.local の名前解決が可能なことを確認する。

```
[mksamba_gcp@instance3 etc]$ nslookup instance.mksamba-gcp.local 10.1.0.3
Server:         10.1.0.3
Address:        10.1.0.3#53

Name:   instance.mksamba-gcp.local
Address: 10.1.0.3
```

- AWS内インスタンスからも、DNSサーバとして10.1.0.3を直接指定すれば、instance.mksamba-gcp.localの名前解決が可能なことを確認する。


```
[ec2-user@ip-10-0-0-27 ~]$ nslookup instance.mksamba-gcp.local 10.1.0.3
Server:         10.1.0.3
Address:        10.1.0.3#53

Name:   instance.mksamba-gcp.local
Address: 10.1.0.3
```

### アウトバウンドエンドポイントの作成

- VPC内の2つのサブネット(別々のAZに存在)を指定して、アウトバウンドエンドポイントを作成する。

![r53-08a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/6b083de7-8bf0-9164-917d-b5614eecdeeb.png)

![r53-09a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/65b8621e-a6d6-0c5a-bdf5-9e562745481f.png)
![r53-10a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/bb0dcec7-2eab-d1f5-181f-08e72651264f.png)

- DNSのクエリが「mksamba-gcp.local」ドメインだった場合、GCP側のDNSサーバ(10.1.0.3)にフォワードするようにルールを設定する。

![r53-11a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/e262dd10-7b86-edc3-c38a-656bf832afaa.png)

![r53-12a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/4f78e852-4e70-d7bf-bb7e-d363db89237e.png)

- 10.0.0.241、10.0.1.41がアウトバウンドエンドポイントとして作成される。

![r53-13a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189302/581f1707-7d33-ea5c-1a34-09993b3f00c8.png)

### アウトバウンドエンドポイントを利用した外部ドメインの名前解決
- AWS内インスタンスから、VPC付属のRoute 53 Resolver (10.0.0.2)を使用して、GCP側のドメインであるinstance.mksamba-gcp.localが名前解決できることを確認する。

```
[ec2-user@ip-10-0-0-27 ~]$ nslookup instance.mksamba-gcp.local 10.0.0.2
Server:         10.0.0.2
Address:        10.0.0.2#53

Non-authoritative answer:
Name:   instance.mksamba-gcp.local
Address: 10.1.0.3
```
- アウトバウンドエンドポイントは、インバウンドエンドポイントと違って、アウトバウンドエンドポイントのIPアドレスを指定してもDNSクエリに応答してくれるわけではない。

# 6. 所感
- 検証環境を作るために、久しぶりにbindの設定をしたりして、DNSに関する全体的な復習になった。