プライベートサブネットからAWSサービスエンドポイントのアクセス経路を調べてみた

2020.10.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

VPCのプライベートサブネットに配置しているEC2インタスンスからAWSサービスのエンドポイントを使用するには、アクセス経路が必要です。

NatGatewayまたはVPCエンドポイントを利用することでアクセス経路を確保できますが、VPCエンドポイントはすべてのAWSサービスのエンドポイントが用意されていないこともあり、NatGatewayとVPCエンドポイント両方を採用していることもあるかと思います。両方のアクセス経路があるプライベートサブネットからAWSサービスにアクセスする時は、どちらを利用してアクセスされるのか、気になったので調べてみました。

構成

今回はプライベートサブネットにあるEC2インスタンスからAWSのサービスエンドポイントにアクセスしてみました。

AWSのサービスエンドポイントは、AWSのドキュメントから確認できます。

AWSサービスエンドポイント

東京リージョンのec2エンドポイントは、「ec2.ap-northeast-1.amazonaws.com.」となります。アクセス経路がない状態でインスタンスから名前解決してみます。(念の為、IPアドレスを隠しています)

$ dig ec2.ap-northeast-1.amazonaws.com.

--- 省略 ---

;; QUESTION SECTION:
;ec2.ap-northeast-1.amazonaws.com. IN   A

;; ANSWER SECTION:
ec2.ap-northeast-1.amazonaws.com. 59 IN A   54.XXX.XXX.XXX

--- 省略 ---

グローバルのIPアドレスが返ってきました。アクセス経路がないのでこのままエンドポイントにアクセスしても通信できません。

NatGatewayを使用したAWSサービスエンドポイントのアクセス

まずはNatGatewayを導入してみます。NatGatewayをプライベートサブネットのルートテーブルに設定してアクセスしてみます。

$ curl -v https://ec2.ap-northeast-1.amazonaws.com
* Rebuilt URL to: https://ec2.ap-northeast-1.amazonaws.com/
*   Trying 54.XXX.XXX.XXX...
* TCP_NODELAY set
* Connected to ec2.ap-northeast-1.amazonaws.com (54.XXX.XXX.XXX) port 443 (#0)

--- 省略 ---

> Accept: */*

--- 省略 ---

NatGateway経由でグローバルIPアドレスにアクセスできました。(そりゃそうだ)

VPCエンドポイント(AWS PrivateLink)を使用したAWSサービスエンドポイントのアクセス

 

次にEC2のVPCエンドポイント(AWS PrivateLink)をプライベートサブネットにアタッチしてアクセスしてみます。

$ curl -v https://ec2.ap-northeast-1.amazonaws.com
* Rebuilt URL to: https://ec2.ap-northeast-1.amazonaws.com/
*   Trying 10.0.100.XXX...
* TCP_NODELAY set
* Connected to ec2.ap-northeast-1.amazonaws.com (10.0.100.XXX) port 443 (#0)

--- 省略 ---

> Accept: */*

--- 省略 ---

IPアドレスがプライベートIPにアクセスしています。名前解決してみます。

$ dig ec2.ap-northeast-1.amazonaws.com.

--- 省略 ---

;; QUESTION SECTION:
;ec2.ap-northeast-1.amazonaws.com. IN   A

;; ANSWER SECTION:
ec2.ap-northeast-1.amazonaws.com. 60 IN A   10.0.100.XXX
ec2.ap-northeast-1.amazonaws.com. 60 IN A   10.0.200.XXX

--- 省略 ---

VPCエンドポイント(AWS PrivateLink)作成時に指定したプライベートサブネットから払い出されたIPアドレスです。VPCエンドポイント(AWS PrivateLink)を作成時に「プライベート DNS 名を有効にする」にチェックを入れておくと、サービスエンドポイント(今回だとec2.ap-northeast-1.amazonaws.com.)のプライベートホストゾーンにVPCが関連付けられることにより、AmazonProvidedDNSがサービスエンドポイントの名前解決をプライベートIPアドレスで返すようになります。 従ってNatGatewayがルートテーブルに設定されていても、名前解決されたIPアドレスがプライベートIPアドレスなのでNatGatewayを経由しないアクセス経路となります。

VPCエンドポイント(ゲートウェイタイプ)を使用したAWSサービスエンドポイントのアクセス

では、S3などのゲートウェイタイプのエンドポイントの場合はどうでしょう。

S3のVPCエンドポイントがない状態で名前解決してみます。

$ dig s3.ap-northeast-1.amazonaws.com. 

--- 省略 ---

;; QUESTION SECTION:
;s3.ap-northeast-1.amazonaws.com. IN    A

;; ANSWER SECTION:
s3.ap-northeast-1.amazonaws.com. 4 IN   A   52.XXX.XXX.XXX

--- 省略 ---

グローバルのIPアドレスが返されます。

ではS3のVPCエンドポイントを作成してみます。作成時にはルートテーブルを指定する必要があります。プライベートサブネットが関連付けされているルートテーブルを指定します。再度名前解決してみます。

$ dig s3.ap-northeast-1.amazonaws.com. 

--- 省略 ---

;; QUESTION SECTION:
;s3.ap-northeast-1.amazonaws.com. IN    A

;; ANSWER SECTION:
s3.ap-northeast-1.amazonaws.com. 3 IN   A   52.XXX.XXX.XXX

--- 省略 ---

グローバルIPアドレスが返されます。ゲートウェイタイプのエンドポイントは作成時に指定したルートテーブルでアクセス経路を制御しています。S3のエンドポイントを作成したときに指定したルートテーブルを見てみると、S3のサービスエンドポイント(S3用マネージドプレフィックスのCIDR)の送信元に対して、ターゲットがVPCエンドポイントとなっています。これによりインターネットを経由しないでS3にアクセスできるようになります。

なお、ルートテーブルに複数の設定がある場合は、以下のように説明されております。

ルートテーブルに複数のルートがある場合、AWS では、トラフィックと一致する(最長プレフィックス一致)最も具体的なルートを使用して、トラフィックをルーティングする方法を決定します。

ルートテーブル

まとめ

プライベートサブネットからAWSサービスエンドポイントのアクセス経路を調べてみました。NatGateway、VPCエンドポイント両方を利用しているプライベートサブネットのアクセス経路を意識して設定変更する必要はなさそうですが、どのようにアクセスしているのか、参考になれば幸いです。

参考

VPCエンドポイント AWS PrivateLink で使用できる AWS のサービス AWS Lambda now supports AWS PrivateLink ←10/20 new!