スキップしてコンテンツを表示

CloudFrontからS3に保存されている画像を取得すると403 アクセス拒否エラーが返却される

0

ローカル環境(http://localhost:3000/)からS3に保存されている画像をCloudFront経由で取得したい。 以前同様の実装を行った際は正常に画像を取得できていたが、新しく作成したバケットから画像を取得した際に、403アクセス拒否エラーで画像の取得に失敗している。

<設定>

  1. CloudFront ・Origin Domain:<S3バケット名>.ap-northeast-1.amazonaws.com ・Origin Path:/<パス名> ・オリジンアクセス:Origin access control settings (recommended) ・Origin access control:<my oac>.s3.ap-northeast-1.amazonaws.com ・Enable Origin Shield:いいえ

  2. S3 ・ブロックパブリックアクセス:オン ※ユーザが画像アップロードする際、S3の署名付きURLを発行している。

<試したこと>

  1. OACの設定 S3 バケットポリシーで s3:GetObject へのアクセスを許可を設定。

◾️バケットポリシー

          {
            "Sid": "ImageFromCloudFront",
            "Effect": "Allow",
            "Principal": {
                "Service": "cloudfront.amazonaws.com"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::<my-bucket>/*”,
            "Condition": {
                "StringEquals": {
                    "AWS:SourceArn": "arn:aws:cloudfront::<アカウントID>:distribution/<ディストリビューションID>"
                }
            }
        }
  1. CloudFrontのキャッシュ削除 (/*)でCloudFrontのキャッシュを削除

  2. ブラウザのキャッシュ削除

3回答
0

403エラーが発生している原因として、いくつかの可能性が考えられます。

まず、CloudFrontとS3の設定を確認しましょう。あなたの設定では、CloudFrontのオリジンとしてS3のREST APIエンドポイント(<S3バケット名>.ap-northeast-1.amazonaws.com)を使用しており、Origin Access Control (OAC)を設定されています。これは正しいアプローチです。

考えられる問題点と解決策:

  1. S3バケットポリシーの確認: バケットポリシーは正しく設定されているようですが、Resource部分が正確に設定されているか確認してください。特にOrigin Pathを設定している場合、そのパスも含めたリソースへのアクセス権が必要です。

  2. Origin Pathの設定: CloudFrontで設定したOrigin Path(/<パス名>)が、実際にS3バケット内に存在するパスと一致しているか確認してください。CloudFrontはこのパスを自動的にリクエストに追加するため、不正確な場合は403エラーが発生します。

  3. S3バケットの静的ウェブサイトホスティング: S3の静的ウェブサイトホスティングが有効になっている場合、OACと互換性がありません。OACを使用する場合は、静的ウェブサイトホスティングを無効にする必要があります。

  4. CloudFrontのキャッシュ動作設定: CloudFrontのキャッシュ動作設定で、適切なHTTPメソッド(少なくともGET、HEAD)が許可されているか確認してください。

  5. OACの設定確認: CloudFrontコンソールでOACが正しく設定されているか確認し、必要に応じて再作成してください。

  6. S3オブジェクトの権限: アップロードされた画像のACLが適切に設定されているか確認してください。バケット所有者が強制されている場合は、オブジェクトのACLが問題になることはありません。

これらの設定を確認しても問題が解決しない場合は、CloudFrontのエラーログを確認して、より詳細なエラー情報を取得することをお勧めします。
Sources
HTTP 403 status code (Permission Denied) - Amazon CloudFront
Cloudfront cannot access s3 bucket | AWS re:Post
Access Denied for CloudFront to S3 static site | AWS re:Post

回答済み 7ヶ月前
0

上記を確認したましたが、いずれも問題なく設定されています。

下記がCloudFrontのエラーログです。

#Version: 1.0
#Fields: date	time	x-edge-location	sc-bytes	c-ip	cs-method	cs(Host)	cs-uri-stem	sc-status	cs(Referer)	cs(User-Agent)	cs-uri-query	cs(Cookie)	x-edge-result-type	x-edge-request-id	x-host-header	cs-protocol	cs-bytes	time-taken	x-forwarded-for	ssl-protocol	ssl-cipher	x-edge-response-result-type	cs-protocol-version	fle-status	fle-encrypted-fields	c-port	time-to-first-byte	x-edge-detailed-result-type	sc-content-type	sc-content-len	sc-range-start	sc-range-end
2025-07-13	03:18:18	NRT20-P6	484	[CLIENT_IP_ADDRESS]	GET	<ドメイン名>	/プレフィックス1/プレフィックス2/プレフィックス3/IMG_0706.jpeg	403	-	node	-	-	Error	<リクエストID>	<ドメイン名> 	https	262	0.072	-	TLSv1.3	TLS_AES_128_GCM_SHA256	Error	HTTP/1.1	-	-	<クライアントPORT>	0.072	Error	application/xml	-	-	-
回答済み 7ヶ月前
0

AWS WAFをCloudFrontに紐づけているということはないでしょうか?
S3のパスなどが正しい場合に403ではじかれる原因としてはS3のバケットポリシーでOACが許可されていないかAWS WAFでブロックされているということがよくあります。
https://repost.aws/ja/knowledge-center/cloudfront-troubleshoot-403-errors

エキスパート
回答済み 7ヶ月前

ログインしていません。 ログイン 回答を投稿する。

優れた回答とは、質問に明確に答え、建設的なフィードバックを提供し、質問者の専門分野におけるスキルの向上を促すものです。

関連するコンテンツ