REST APIエンドポイント経由で特定のVPC(CIDR)にのみS3のコンテンツを公開してみた

2022.09.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは。大阪オフィスの林です。

S3に格納したコンテンツを、指定したVPCのCIDRにのみに公開する方法を検証する機会がありましたので内容をまとめておきたいと思います。

今回やること

今回、S3のVPCエンドポイント(インターフェース型)を使ってREST APIエンドポイント経由でS3にアクセスする環境を整えていきたいと思います。

やってみた

まずはコンテンツ格納用のS3バケットを作成します。公開するコンテンツもサンプルで格納しておきます。

静的ウェブサイトホスティングは使用しないので「無効」のままにします。

少し話がそれますが執筆中、S3の「静的ウェブサイトホスティング」と「REST API」の違いについて少し混乱して解釈していました。同僚からのコメントであったり下記のエントリを読み直して理解することが出来ましたので理解が曖昧な場合は是非一読いただけますとある程度腑に落ちると思います。

検証に戻ります。外部に公開するわけでは無いのでパブリックアクセスブロックはすべて「オン」の状態のまま進めます。

今回は下記のバケットポリシーを設定しました。条件としてConditionの中、aws:SourceVpceで作成したVPCエンドポイントを指定しており、aws:VpcSourceIpでアクセスを許可するCIDRを指定しています。
aws:VpcSourceIpの部分をaws:SourceIpに変えることでVPC以外で使用しているCIDRやIPアドレスについてもアクセス制御が可能なので要件に応じて条件の内容は設計頂ければと思います。

{
	"Version": "2012-10-17",
	"Id": "SourceIP",
	"Statement": [
		{
			"Effect": "Allow",
			"Principal": "*",
			"Action": "s3:GetObject",
			"Resource": "arn:aws:s3:::test-access-xxxxxxxxxxxx/*",
			"Condition": {
				"StringEquals": {
					"aws:SourceVpce": "vpce-0805ffbf09xxxxxxxxxxxxxxxx"
				},
				"IpAddress": {
					"aws:VpcSourceIp": "172.31.0.0/16"
				}
			}
		}
	]
}

次にS3のVPCエンドポイント(インターフェース型)を作っていきますが、今回はデフォルトの設定で作成しています。ポリシー(アクセス制御)もS3のバケットポリシー側で実装しているため、エンドポイントのポリシーでは制御していません。

エンドポイントにアタッチするセキュリティグループには、アクセスを想定しているCIDRからのHTTPS許可を入れています。

動作確認

S3エンドポイント経由でS3のバケットにアクセスする場合は、下記のURLでのアクセスとなります。

  • https://bucket.エンドポイントのDNS名/バケット名 + パス

アクセスを許可するCIDRに所属するEC2から接続すると、サンプルで格納したコンテンツが返ってきました。

[ec2-user@ip-172-31-5-49 ~]$ curl https://bucket.vpce-0805ffbf09xxxxxxxxxxxxxxxx.s3.ap-northeast-1.vpce.amazonaws.com/test-access-xxxxxxxxxxxx/index.html
test top page
[ec2-user@ip-172-31-5-49 ~]$

存在しないファイルを指定してアクセスし、REST APIエンドポイント経由でアクセスしているかを確認してみます。REST APIエンドポイント経由でのアクセスの場合、存在しないパスなどのエラー時にXML形式のエラーレスポンスが返されます。(静的ウェブサイトホスティングの場合エラーはHTMLドキュメントが返されます)

[ec2-user@ip-172-31-5-49 ~]$ curl https://bucket.vpce-0805ffbf09xxxxxxxxxxxxxxxx.s3.ap-northeast-1.vpce.amazonaws.com/test-access-xxxxxxxxxxxx/none/index.html
<?xml version="1.0" encoding="UTF-8"?><Error><Code>AccessDenied</Code><Message>Access Denied</Message><RequestId>KY515W2DXxxxxxx</RequestId><HostId>vIYxQJPkPHqG1HzGzFyEcwc+geqTyQKoz+cxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</HostId></Error>
[ec2-user@ip-172-31-5-49 ~]$

引用元

まとめ

当初検証したかったVPCエンドポイントを使ったREST API経由でのS3アクセスに加え、検証の過程で「静的ウェブサイトホスティング」と「REST API」の違いについて改めて学びなおすことが出来ました。
本記事がどなたかの参考になりましたら幸いです。

以上、大阪オフィスの林がお送りしました!