Edited at

VPCプライベートネットワークからS3へ接続する

More than 3 years have passed since last update.

従来はVPC内のインスタンスからS3に接続するためには、インスタンスがパブリックネットワーク内にある必要がありました。しかし、VPCエンドポイントという特別な裏口ができたので、プライベートネットワーク内のインスタンスもこの裏口からS3に接続することが可能になりました。


VPC内のプライベートネットワークからS3への接続方法


1 VPCエンドポイントを作成する

1-1: VPCコンソール > エンドポイント作成

endpoint1

1-2: VPCを選択

*VPC-ID : VPCエンドポイント = 1:1になります

1-3: バケットポリシーを設定

今回はFull Accessの設定としました。特定のバケットへの通信のみ許可する場合は、こちらでポリシーを追加すると良いと思います。

endpoint2

1-4: ひもづけるルーティングテーブルを選択

*インターネットゲートウェイに紐付いていない、ローカルNWのみ通信可能なルーティングテーブルを選択してください

endpoint3

そうすると、ルーティングテーブルが次のようにupdateされます

endpoint4

以上で設定は終わりです!


注意点

【設定時の話】

VPCエンドポイントを設定時、既存インスタンスからS3への接続が途切れるそうです(未検証)。設定時はタイミングを見計らうといいと思われます

【バケットポリシーの話】

従来、S3接続のIP制限はバケットポリシーにCIDRを記載していました。

ドキュメントには


When using Amazon S3 endpoints, you cannot use a bucket policy or an IAM policy to allow access from a VPC CIDR range (the private IP address range). VPC CIDR blocks can be overlapping or identical, which may lead to unexpected results


とあり、Source-IPがプライベートIPになったからって、IP制限を直接バケットポリシーに書かないでね、とかいてあります。特定インスタンスからS3接続を許可したい場合は、Security-Groupのoutband規制で絞るなど、他の方法で回避するのでしょうか。


2 確認

以下の通り、インターネットに通信できない状態ですが

[root@ip-172-31-6-140 ~]# curl https://www.google.co.jp/curl: (7) Failed to connect to 2404:6800:4008:c01::5e: Network is unreachable

[root@ip-172-31-6-140 ~]#

無事、s3上にある画像ファイルをDLすることができました。

[root@ip-172-31-6-140 ~]# aws s3 cp s3://test-3-shake.com/20150305051314_thumb.jpg .

download: s3://test-3-shake.com/20150305051314_thumb.jpg to ./20150305051314_thumb.jpg
[root@ip-172-31-6-140 ~]#


通信内容をtcpdumpしてwiresharkで見てみた

hoge

S3との通信内容をtcpdumpしてみました。ご覧の通り、S3(54.231.230.6)へはインターネット経由で接続していることがわかります。(パブリックネットワークからS3へ接続した時と変わりありません)

プライベートネットワーク内のインスタンスとS3との接続自体がローカル通信(= 接続速度速くなる)であることを期待していたのですが、そういう訳ではないようです。

セキュリティ要件が厳しく、プライベートネットワーク内のインスタンスからS3へNATインスタンス越しに接続している方には、とても嬉しいニュースかなと思います!