AWS上のWebサービスにPrivate Link経由でアクセスする際の名前解決について

## はじめに
AWS上に構築されているBtoB向けのWebサービスに、お客様オンプレミス環境からアクセスする際の名前解決についてまとめてみたいと思います。

インターネット接続して利用するのであれば、企業からgoogleなどのインターネットサイトに接続する際と同様に、公開DNSを参照して名前解決すればよいのですが、セキュリティ要件によりインターネット接続がNGである場合、Private Linkによるインターナルな通信でWebサービスに接続して利用する場合があります。

このような場合に、お客様側でどのように名前解決すればよいか整理してみたいと思います。

## VPCエンドポイント、Private Linkとは
VPCエンドポイントは、S3やAthena、KMSといったVPC内には存在しないAWSサービスや、別VPC(別AWSアカウント内のVPCも含む)内で提供されているサービスに、Internet Gateway、NAT Gatewayを利用せず、直接プライベートな(AWS内のネットワーク)接続でアクセスするための仮想インターフェースです。

また、上記でプライベートな接続をしている部分の事をPrivate Linkと呼んでいます。

:::note info
Private Linkは、AWSのサービス名ではなく、AWS内のプライベートなネットワーク接続の事を指す名称です。
:::

VPCエンドポイントからAWSサービスに接続する際は直接AWSサービスを指定する事でプライベート接続ができるようになりますが、他VPC内で提供されているサービスにプライベート接続するには、サービス提供側のVPCにVPCエンドポイントサービス(サービス提供側の受け口)を事前に作成しておく必要があります。

エンドポイントサービスからは、Network Load Balancer(NLB)⇒Application Load Balancer(ALB)などに通信を受け渡すようにしておき、VPCエンドポイントからVPCエンドポイントサービスに対して接続するよう設定する事で、プライベート接続により別VPCの提供サービスに接続できるようになります。

(参考)AWSサービスにプライベート接続する為のVPCエンドポイントを作成する際の画面
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2554521/550c8a1d-21e3-f8f9-bf58-6148cce75afa.png)

:::note info
別VPCのサービスにプライベート接続したい場合は、サービスカテゴリで「その他のエンドポイントサービス」を選択し、あらかじめサービス提供側のVPCで作成された、VPCエンドポイントサービスのサービス名(例 com.amazonaws.vpce.ap-northeast-1.vpce-svc-xxxxxxxxxxxxxxxxx)を指定します。
:::

VPCエンドポイントを自身のVPC内のサブネットに作成すると、エンドポイントに対してプライベートIPアドレスが割り当てられます(自動、固定IPどちらも指定可)。

https://dev.classmethod.jp/articles/defined-ip-vpc-endpoints/

VPCエンドポイントを利用しない場合、VPC内のEC2インスタンスなどから、NAT Gateway ⇒ Internet Gatewayを経由して、S3などのAWSサービスや他VPCで提供されているサービスに接続する必要がありますが、VPCエンドポイントを利用する事で、AWSサービスなどが、自身のVPC内にあるかのように扱う事ができます。

※適切な説明ではないかもしれませんが、VPC内に別サービスへの安全なショートカット(入口)が作成されるイメージ。

VPCエンドポイントとPrivate Linkの違いについては、以下の記事を参照ください。

https://dev.classmethod.jp/articles/aws-vpcendpoint-privatelink-beginner/

また、VPCエンドポイント(Private Link)を使うメリットについては、以下の記事を参照ください。

https://dev.classmethod.jp/articles/usecases-about-privatelink-vpc-endpoint/#toc-10

## Webサービスへの接続経路と経路毎の名前解決
本題に戻ります。

以下の図のように、インターネット経由、Private Link経由でWebサービスに接続する構成で考えてみます。

なお、インターネットアクセス時のFQDNとPrivate Link経由でアクセスする際のFQDNは異なる前提です。
※ただし、ドメインはどちらの経路でもパブリックドメイン。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2554521/c723e3e9-01b9-9550-6448-201f08421516.png)

#### インターネット経由の場合の名前解決
インターネット接続してWebサービスに接続する(青線の経路)際のアクセス先は、ALBのグローバルIPアドレス(GIP、パブリックIPアドレス)になります。

Webサービスでは、Route53のパブリックホストゾーンの設定、WebサービスのFQDNに対応するリソースとして、ALBを指定してA(CNAME)レコードを登録し、公開DNSにて名前解決できるようにしておきます。

お客様環境からは、googleなどのインターネットサイトにアクセスする際と同様に、WebサービスのFQDNについて、公開DNSにDNS転送して名前解決を行います。

名前解決以外では、プロキシサーバーなどのホワイトリストで、アクセス可能なFQDNを制限している場合があるので、その場合は、WebサービスのFQDNをホワイトリストに追加してもらう必要もあります。

#### Private Link経由の場合の名前解決
Private Link経由でWebサービスに接続する(赤線の経路)際のアクセス先は、お客様AWS環境内のPrivate Link用のVPCエンドポイントのプライベートIPアドレスになります。

Webサービスでは、Route53のプライベートホストゾーンの設定、内部NLBの作成、プライベートDNSを有効にしプライベートDNS名を指定したVPCエンドポイントサービスの作成などを行います。

また、お客様AWS環境では、作成するVPCエンドポイントのプライベートDNS名を有効にしておきます。

https://dev.classmethod.jp/articles/private-dns-name-for-privatelink/

なお、VPCエンドポイントサービスで、プライベートDNS名が指定されている場合(プライベートリンク用のFQDNとしてWebサービス側から指定されている場合)、VPCエンドポイントに接続する際のFQDNは、VPCエンドポイントサービスに設定されたプライベートDNS名になります。

そのため、お客様の内部DNSサーバーに、Webサービスへのプライベートリンク用のFQDNに対応するIPアドレスとして、VPCエンドポイントのプライベートIPアドレスを指定したAレコードを登録する事で名前解決ができるようになります。

例)Webサービスのプライベートリンク用のFQDNが「internal.example.com」の場合
````
internal.example.com. IN A プライベートリンク用VPCエンドポイントのプライベートIPアドレス
````

その他の方法としては、お客様AWS環境に、Route53リゾルバーのインバウンドエンドポイントを作成しておき、お客様の内部DNSサーバーで、WebサービスのFQDNについてのDNSクエリを、Route53リゾルバーのインバウンドエンドポイントのプライベートIPアドレスに転送するよう設定する方法もあります。

https://dev.classmethod.jp/articles/explain-route53-resolver-ram/

ですが、お客様オンプレミス環境からAWS上のWebサービスの名前解決を単純に行いたいだけであれば、Private Link用のVPCエンドポイントのプライベートIPアドレスについて、お客様内部DNSで名前解決するのがシンプルではないかと思います。

## おわりに
AWS上に構築されているBtoB向けのWebサービスに、お客様オンプレミス環境からアクセスする際の名前解決についてまとめてみました。