CloudFront + S3で発生する「AccessDenied」エラーの原因と対策

CloudFrontS3 を組み合わせて静的ウェブサイトを公開する構成は、信頼性と高速性に優れており、多くのエンジニアに採用されています。
しかし、ブラウザでアクセスした際に以下のようなエラーが表示され、うまく公開できないというトラブルがよく発生します。

<Error>
  <Code>AccessDenied</Code>
  <Message>Access Denied</Message>
</Error>

この「AccessDenied」エラーは、S3バケットアクセス許可に問題がある場合に発生します。
本記事では、その原因対策方法を具体的に解説し、設定例も交えて、同じトラブルに悩むエンジニアの助けとなる情報を提供します。

よくある原因

CloudFrontからS3へのアクセス権限が適切に設定されていない

CloudFrontはデフォルトではS3バケットにアクセスできません。
アクセスを許可するには、S3のバケットポリシーを適切に設定する必要があります。

特に近年では、オリジンアクセスコントロール(OAC)を利用して、署名付きリクエストを経由する構成が推奨されています。
この場合、S3側ではサービスプリンシパル cloudfront.amazonaws.com を許可し、CloudFrontディストリビューションARNを指定する必要があります。

バケットポリシーの設定例(OAC利用時)

以下は、CloudFrontS3バケット内のオブジェクトを取得するためのバケットポリシーの例です。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowCloudFrontAccess",
      "Effect": "Allow",
      "Principal": {
        "Service": "cloudfront.amazonaws.com"
      },
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::バケット名/*",
      "Condition": {
        "StringEquals": {
          "AWS:SourceArn": "arn:aws:cloudfront::アカウントID:distribution/ディストリビューションID"
        }
      }
    }
  ]
}

ここで重要なのは、リソース(Resource)と条件(Condition)に指定するARNが正確であることです。
特に AWS:SourceArn に指定するCloudFrontディストリビューションのARNは、AWSコンソールから正しく取得してください。

確認すべきその他のポイント

S3のパブリックアクセス設定

S3バケットに対してパブリックアクセスを完全にブロックしておくのが推奨される構成です。
バケットの設定画面で以下の項目がすべて有効になっていることを確認してください。

  • 新しいアクセス許可をブロック
  • 既存のパブリックバケットポリシーをブロック

この状態でCloudFront経由でのみアクセスを許可するようにすることで、セキュリティを保ちながら配信が可能になります。

CloudFrontオリジンの設定

CloudFrontのオリジンには、S3バケットの通常のエンドポイントバケット名.s3.amazonaws.com)を使用します。
ウェブサイトホスティング用のエンドポイントs3-website- で始まるもの)は使用しないようにしましょう。

CloudFrontのキャッシュ無効化

設定を変更しても、CloudFrontが過去の状態をキャッシュしていることがあります。
キャッシュをクリアするには、CloudFrontの管理画面から「キャッシュ削除」を実行してください。

エラーを解決するための確認リスト

  • バケットポリシーcloudfront.amazonaws.com を明示し、SourceArn も正しく設定しているか?
  • S3パブリックアクセスブロックが有効になっているか?
  • CloudFrontオリジン設定s3.amazonaws.com 形式になっているか?
  • キャッシュの無効化を実行しているか?
  • CloudFrontのログまたはS3のアクセスログでリクエストの状況を確認できているか?

トラブル対応の実装例

以下は、CloudFront経由でS3にあるHTMLファイルを配信する前提での手順例です。

CloudFrontのオリジンをS3バケットに設定(署名付きURLを有効)

オリジンタイプ: S3 バケット
署名付きURLまたは署名付きCookie: 使用する
オリジンアクセスコントロール: 作成済みOACを指定

バケットポリシーを設定(上述のJSON形式)

CloudFrontディストリビューションのARNを正しく設定し、バケットへの s3:GetObject アクションを許可します。

ブラウザで確認する前にキャッシュをクリア

CloudFrontの管理画面で以下を実行。

キャッシュ削除 > キャッシュ削除を作成
対象パス: /*

まとめ

CloudFrontS3 を組み合わせた構成で「AccessDenied」エラーが発生する場合、ほとんどはバケットポリシーの設定ミスまたはCloudFront側の設定不足によるものです。
とくに、オリジンアクセスコントロール(OAC)を利用する構成では、cloudfront.amazonaws.com を明示し、正しい ARN を指定することが非常に重要です。

セキュリティと機能性を両立した静的サイト公開の構成は基礎中の基礎です。
本記事がトラブル解決の一助となれば幸いです。

問題が再発しないよう、設定の記録手順の標準化も併せて行うことを強くおすすめします。


Amazonベストセラー

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA