便利なVPCエンドポイント
batchiです。
今回はVPCエンドポイントについて。
VPCエンドポイントと言えば、
プライベートサブネットからS3バケットに
直にアクセスできるようにしてくれる代物。
「直に」、というのは、
これまではNATインスタンスを経由させるなどして
一度インターネット上に出して上げる必要があったけれど、
その必要がなくなるというイメージです。
「AWS Black Belt Techシリーズ Amazon VPC」より
例えばプライベートサブネット上にあるEC2インスタンスから、
(VPCエンドポイントやNATの設定をせずに、)
aws s3 lsのようなコマンドを打っても、
下記のようなエラーが返ってくるはず。
Could not connect to the endpoint URL: "https://s3-ap-northeast-1.amazonaws.com/"
ところがVPCエンドポイントを作成して、
ルートテーブルに設定すれば、
aws s3 ls コマンドによって、
きちんとバケット一覧が返ってくるようになる。
設定自体もすぐ終わるし、魔法のように便利なサービスです。
VPCエンドポイントの注意点
便利なばっかりに当初はあまり深く考えていなかったのですが、
NetworkACLやSecurityGroupのアウトバウンドの設定時には注意が必要です。
前出の画像のように、
「VPCエンドポイント」なるものがサブネットの内側にあって、
そこからうまい具合にS3バケットへのアクセス経路を
ごにょごにょしてくれるのだろうと当初は思っていました。
ところが考えてみれば、
(ルートテーブル上での設定を見返せば、)
ターゲットが(未だにどこにあるのかはよくわからない)VPCエンドポイントであっても、
送信先はVPCの外側にある「プレフィックスID」なわけで、
当然そこへのアウトバウンドがDenyされていれば疎通はできないわけです。
プレフィックスIDとは?
「宛先のAWSクラウド上のサービスを特定するためのID」
「該当のサービスで利用されているパブリックIPの集まり」とのことです。
下記コマンドを打つと中身が分かります。
>aws ec2 describe-prefix-lists { "PrefixLists": [ { "PrefixListName": "com.amazonaws.ap-northeast-1.s3", "Cidrs": [ "54.231.224.0/21" ], "PrefixListId": "pl-61a54008" } ] }
東京リージョンでは54.231.224.0/21が該当します。
他のリージョンでもそれぞれ固有のIP範囲を持っています。
(IP範囲は場合によって変更する場合もあるとのこと)
よって、上記のIP範囲へのアウトバウンドがAllowになっていないと、
VPCエンドポイントを設定したからといって、
S3バケットへのアクセスはうまくいかないということでした。
盲点でした。
おまけ:ドキュメントの意味するところ
◆VPCエンドポイントのドキュメント/「エンドポイントの制限」
http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpc-endpoints.html#vpc-endpoints-basics
初めて上記のドキュメントで下記文面を見た時に、
頭が痛くなるくらい意味が不明だったのですが、
いろいろ試してみたらあっけなく理解できたのでメモ代わりに残しておきます。
プレフィックスリスト ID を使用して、エンドポイントで指定されたサービスへのアウトバウンドトラフィックを許可または拒否するアウトバウンドルールをネットワーク ACL で作成することはできません。代わりに、アウトバウンドセキュリティグループのルールでプレフィックスリスト ID を使用できます。
セキュリティグループでは送信先にプレフィックスIDが使用できます。
ネットワークACLではできません。
それだけでした。
こちらからは以上です。