こんにちは!イーゴリです。
Amazon S3 を使用して静的ウェブサイトをホスティングする(HTTPアクセス)機能はとても便利ですね。 S3のStatic Website Hostingに特定の VPC からしかアクセスできなくする方法について検証しましたので、 共有致します。
今回のブログの要件としては下記です。
- インターネットからS3にアクセスができない
- 特定のVPCからアクセスができる
- イメージ図
- 前提条件
- S3バケットの作成
- index.htmlのアップロード
- ウェブサイトのホスティングの有効化
- バケットポリシーの設定
- S3 Gateway Endpointの作成
- EC2からS3のWeb Pageにアクセスできるか確認する
イメージ図

前提条件
- VPCのパブリックサブネットにNAT GWがあること
- EC2が存在していること(WebPageへのアクセスの確認のため)
S3バケットの作成
index.htmlのアップロード
試しに下記のindex.htmlをS3にアップロードします。
<!DOCTYPE html>
<html>
<head>
<title>My Page</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
ウェブサイトのホスティングの有効化
上記の設定の有効化後に下記のようなバケットウェブサイトエンドポイントが表示されますので、このバケットウェブサイトエンドポイントのURLを控えます。

バケットポリシーの設定
私の場合、特定のVPCからすべてのアクションを許可したいため、下記のポリシーを使います。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowVPC",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::<バケット名>",
"arn:aws:s3:::<バケット名>/*"
],
"Condition": {
"StringEquals": {
"aws:SourceVpc": "<vpc-id>"
}
}
}
]
}
- <バケット名>=作成したバケット名を入力します。
- <vpc-id>=作成したVPC IDを入力します。
なお、"StringEquals"のところに
"aws:SourceVpc": "<vpc-id>"
だけではなく、S3 Gateway Endpointも指定することができますので、その場合、
"aws:sourceVpce": "<vpce-id>"
を入力します。
今回の記事のパターンの場合、どちらの方法でも問題ないですが、VPC エンドポイントからのみアクセスしたい場合、ベストプラクティス的には最小権限として制限したほうが良いため、VPC エンドポイントを指定します。
S3 Gateway Endpointの作成
下記URLの「ゲートウェイ VPC エンドポイントの作成(今回、選んだタイプ)」をご参照ください。
EC2からS3のWeb Pageにアクセスできるか確認する
対象VPC内にあるEC2に接続し、控えたバケットウェブサイトエンドポイントのURLをアクセスします。

アクセスできました。
自分の端末からインターネット経由でアクセスすると、下記の結果になります。

以上、御一読ありがとうございました。
本田 イーゴリ (記事一覧)
カスタマーサクセス部
・2024 Japan AWS Top Engineers (Security)
・AWS SAP, DOP, SCS, DBS, SAA, DVA, CLF
・Azure AZ-900
・EC-Council CCSE
趣味:日本国内旅行(47都道府県制覇)・ドライブ・音楽