VPC内のプライベートサブネットから各AWSサービスにアクセスするとき、VPC エンドポイントを利用すべきなのかNATGateway(インターネットゲートウェイ)を使うべきなのかよく忘れるのでメモ書きすることにしました。
参考文献
VPC エンドポイントとNATGateWay
AWSの各サービスはAPIのURLを持っており、そのAPIを呼び出すことでサービスを利用できます。
プライベートサブネットからAWSのサービスエンドポイントに接続するには、NAT Gatewayを使ってインターネット経由でアクセスするか、VPCエンドポイントを使用する必要があります。
単純にインターネット経由でアクセスしたい場合は、NAT Gatewayを利用します。
しかし、要件によってはインターネットを経由させずにVPCの内部サービスと通信を行いたい場合があります。
VPCエンドポイントを作成することで、VPCと他AWSサービス間でのプライベートな接続を実現することができます。
VPCエンドポイントはサービス利用側のVPC内で作成します。
VPC エンドポイントが提供されているサービスの場合、NAT Gateway の代わりに VPC エンドポイント経由でアクセスすることで通信料金を抑えることができます。
[参考サイト]
https://dev.classmethod.jp/articles/vpc-endpoints-for-ecs-2022
https://dev.classmethod.jp/articles/nat-gateway
https://dev.classmethod.jp/articles/aws-vpcendpoint-privatelink-beginner
VPCエンドポイントの種類
VPCエンドポイントには、以下の3種類が存在します。
- ゲートウェイエンドポイント
- インターフェイスエンドポイント(=AWS PrivateLink)
- Gateway Load Balancerエンドポイント
ゲートウェイエンドポイント
ゲートウェイエンドポイントを利用することで、NATゲートウェイを設置しなくてもプライベートサブネットからVPC外のサービスに対してセキュアにアクセスできます。
利用できるサービスはS3とDynamoDBの2つのみです。マニュアル
ゲートウェイエンドポイントはAWSマネージメントコンソールから「VPC」--> 「エンドポイント」-->「エンドポイントを作成」にアクセスすることで作成することができます。
ゲートウェイエンドポイントを作成するには、サービス利用側のVPC IDとルートテーブルにエンドポイントへのルーティング設定が必要となります。
ルートイメージ:
プライベートサブネット --> ルートテーブル --> ゲートウェイエンドポイント --> S3
[参考サイト]
https://www.fenet.jp/aws/column/tool/570/
インターフェイスエンドポイント
VPC内にインターフェイスを設置して、インターネットゲートウェイとNATゲートウェイを介さずに、VPC外(AWS通信網内)のサービスにアクセスするための機能です。
ECR
、KMS
、APIGateWay(※)
などの様々なサービスが利用できます。
※ プライベートREST API Gatewayを利用する場合に必要
インターフェイスエンドポイントはAWSマネージメントコンソールから「VPC」--> 「エンドポイント」-->「エンドポイントを作成」にアクセスすることで作成することができます。
エンドポイント作成時に所属する「VPC」「サブネット」「セキュリティグループ」とサービス名(com.amazonaws.ap-northeast-1.ecr.dkr等)を指定する必要があります。
サービス名はエンドポイント作成時に表示されるリストの中から指定できます。
エンドポイントが作成されると、インターフェイスエンドポイントのプライベートDNS名として、<vpce-code>.<service-code>.<region-code>.amazonaws.com
が割り当てられます。
<アカウントID>.<service-code>.<region-code>.amazonaws.com
でリソースにアクセスできます。
下記はECSのタスク定義の中で、ECRのエンドポイントを指定している例です。
"image": "123456789123.dkr.ecr.ap-northeast-1.amazonaws.com/hogehogeimg:latest
VPCエンドポイントとNATGateWayの使い分けが必要なサービス
API Gateway
API Gatewayで「メソッドの作成」 --> 「APIのデプロイ」を実行すると接続URLが発行されます。
パブリックアクセス可能なREST API Gateway
を作成した場合はNATGateWay
を経由してこのURLにアクセスできます。(通信経路: From VPC To REST API Gateway)
プライベートアクセスのREST API Gateway
作成してVPCと通信を行いたい場合は、専用のVPCエンドポイント
を作成する必要があります。(通信経路: From VPC To REST API Gateway)マニュアル
ただし、このVPCエンドポイント
を作成するとデフォルトではパブリックアクセス可能なREST API Gatewayへの通信(NATGateWay
経由)が行えなくなります。参考サイト1, 参考サイト2
パブリックアクセス可能なREST API Gatewayと併用する場合は、パブリックな方のAPI Gatewayにカスタムドメインを設定することでNATGateWay
を経由した通信となり、通信不可の事象を回避できます。
HTTP API Gateway(※)
からプライベートなVPCに通信を行いたい場合はVPCリンク
を利用できます。(通信経路: From HTTP API Gateway To VPC)マニュアル
[参考サイト]
https://oji-cloud.net/2020/03/13/post-4469/
VPCエンドポイントがサポートされていないサービス
Amazon Cognito
Amazon Cognitoは VPC Endpoint がサポートされていません。
Cognitoユーザープールのエンドポイントへ接続するためにはインターネットへの到達性を確保している必要があります。
(ただし、トラフィックは実際にインターネットを通過するものではありません。AWS のサービスエンドポイントにアクセスするためにはインターネットへの到達性が必要ですが、トラフィックは AWS グローバルネットワークに留まります)。
したがってプライベートサブネットからCognitoユーザープールのエンドポイントへ接続するためにはNAT GateWayが必要です。
[参考サイト]
https://aws.amazon.com/jp/builders-flash/202210/cognito-userpool-endpoint/?awsf.filter-name=*all