0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CloudFrontでAccessDeniedになりS3にアクセスできない

Last updated at Posted at 2025-02-09

エラー内容

CloudFrontから静的Webサイトホスティングのサイトに対して設定しているところで
CloudFrontのディストリビューション名からアクセスしたら「Access Denied」となった。
image.png

現状

今回の構成
image.png

やりたいこと!
・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

これは問題なさそう・・
image.png

#### OAC設定不備?

OACとは?

CloudFrontからオリジンサーバーへのリクエストに署名を追加することで、アクセスを制御します。オリジンサーバーは、この署名を検証することで、CloudFront からのリクエストであることを確認し、許可されたリクエストのみに応答します。

OACの設定についてはオリジン設定時に設定している

OACの設定(ディストリビューションにも紐づいている)
2025/2/12修正
Webサイトホスティングをオリジンとしている場合、OACは使用できないことがわかったため取り消し

原因

原因はフルパスでの指定でアクセスしていなかったこと。

今までは以下の通りにブラウザからアクセスしていた
https://<ディストリビューション名>

しかし、以下のようにアクセスしなければいけなかった
https://<ディストリビューション名>/index.html

一体なぜ・・・?

個人的にはS3バケットのルート配下にはindex.htmlを置いているため、フルパスで指定する必要はないのかと思っていた。

【実際のS3設定】
S3のインデックスドキュメント
image.png

S3バケットのルート配下
image.png

もちろんこちらの設定は必要だが、CloudFront側からS3バケットへアクセスするときに存在するパスを指定しておかなければいけなかった。

修正対応

image.png

ディストリビューションの設定にあるデフォルトルートオブジェクトの設定不足だったため修正!

設定不足だとしてもなぜパスを指定する必要があるのか?

CloudFrontは、リクエストされたパスに基づいて S3 内のオブジェクトを探すとのことで、ディストリビューション名だけでアクセスした場合、CloudFrontはどのファイルを返すか判断できない。
デフォルトルートオブジェクトが設定されていれば、index.htmlが返されるが設定していない場合は403 エラーとなる。

以上、無事解決とともに引き続き理解深める!ありがとうございました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?