従来はVPC内のインスタンスからS3に接続するためには、インスタンスがパブリックネットワーク内にある必要がありました。しかし、VPCエンドポイントという特別な裏口ができたので、プライベートネットワーク内のインスタンスもこの裏口からS3に接続することが可能になりました。
VPC内のプライベートネットワークからS3への接続方法
1 VPCエンドポイントを作成する
1-1: VPCコンソール > エンドポイント作成
1-2: VPCを選択
*VPC-ID : VPCエンドポイント = 1:1になります
1-3: バケットポリシーを設定
今回はFull Accessの設定としました。特定のバケットへの通信のみ許可する場合は、こちらでポリシーを追加すると良いと思います。
1-4: ひもづけるルーティングテーブルを選択
*インターネットゲートウェイに紐付いていない、ローカルNWのみ通信可能なルーティングテーブルを選択してください
そうすると、ルーティングテーブルが次のようにupdateされます
以上で設定は終わりです!
注意点
【設定時の話】
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で見てみた
S3との通信内容をtcpdumpしてみました。ご覧の通り、S3(54.231.230.6)へはインターネット経由で接続していることがわかります。(パブリックネットワークからS3へ接続した時と変わりありません)
プライベートネットワーク内のインスタンスとS3との接続自体がローカル通信(= 接続速度速くなる)であることを期待していたのですが、そういう訳ではないようです。
セキュリティ要件が厳しく、プライベートネットワーク内のインスタンスからS3へNATインスタンス越しに接続している方には、とても嬉しいニュースかなと思います!