S3で公開しているサイトへのアクセスをVPNサーバー経由のアクセスのみに限定したいということはないでしょうか。
VPCのS3エンドポイントを使用することで、そのようなアーキテクチャを実現することができます。
今回は「S3エンドポイントの構築方法」とあわせてカスタムドメイン名を使用するために「リバースプロキシを構築して」プロキシ経由でS3エンドポイントにアクセスする構成を紹介します。
また、S3エンドポイントにはGateway型とInterface型がありますので、それぞれの違いについても軽く触れていきます。
今回紹介する構築手順はGateway型のS3エンドポイントになりますので、Interface型の構築手順が知りたい方は以下の記事を参照してください。
Gateway型のS3エンドポイントを使用してVPN経由でS3にアクセスする方法を紹介しています。構築手順を参考にしてください。
今回紹介するアーキテクチャ
今回紹介するアーキテクチャのキモは「S3エンドポイント」と「リバースプロキシ」です。
VPNサーバーにApacheを入れてリバースプロキシとしても動作させます。
このようにすることで、通常はS3へのアクセスURLが「https://s3.【リージョン名】.amazonaws.com/【バケット名】/【オブジェクト名】」となるところを任意のカスタムドメインで名前解決できるようにします。
また、バケットポリシーでS3エンドポイントからのパブリックアクセスのみ許可しますので、VPN経由でのみアクセス可能なS3とすることができます。
Gateway型とInterface型の違い
前述のとおり、S3エンドポイントにはGateway型とInterface型があります。
今回紹介するアーキテクチャは実はどちらの型でも構築は可能です。
ただ使用するうえで制約や料金に違いがあります。
それぞれの違いについてポイントとなるのは以下2点です。
- Gateway型はS3へのアクセスURLが変わらない。一方、Interface型はアクセスURLが「https://bucket.vpce-XXXX.s3.【リージョン名】.vpce.amazonaws.com/【バケット名】/【オブジェクト名】」という形式に変わる
- Interface型は追加料金が発生する
それぞれ解説していきます。
アクセスURLの違い
Gateway型のS3エンドポイントではS3へのアクセスURLは変わりません。
つまり通常のS3へのアクセスURLである「https://s3.【リージョン名】.amazonaws.com/【バケット名】/【オブジェクト名】」となります。(以下のようにAWS公式ドキュメントにも記載があります。)
対してInterface型のS3エンドポイントではS3へのアクセスURLは「 https://bucket.vpce-XXXX.s3.【リージョン名】.vpce.amazonaws.com/【バケット名】/【オブジェクト名】 」となります。
いずれもドメインにサブディレクトリとして「バケット名」と「オブジェクト名」が付いてきます。
バケット名を除いて、例えば「http://aaa.bbb.com/index.html」などでアクセスさせたい場合はリバースプロキシを置く必要があります。
料金の違い
以下のようにAWS公式ドキュメントにもある通り、Gateway型のS3エンドポイントは料金がかかりません。
対してインターフェース型のS3エンドポイントは料金がかかります。
料金の詳細はこちらから確認できます。
以下のような計算をすると月額1000円ちょっとは掛かる計算になります。
0.014 [USD/時間] * 24[時間] * 30[日] * 110[JPY/USD] = およそ1110円/月
料金の違いを踏まえると、今回の構成ではGateway型のS3エンドポイントを使用する方が得策です。
構築手順
VPCの作成
VPCの作成方法は以下の記事にまとめてありますので、手順がわからない方は参照してください。
VPCを使用してプライベートサブネットを構築する
VPCの実装方法を紹介しています。構築手順を参考にしてください。
VPNサーバーの構築
VPNサーバーの構築方法は以下の記事にまとめてありますので、手順がわからない方は参照してください。
EC2(CentOS)を使ったVPNサーバー構築方法を紹介しています。手順を参考にしてください。
EC2(Windows)を使ったVPNサーバー構築方法を紹介しています。手順を参考にしてください。
S3エンドポイントの構築
Gateway型のS3エンドポイントを構築していきます。
VPCコンソール画面の「エンドポイント」から「エンドポイントの作成」をクリックします。
エンドポイントを作成画面では「エンドポイント名」を入力し、サービスカテゴリを「AWSのサービス」を選択します。
サービスの検索窓に「s3」と入力し「Gatewayタイプのcom.amazonaws.ap-northeast-1.s3」を選択し、「作成したVPC」を選択します。
ルートテーブルはVPCで使用しているものを選択すればよいですが、わからなければすべて選択してもよいです。
あとは「エンドポイントを作成」をクリックすればS3エンドポイントの作成完了です。
エンドポイントのポリシーでアクセスを絞ることもできますが、今回はS3のバケットポリシーでアクセス制限を設けます。
エンドポイントのポリシーについてはこちらのAWS公式ドキュメントに記述があります。
S3エンドポイントの構築は以上で完了です。
S3バケットの作成
S3エンドポイントからアクセスするS3を作成します。
以下のようにパブリックアクセスをすべてブロックの状態で作成します。
バケットが作成出来たらバケットポリシーを設定していきます。
作成したバケット画面の「アクセス許可」からバケットポリシーの「編集」をクリックします。
バケットポリシーの入力欄には以下のオレンジ部分を変更してコピペしてください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowVPCe",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::BUCKET-NAME",
"arn:aws:s3::: BUCKET-NAME /*"
],
"Condition": {
"StringEquals": {
"aws:sourceVpce": "vpce-9999999"
}
}
}
]
}
次に静的ウェブサイトホスティングができるように設定します。
作成したバケット画面の「プロパティ」から静的ウェブサイトホスティングの「編集」をクリックします。
静的ウェブサイトを編集画面では静的ウェブサイトホスティングを「有効」にし、ホスティングタイプを「静的ウェブサイトをホストする」にします。
あとは、インデックスドキュメントを「index.html」などにして「変更の保存」をクリックします。
S3の作成は以上で完了です。
DNSを設定
カスタムドメインでS3にアクセスする場合はDNS設定を忘れずに設定しておきます。
今回はVPNサーバーをリバースプロキシとして使用するため、以下のようなDNSレコードを登録します。
VPNサーバーにリバースプロキシを設定
今回はVPNサーバーをリバースプロキシとして使用するため、VPNサーバーにApacheをインストールしてカスタムドメインに来たアクセスをS3エンドポイントに流します。
Apacheのインストールと設定は以下のようになります。
- Apacheのインストール
$ sudo yum install httpd
- Apacheを自動起動するように設定
$ sudo systemctl enable httpd
- 以下4点が有効か確認
- proxy_module (shared)
- lbmethod_byrequests_module (shared)
- proxy_balancer_module (shared)
- proxy_http_module (shared)
$ httpd -M
- プロキシ設定用のディレクトリを作成
$ sudo mkdir /var/www/html/XXXX
- リバースプロキシ設定を作成
$ sudo vi /etc/httpd/conf.d/reverse-proxy-s3-endpoint.conf
作成したconfファイルの中身は以下のようになります。オレンジ部を変更したうえで使用してください。
AllowOverride All
Require all granted
NameVirtualHost *:80
ServerName aaaa.bbbb.com
DocumentRoot /var/www/html/XXXX
ProxyRequests off
ProxyPass / http://s3.ap-northeast-1.amazonaws.com/【バケット名】/
ProxyPassReverse / http://s3.ap-northeast-1.amazonaws.com/【バケット名】/
- 設定の確認
$ httpd -t
- Apacheを起動
$ sudo systemctl start httpd
以上で構築はすべて完了となります。
S3に適当なHTMLを置いてみて、VPNを接続してカスタムドメインで表示されるか確認してみてください。
また、VPNを接続していない場合は表示されないことも併せて確認するとよいでしょう。
本記事が参考になったという方、似たようなAWSの使い方ハンズオンを以下のサイトにまとめています。他のAWSサービスの使い方の参考に覗いてみてください。