

S3バケットポリシー、公開/IP制限/CloudFront限定の3パターン
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
S3バケットの公開範囲を制御するバケットポリシー、パターンとしてよく使うのは大きく3つ。全公開、特定IPからのみ許可、CloudFront経由のみ許可。それぞれのポリシー例をメモしておく。
全公開
{ "Version": "2008-10-17", "Id": "AccessRestriction", "Statement": [ { "Sid": "PublicAccess", "Effect": "Allow", "Action": "s3:GetObject", "Principal": { "AWS": "*" }, "Resource": "arn:aws:s3:::example-bucket/*" } ]}Principal を * にして条件も付けないので、誰でもオブジェクトを取得できる状態になる。静的サイトのホスティングなど、そもそも全公開が前提の用途向け。バケット側のBlock Public Accessを個別にオフにしないとこのポリシー自体が効かないので注意。
特定IPからのみ許可
{ "Version": "2008-10-17", "Id": "AccessRestriction", "Statement": [ { "Sid": "IPRestriction", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::example-bucket/*", "Condition": { "IpAddress": { "aws:SourceIp": "xxx.xxx.xxx.xxx/32" } } } ]}aws:SourceIp の条件でアクセス元を絞る。社内ネットワークなど固定IPからの直接アクセスだけ許可したい場合に使う。CloudFrontを経由させる構成には向かない。CloudFrontのIPレンジは変動するので、経由アクセスを制限したいなら次のパターンの方が適切。
CloudFront経由のみ許可(OAI)
{ "Version": "2008-10-17", "Id": "AccessRestriction", "Statement": [ { "Sid": "OriginAccessIdentityForCloudFront", "Effect": "Allow", "Action": "s3:GetObject", "Principal": { "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXXXXX" }, "Resource": "arn:aws:s3:::example-bucket/*" } ]}CloudFrontのOrigin Access Identity(OAI)をPrincipalに指定して、CloudFront経由のリクエストだけ許可する形。バケットを直接公開せず、必ずCloudFrontを通させたい場合の定番パターン。CloudFrontコンソールでOAIをオリジンに紐付ける際、このポリシーは自動生成でき、手動で書く必要はほぼない。
使い分け
- 全公開: 静的サイトなどそもそも誰でも見られていい内容
- IP制限: 固定IPからの直接アクセスのみ許可したい場合
- CloudFront限定(OAI): バケットを非公開にしたままCDN経由でのみ配信したい場合
構成によって使うパターンが変わるので、要件に応じて選ぶ。