VPCエンドポイントとは
通常、S3やDynamoDB, API Gatewayなどのサービスはインターネットを経由してアクセスする。しかしVPCエンドポイントを利用すれば、インターネット上に出ることなくこれらのサービスにアクセスすることができる。これを使うと以下のようなメリットがある。
- よりセキュアな通信
- 通信コストの削減
- アクセス対象のリソース制御
インターフェイスエンドポイントとゲートウェイエンドポイント
インターフェイスエンドポイント
超簡単に説明すると、VPCの中にローカルIPアドレスを持ったNICを作って、そこを宛先にして各サービスへアクセスする。アベイラビリティゾーン毎にデプロイ可能。セキュリティグループも紐付けることができるので送信元IPによる制御も可能。
作成時に プライベートDNS
を有効にすることで、サービスデフォルトのDNS名をインターフェイスエンドポイントに変更することができる。これを利用すれば、VPC内のEC2でAWS CLI, AWS SDKを使ったアクセスがインタフェイスエンドポイント経由になる。ただし、API Gatewayの場合は後述する罠があるので注意。
ゲートウェイエンドポイント
ルートテーブルに紐づくエンドポイント。設定したサービスの通信がここで作成した経路に捻じ曲げられる。現在はS3とDynamoDBでしか利用しない。今回はためしてない。
作ってみた(インターフェイスエンドポイント)
事前確認
$ nslookup XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com Server: 10.169.62.85 Address: 10.169.62.85#53 ** server can't find XXXXXX.execute-api.ap-northeast-1.amazonaws.com: NXDOMAIN
$ nslookup XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com Server: 10.169.62.85 Address: 10.169.62.85#53 Non-authoritative answer: Name: XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com Address: グローバルIPが返ってくる Name: XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com Address: グローバルIPが返ってくる
VPCエンドポイント作成
以下を参考に作成。今回はプライベートDNS名を有効化して作成。 https://dev.classmethod.jp/cloud/apigateway-supports-vpc-endpoint/
事後確認
$ nslookup XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com Server: 10.169.62.85 Address: 10.169.62.85#53 Non-authoritative answer: XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com canonical name = execute-api.ap-northeast-1.amazonaws.com. Name: execute-api.ap-northeast-1.amazonaws.com Address: 10.169.62.190 Name: execute-api.ap-northeast-1.amazonaws.com Address: 10.169.63.75
$ nslookup XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com Server: 10.169.62.85 Address: 10.169.62.85#53 Non-authoritative answer: XXXXXXXX.execute-api.ap-northeast-1.amazonaws.com canonical name = execute-api.ap-northeast-1.amazonaws.com. Name: execute-api.ap-northeast-1.amazonaws.com Address: 10.169.62.190 Name: execute-api.ap-northeast-1.amazonaws.com Address: 10.169.63.75
両方ともインターフェイスエンドポイントのIPが返ってきた
API Gatewayの罠
VPCエンドポイントを作成する際、プライベートDNS名を有効化してしまうとAPI Gatewayのエンドポイントタイプが リージョナル
, エッジ最適化
のAPIもプライベートリンク経由の接続となる。この場合、VPC内から上記タイプのAPI Gatewayにアクセスできなくなる。
同じVPCから プライベート
, リージョナル
, エッジ最適化
のAPI Gatewayを併用する場合、VPCエンドポイントはプライベートDNS名を無効化して作成する必要がある。また、このケースでプライベートなAPI GatewayへアクセスするにはパブリックDNS名を利用し、かつリクエストヘッダを追加 or ホストヘッダを修正してアクセスする必要がある。パブリックというだけあって外部からも名前解決はできるが、ローカルIPなのでもちろんアクセスはできない。
メモ
https://aws.amazon.com/jp/api-gateway/faqs/
感想
もともとはVPCエンドポイントをさっくり試す記事にしようと思ったけど、API Gatewayの罠にハマって結構時間がかかった。これまで表面的にしか分かってなかったけど、実際に使って仕組みを理解すると面白い。
参考
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints.html
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-endpoints-access.html(