REST API Privateの"Private"ってなんだっけ？

## はじめに

社内間のシステム間連携目的で、プライベートなAPI Gatewayを作成した際、気になった名前解決周りを中心に検証してみました！

## まずは検証！

### 準備

CloudShellを検証に利用するので、以下コマンドで`nslookup`が利用できるようにしておきます。

::: note info
VPC上にCloudShellを配置する際、パプリックサブネットに配置しても、パプリックアドレスが付与されず、インターネット向けへの通信ができません。

NATGatewayを使ってインターネット接続する必要があります。
:::

```console
$sudo yum update -y
$sudo yum install dnsutils
```

### VPC外から名前解決

最初はCloudShellで検証してみます。

~~~console
$ nslookup kuqc3sehm9.execute-api.ap-northeast-1.amazonaws.com
Server:         10.0.0.2
Address:        10.0.0.2#53

** server can't find kuqc3sehm9.execute-api.ap-northeast-1.amazonaws.com: NXDOMAIN
~~~

名前解決できませんでした。

### VPC内から名前解決（同一アカウント・エンドポイントなし）

VPC上に配置したCloudShell上でも検証しましたが、以前名前解決できませんでした。

### VPC内から名前解決（同一アカウント・エンドポイントあり）

次に、`com.amazonaws.ap-northeast-1.execute-api`のインターフェース型エンドポイントを作成して確認してみます！

~~~console
$ nslookup kuqc3sehm9.execute-api.ap-northeast-1.amazonaws.com

Server:         10.0.0.2
Address:        10.0.0.2#53

Non-authoritative answer:
Name:   kuqc3sehm9.execute-api.ap-northeast-1.amazonaws.com
Address: 10.0.139.111
~~~

名前解決できました！

### VPC内から名前解決（別アカウント・エンドポイントあり）

最後に上記構成を別アカウントで構築し、確認してみます。

~~~console
$ nslookup kuqc3sehm9.execute-api.ap-northeast-1.amazonaws.com
Server:         10.0.0.2
Address:        10.0.0.2#53

Non-authoritative answer:
Name:   kuqc3sehm9.execute-api.ap-northeast-1.amazonaws.com
Address: 10.0.143.212
~~~

名前解決できてしまいます！

なお、アカウントごとに解決されるIPアドレスが異なりますが、これはVPCエンドポイントが提供するDNSを名前解決した時と同じIPアドレスでした。

![スクリーンショット 2024-10-22 4.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/27e0a92b-235b-f417-f090-87203d27b361.png)


~~~console
$ nslookup vpce-096e8f38529660e14-kd6rs2wt.execute-api.ap-northeast-1.vpce.amazonaws.com
Server:         10.0.0.2
Address:        10.0.0.2#53

Non-authoritative answer:
Name:   vpce-096e8f38529660e14-kd6rs2wt.execute-api.ap-northeast-1.vpce.amazonaws.com
Address: 10.0.143.212

~~~

IPアドレスをネット上の調査ツール調べると、こんなホスト名は`ap-northeast-1.compute.internal`でした。

EC2なのか？

![スクリーンショット 2024-10-22 4.29.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/e5ce9c38-6cd5-4bd5-a9ed-d14f3f593aac.png)



## 「Private」の定義とは？

検証の結果、VPCエンドポイントがあれば他アカウントでも参照できることが分かりました。

AWSのホワイトペーパーを確認し、「Private」の定義を確認してみます。

https://docs.aws.amazon.com/whitepapers/latest/best-practices-api-gateway-private-apis-integration/rest-api.html

>To make APIs accessible only from Amazon VPCs, you can use REST APIs with the private endpoint type. The traffic to the APIs will not leave the AWS network. 

アカウント単位の制御に言及がありません。

つまり、明記はないですがアカウントレベルで「Private」ではなく、AWSネットワークのVPC内のみ利用可能といった意味で、「Private」という定義の模様です。

Private型のAPI Gatewayを作成する際に、リソースポリシーが必須になってくる理由もここにあるような気がします。

## PublicなAPI Gatewayとの併用時の注意。

補足として、API Gateway用のVPCエンドポイントを使う構成にすると、検証した通り、
`*.execute-api.amazonaws.com`に対する名前解決は、VPCエンドポイント側のIPアドレスで名前解決されてしまいます。

> However, if you use a custom DNS server, a conditional forwarder must be set on the DNS that points to the AmazonProvidedDNS or Route53 Resolver. Because of the private DNS option enabled on the interface VPC endpoint, DNS queries against *.execute-api.amazonaws.com will be resolved to private IPs of the endpoint. This causes issues when clients in the VPC try to invoke regional or edge-optimized APIs, because those types of APIs must be accessed over the internet. Traffic through interface VPC endpoints is not allowed. The only workaround is to use an edge-optimized custom domain name.

この為、カスタムドメインを利用せず、`*.execute-api.amazonaws.com`のドメインでAPI Gatewayを参照する方法をとっている構成は、動作しなくなってしまうことに注意が必要です！

## まとめ

「Private」の定義を誤認にすると、思わぬ接続先からのアクセスがありそうで少し怖かったです。

リソースポリシーはしっかりと設定しないといけませんね。