
はじめに
ゼネットシステム事業部の方です。
AWSでWebサイトやファイルを配信する際、Amazon S3 をオリジンに使う構成はよく見られます。
しかし、セキュリティ要件が厳しい会社や組織では S3をパブリックに公開できない ケースがあります。
従来は「S3 ブロックパブリックアクセス」を一部解除し、バケットをインターネットから参照できるようにしなければなりませんでした。
ところが、SCP(Service Control Policy)でパブリック許可を禁止 している環境では、その手法は使えません。
では、どうすれば閉域(非公開)環境のままS3を利用できるのでしょうか?
本記事では、CloudFront と S3 バケットポリシーを組み合わせた閉域アクセスの実現方法 を解説します。
課題:S3を直接公開できない
通常、S3バケットから直接コンテンツを配信する場合は以下のようにします。
-
バケットポリシーで
Principal: "*"を許可 -
S3のパブリックアクセス制御をオフにする
これにより誰でもアクセスできる状態になりますが、セキュリティ上のリスクがあります。
特に金融・公共系のシステムでは「S3をパブリックにしてはいけない」というガイドラインがよく存在します。
解決策:CloudFront + S3バケットポリシー
S3を直接公開せず、CloudFrontを経由させることで安全に配信 することができます。

このとき重要なのが S3バケットポリシー です。
S3はインターネット全体に公開せず、CloudFrontサービスプリンシプル のみを許可します。
以下のサンプルポリシーは、特定のCloudFrontディストリビューションからのアクセスのみ許可するものです。
{
"Version": "2012-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::MY-S3-BUCKET/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::XXXXXXXXXXXX:distribution/E1EBU8ZHB6N3Q9"
}
}
}
]
}
-
Principal.Serviceに cloudfront.amazonaws.com を指定 -
Condition.StringEquals.AWS:SourceArnに対象のCloudFrontディストリビューションARNを指定 -
これにより「このCloudFrontからのリクエストのみ許可」となる
結果
この方法を適用すると:
-
S3は依然として閉域(非公開) のまま
-
CloudFrontからのリクエストだけがS3に到達できる
-
ユーザーはCloudFrontのエンドポイント経由でのみコンテンツを取得
つまり、パブリックアクセス不要でセキュアに配信できる という仕組みが完成します。
まとめ
本記事では、S3を閉域のままCloudFront経由で配信する方法 を解説しました。
-
パブリックアクセスを一切許可しないのでセキュリティが高い
-
SCPで「S3パブリック禁止」が設定されていても利用可能
-
バケットポリシーにCloudFrontのサービスプリンシプルとARNを指定するだけで構築可能
S3をセキュアに利用したい企業や組織では、この「S3閉域アクセスプリンシプル」を理解しておくと非常に役立ちます。
補足情報OAI と OAC の違い
従来は OAI (Origin Access Identity) を利用してCloudFrontからS3へアクセスする方法が一般的でした。
しかし現在は、より柔軟でセキュアな OAC (Origin Access Control) が推奨されています。
本記事で紹介している「サービスプリンシプル(cloudfront.amazonaws.com)+SourceArn条件」は、OACベースの最新のベストプラクティス です。