EC2にDNSサーバを構築してRoute53インバウンドエンドポイントへのフォワードを試す（PrivateLinkを使用する方法）

# 内容

下記オンプレミスからAWS上の名前解決の検証を行う記事の別パターンとなります。両方ともオンプレミスのDNS設定にDNSインバウンドエンドポイントへのフォワード設定を行い、Route53のプライベートホストゾーン内のレコードで名前解決を行います。下記記事との違いはPrivateLinkを使用して接続する点です。サービス提供側でEndpoint Service、サービス接続側でVPCエンドポイントを作成して接続します。Endpoint Service作成時にプライベートDNS名を有効化することで、PrivateLink接続時に、カスタムDNS名を使用する構成としています。

https://qiita.com/infra365/items/ec8150fb998eca9764c9

# 構成
このアーキテクチャのポイントは緑線箇所です。Account B側でEndpoint Serviceを作成時に「プライベートDNS名を有効化」します。Account A側でVPCエンドポイント作成時に「DNS名を有効化」することで、VPCエンドポイント作成VPCに内部的なRoute53のプライベートホストゾーンが作成されます。EC2サーバからの名前解決の流れは赤線の流れになります。ローカルのDNSサーバに問合せた後、xxx.co.jpドメインはDNSインバンドエンドポイントに転送⇒内部的に作成されたプライベートホストゾーンで名前解決を行います。その後、EC2内から黄色線の流れで、VPCエンドポイントに接続後、Endpoint Service⇒NLBの順番でアクセスします。

![vpce01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/25f8207c-1d64-49d3-ab03-676717c9de4f.png)


# 構築

まず、Acoount B側の準備を行います。VPCの設定や下記準備が出来ている前提でEndpoint Serviceを作成してきます。
* Route53でパブリックホストゾーンが作成済みである。
* Network Load Balancer（NLB）が作成済みである。

Endpoint Service作成の際、「プライベートDNS名をサービスに関連付ける」にチェック後、プライベートDNS名に「test.xxx.co.jp」を入力します。

![vpce02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/4b9f28c5-f5b3-4efe-a3fa-4d46278d5f2a.png)

Endpoint Serviceが作成されますが、「ドメインの検証ステータス」がPending verificationとなっているため、ドメイン名の検証を行います。

![vpce03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/5128b4e4-a5fb-4e67-9d79-36c54d2edb9c.png)

「アクション」から「プライベートDNS名のドメイン所有権を確認」を選択すると下記画面が表示されます。

![vpce04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/395e19a6-2538-4ad6-a23a-e9942a97fcc5.png)

Route53のコンソールに移動し、該当ドメインにTXTレコードを追加後、上記画面の「検証」をクリックします。

![vpce05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/9472648c-2e0d-4fcd-83a1-600697709b79.png)

しばらく待つと「ドメインの検証ステータス」がVerifiedに変更されます。

![vpce06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/5597d1d0-a1c1-4283-95e6-da9f312cdb99.png)

Endpoint Serviceの「プリンシパルを許可」タブに移動後、Accout A側からの接続を許可します。許可するIDにarn:aws:iam::Accoun AのAWSアカウントID:root」を指定します。これでAccout B側の準備は完了です。Endpoint Serviceのサービス名のメモしておきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/da24b873-401f-4573-9462-e908a3ea92e3.png)

Account A側でVPCエンドポイントを作成します。タイプは「PrivateLink Readyパートナーのサービス」を選択後、先ほどメモしたサービス名を入力後、サービスの検証をクリックします。

![vpce08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/cdf4da52-6ecc-44ba-8cd8-85dfcfacb66d.png)

また、作成の際、「DNS名を有効化」にチェックを入れます。

![vpce09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2523652/ebf18710-e12b-4501-89ad-d7f8b55d1517.png)

# 確認

ここからEC2にログインして名前解決が可能であるか確認していきます。なおEC2側のDNSサーバの設定は[こちらの記事](https://qiita.com/infra365/items/ec8150fb998eca9764c9)と同様です。

現在の状態では、test.xxx.co.jpに関する設定がないため、test.xxx.co.jpの名前解決を行うことは出来ません。


```shell
nslookup test.xxx.co.jp
;; communications error to 172.20.1.10#53: timed out
;; communications error to 172.20.1.10#53: timed out
;; Got SERVFAIL reply from 172.20.1.10
Server:         172.20.1.10
Address:        172.20.1.10#53
```

xxx.co.jpドメインへのリクエストをDNSインバウンドエンドポイントに転送する設定を行った後、bindの再起動を行います。

```shell
vim /etc/named.conf

zone "xxx.co.jp" IN {
    type forward;
    forward only;
    forwarders { 172.20.1.20; 172.20.1.30; };
};

systemctl restart named
```

これで有効にしたDNS名の名前解決することが出来ました。また、VPCエンドポイントのDNS名を使用しても同様のIPアドレスが返ってくることが確認出来ます。

```shell
nslookup test.xxx.co.jp
Server:         172.20.1.10
Address:        172.20.1.10#53

Non-authoritative answer:
Name:   test.xxx.co.jp
Address: 172.20.1.50


nslookup vpce-xxx.vpce-svc-xxx.ap-northeast-1.vpce.amazonaws.com
Server:         172.20.1.10
Address:        172.20.1.10#53

Non-authoritative answer:
Name:   vpce-xxx.vpce-svc-xxx.ap-northeast-1.vpce.amazonaws.com
Address: 172.20.1.50
```

また、AWS CLIを使用すると、内部的に作成されているホストゾーンの確認が出来ます。

```shell
aws route53 list-hosted-zones-by-vpc --vpc-id vpc-xxxxxxxxxxxxxxxxx --vpc-region ap-northeast-1
{
    "HostedZoneSummaries": [
        {
            "HostedZoneId": "XXXXXXXXXXXXXXXXXXX,
            "Name": "test.xxx.co.jp",
            "Owner": {
                "OwningService": "vpce.amazonaws.com"
            }
        },

    ],
    "MaxItems": "100"
```