■ 概要
S3でホスティングしたページに対して、
VPN接続している場合のみアクセスできる状態にするための方法です。
■ 背景
今回、このような対応をしたこんな背景になります。
- DBのスキーマを社内のみで公開したい。
という要件をいただきました。
担当のエンジニアからは検証サーバーにアップロードするのはどうかという案が出ていたのですが、
本番環境とずれてしまうことになります。
かと言って、スキーマのためだけに別のサーバーを立てるのもめんどくさい。。。
ということで、今回はS3のホスティングを利用することにしました。
処理を行わない静的なページなのでS3のホスティングで事足ります。
また、バケットポリシーを設定することで、VPN接続した時のみ閲覧できるようにできます。
ということで早速みていきましょう。
■ 各種設定方法
1. S3バケットの作成
S3に新しくバケットを作成します。
この時にブロックパブリックアクセスのバケット設定を設定しておきます。

2. ホスティングを有効化
次にホスティングを行います。
新しく追加したバケットにどんな内容でもいいのでindex.htmlを設置します。
その後にS3のプロパティタブの中にある「静的ウェブサイトホスティング」の編集に遷移します。
以下のスクショのように有効にして、インデックスドキュメントをindex.htmlにします。
今回は社内用なのでエラードキュメントは設置しておりません。

完了すると、ホスティングのページで以下のようにURLが表示されるのでアクセスすると、
設置したindex.htmlの内容が閲覧できるかと思います。

3. VPNのみ許可するバケットポリシーの設定
ここが今回のメインどころです。
結論、VPN経由のみでアクセス可能にするには以下の設定をバケットポリシーに追加します。
「バケット名に置換」と「IPに置換」の部分は設定するご自身の環境に合わせて書き換えてください。
{
"Version": "2012-10-17",
"Id": "SourceIP",
"Statement": [
{
"Sid": "SourceIP",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::バケット名に置換",
"arn:aws:s3:::バケット名に置換/*"
],
"Condition": {
"IpAddress": {
"aws:SourceIp": [
"VPNのプライベートIPに置換",
"VPNのパブリックIPに置換"
]
}
}
}
]
}
VPNのプライベートIPは検証のサーバーのEC2からアクセスするためのものになります。
パブリックIPは実際にブラウザからアクセスして閲覧する用のものです。
こちらがないと閲覧できなくなるのでご注意ください。
バケットポリシーを誤って設定してしまったら
もし、誤った設定を追加してしまうと、ご自身も閲覧や編集も行えなくなってしまいます。
その場合はAWSにルートユーザーでログインしてください。
そうすればバケットポリシーの削除や編集が行えます。
以上でVPN経由でのみ閲覧できるS3のホスティングの仕組みができます。
もし間違っている部分だったり、もっと改善できる点などをご存知でしたら、コメントをいただけると幸いです。