S3バケットポリシー、公開/IP制限/CloudFront限定の3パターン

  • AWS
  • S3

この記事は、構成と文章の整理に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経由でのみ配信したい場合

構成によって使うパターンが変わるので、要件に応じて選ぶ。