こちらの記事では、Gateway型のS3エンドポイントを使用してVPN経由のS3アクセスを実現する方法を紹介していましたが、同じことはInterface型のS3エンドポイントでも可能です。
(Interface型はPrivateLinkとも言います。)
Interfae型のS3エンドポイントを使用するメリットとしては、プライベートIPアドレスを持ったENIがエンドポイントに割り当てられることにより、リバースプロキシなど構築しなくてもVPN経由でS3エンドポイントまでアクセスできることだと思います。
しかし、アクセスURLは「 https://bucket.vpce-XXXX.s3.【リージョン名】.vpce.amazonaws.com/【バケット名】/【オブジェクト名】 」となってしまうため、静的サイトホスティングでS3を使う場合はどうしてもカスタムドメインを使うためにリバースプロキシを設けることになるのではないかと思うのです。
また、プログラムなどから使用するからカスタムドメインである必要はないという場合でも、VPNサーバーを使っているならリバースプロキシとして兼用することでInterface型ではなくGateway型を使った方がコストメリットがあると思っています。
しかし、Interface型を構築する状況に備えて手順を整理するために、今回はあえて前回Gateway型で構築していたアーキテクチャをInterface型のS3エンドポイントで構築するという想定でS3エンドポイントの構築手順のみ紹介します。
今回紹介するアーキテクチャ
今回紹介するアーキテクチャはこちらの内容とほぼ同じですが、S3エンドポイントにInterface型を使用するという点のみ異なります。
Interface型ではアクセスURLが通常「 https://bucket.vpce-XXXX.s3.【リージョン名】.vpce.amazonaws.com/【バケット名】/【オブジェクト名】 」となりますが、リバースプロキシを使用することでカスタムドメイン名で名前解決できるようにします。
※ 通常のアクセスURLで問題なければリバースプロキシを設ける必要がありません。
また、バケットポリシーでS3エンドポイントからのアクセスのみ許可しますので、VPN経由でのみアクセス可能なS3とすることができます。

(クリックすると画像が拡大されます。)
S3エンドポイントの構築手順以外の以下の構築手順はGateway型のときと全く同じなので今回は割愛します。以下の手順は前回の記事を見てください。
- VPCの作成
- VPNサーバーの作成
- S3バケットの作成
- DNSを設定
- VPNサーバーにリバースプロキシを設定
【注意】Interface型は追加料金がかかります
インターフェース型のS3エンドポイントは料金がかかります。
料金の詳細はこちらから確認できます。
以下のような計算をすると月額1000円ちょっとは掛かる計算になります。
- 0.014 [USD/時間] * 24[時間] * 30[日] * 110[JPY/USD ] = およそ1110円/月
料金の違いを踏まえると、今回のような構成ではGateway型のS3エンドポイントを使用する方が得策です。
本記事ではInterface型の構築手順を紹介するためにあえてInterface型を使用するケースを想定しているだけです。
Interface型のS3エンドポイントを構築する際に意識するポイント
Interface型のS3エンドポイントを構築する際にはGateway型の構築の時とは違う以下のポイントを押さえておくとよいです。
- Interface型のVPCエンドポイントにはセキュリティグループをつける
- VPCエンドポイントを構築するときにデフォルトでオンになっている「DNS名を有効化」のチェックを外す必要がある
エンドポイントのポリシーによりアクセス制御する仕組みがあるのはGateway型もInterface型も共通していますが、Interface型のエンドポイントにはさらにセキュリティグループによってアクセス制御を行います。
そのため、エンドポイントを構築する前にセキュリティグループを作成する必要があります。
また、Interfae型のVPCエンドポイントではプライベートDNS名が使用できるものもありますが、S3エンドポイントではプライベートDNSが使用できません。
落とし穴なのはデフォルトでオンになっており、オフにしないとエラーでエンドポイントを作成できないところです。(しかも「DNS名を有効化」のチェックの場所がわかりにくい。。)
Interface型のS3エンドポイント構築手順
それではInterface型S3エンドポイントの構築手順を紹介します。
「セキュリティグループ」をまず作成し、それからS3エンドポイントを作成します。
S3エンドポイント用セキュリティグループの作成
EC2コンソール画面のセキュリティグループから以下のようなセキュリティグループを作成します。
ここでは自分で作成したVPCのプライベートIPの範囲が「192.168.11.0/24」と「192.168.12.0/24」の2つがあるものとします。
S3へのhttpアクセスとhttpsアクセスを許可したいので、以下のように80番ポートと443番ポートのインバウンドを許可するようにします。

(クリックすると画像が拡大されます。)
Interface型S3エンドポイントの作成
セキュリティグループの作成ができたので、S3エンドポイントを構築していきます。
VPCコンソール画面の「エンドポイント」から「エンドポイントを作成」をクリックします。
エンドポイントを作成画面では「任意の名前を付け」、サービスカテゴリで「AWSのサービス」を選択します。

(クリックすると画像が拡大されます。)
次にサービスの検索窓に「s3」と入力し「Interfaceタイプのcom.amazonaws.ap-northeast-1.s3」を選択し、「作成したVPC」を選択します。
さらにここで、「追加設定」から「DNS名を有効化」のチェックを外します。

(クリックすると画像が拡大されます。)
サブネットでは「エンドポイントを作成するサブネットを指定」し、「先ほど作成したセキュリティグループを選択」します。

(クリックすると画像が拡大されます。)
ポリシーはS3のバケットポリシーで設定すればよいので特にポリシーは指定せず「エンドポイントを作成」をクリックします。

(クリックすると画像が拡大されます。)
以下のようにステータスが「保留中」から「使用可能」に変われば作成完了です。

(クリックすると画像が拡大されます。)
アーキテクチャを構成するための「S3作成」や「リバースプロキシ設定」などといった後続の作業は前回の記事を参照してください。
アーキテクチャが構築出来たらVPNを繋いだり切ったりしてアクセスを確認します。
Interface型のS3エンドポイントを使ってVPN経由のS3アクセスのみ可能であることが確認できるはずです。

(クリックすると画像が拡大されます。)
以上です。
本記事が参考になったという方、似たようなAWSの使い方ハンズオンを以下のサイトにまとめています。他のAWSサービスの使い方の参考に覗いてみてください。
