エラー内容
CloudFrontから静的Webサイトホスティングのサイトに対して設定しているところで
CloudFrontのディストリビューション名からアクセスしたら「Access Denied」となった。
現状
やりたいこと!
・OACを用いてCloudFrontからS3へアクセスし、Webサイトアクセスを成功させること
・Route53にてディストリビューション名をドメイン解決させること(済)
現状わかっていること!
・CloudFrontからS3へのアクセスが「Deny」状態であること
・S3のオブジェクトURLからはアクセスできており、閲覧できている(OAC設定前)
思い当たる節
バケットポリシーの許可範囲について
まず最初にバケットポリシーを確認したが、下記の通りに設定しており
CloudFrontからのアクセスがされるように設定してある。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCloudFrontServicePrincipal",
"Effect": "Allow",
"Principal": {
"Service": "cloudfront.amazonaws.com"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::XXXXXXXXX/*",
"Condition": {
"StringEquals": {
"AWS:SourceArn": "arn:aws:cloudfront::XXXXXXXXXX:distribution/XXXXXXXXXX"
}
}
}
]
}
CloudFrontのオリジンの設定にミス?
CloudFrontのオリジン設定が「Webサイトエンドポイント」ではなく「S3のオブジェクトURI」になっている可能性
(参考)公式サイト
CloudFront のオリジンとして Amazon S3 バケットを指定する場合は、次の形式を使用することをお勧めします。
bucket-name.s3.region.amazonaws.com
• Webサイトエンドポイントを指定している場合
http://<bucket-name>.s3-website-ap-northeast-1.amazonaws.com
• S3のエンドポイントを指定している場合
<bucket-name>.s3.ap-northeast-1.amazonaws.com
#### OAC設定不備?
OACとは?
CloudFrontからオリジンサーバーへのリクエストに署名を追加することで、アクセスを制御します。オリジンサーバーは、この署名を検証することで、CloudFront からのリクエストであることを確認し、許可されたリクエストのみに応答します。
OACの設定についてはオリジン設定時に設定している
OACの設定(ディストリビューションにも紐づいている)
2025/2/12修正
Webサイトホスティングをオリジンとしている場合、OACは使用できないことがわかったため取り消し
原因
原因はフルパスでの指定でアクセスしていなかったこと。
今までは以下の通りにブラウザからアクセスしていた
https://<ディストリビューション名>
しかし、以下のようにアクセスしなければいけなかった
https://<ディストリビューション名>/index.html
一体なぜ・・・?
個人的にはS3バケットのルート配下にはindex.htmlを置いているため、フルパスで指定する必要はないのかと思っていた。
もちろんこちらの設定は必要だが、CloudFront側からS3バケットへアクセスするときに存在するパスを指定しておかなければいけなかった。
修正対応
ディストリビューションの設定にあるデフォルトルートオブジェクトの設定不足だったため修正!
設定不足だとしてもなぜパスを指定する必要があるのか?
CloudFrontは、リクエストされたパスに基づいて S3 内のオブジェクトを探すとのことで、ディストリビューション名だけでアクセスした場合、CloudFrontはどのファイルを返すか判断できない。
デフォルトルートオブジェクトが設定されていれば、index.htmlが返されるが設定していない場合は403 エラーとなる。
以上、無事解決とともに引き続き理解深める!ありがとうございました。