S3を使用したAmazon Cloudfront。アクセスが拒否されました


91

Cloudfrontを介してS3バケットを配布しようとしていますが、何らかの理由で唯一の応答は次のようなAccessDenied XMLドキュメントです。

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>89F25EB47DDA64D5</RequestId>
    <HostId>Z2xAduhEswbdBqTB/cgCggm/jVG24dPZjy1GScs9ak0w95rF4I0SnDnJrUKHHQC</HostId>
</Error>

使用している設定は次のとおりです。

配信設定 原点設定

そして、これがバケットのポリシーです

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity *********"
            },
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::x***-logos/*"
        }
    ]
}

キャッシュ動作設定-imgur.com/JBZqrRm
ジョーダンアダムス

CloudfrontがS3バケットから読み取れることを確認してください。
ネイサンC 14年

これを有効にするにはどうすればよいですか?
ジョーダンアダムス

原点設定、最後のオプション。スクリーンショットをご覧ください。:)
ネイサンC

私はこれを以前に試したがうまくいかなかったと思うが、もう一度変更したばかりで、配布中だ。バケットのポリシーを投稿に追加します:)
ジョーダンアダムス

回答:


91

CloudFrontディストリビューションのルートにアクセスしている場合、デフォルトのルートオブジェクトを設定する必要があります:http : //docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/DefaultRootObject.html

CloudFrontコンソールを使用してデフォルトのルートオブジェクトを指定するには:

  • AWSマネジメントコンソールにサインインし、https: //console.aws.amazon.com/cloudfront/でAmazon CloudFrontコンソールを開きます

  • 上部ペインの配布リストで、更新する配布を選択します。

  • 配布詳細ペイン、上全般 ]タブをクリックし、[編集]を

  • [ 配布編集 ]ダイアログボックスの[ デフォルトルートオブジェクト]フィールドに、デフォルトルートオブジェクトのファイル名を入力します。

    たとえば、オブジェクト名のみを入力しますindex.html。オブジェクト名の前に/を追加しないでください。

  • 変更を保存するには、[ はい、編集します]をクリックします。


私の場合、この設定は問題を解決していません。アクセス拒否エラーがまだ発生しています
KurioZ7

53

私はちょうど同じ問題を抱えており、Koushaの答えはルートパスのindex.htmlの問題を解決しますが、私の問題はindex.htmlと組み合わせて「きれいなURL」を取得するサブディレクトリにもありました(例「ugい」example.com/something.htmlではなく.com / something /

CloudFrontディストリビューションをセットアップすると、選択できるS3バケットが提供されるため、部分的にはAmazonの障害でもありますが、そのうちの1つを選択すると、バックエンドとして静的なWebサイトホスティングURLではなくバケットURLが使用されます。

したがって、問題を修正するには:

  • バケットの静的ウェブサイトホスティングを有効にする
  • インデックス(およびおそらくエラー)ドキュメントを適切に設定します
  • エンドポイント URLのコピー-上記の設定の横にあります- <bucket.name> .s3-website- <aws-region> .amazonaws.comのようになります。
  • そのURLをCloudFrontディストリビューションのオリジンとして使用します。(これにより、CF Default Root Objectの設定も不要になりますが、とにかく設定するのに害はありません)

このコメントの日付時点で完璧な答え。
サイラマチャンドラン

私にとってもそうでした。すでに別のWebサイトが機能していて、新しいWebサイトを同じように構成したと思いました。これは見過ごされがちです。
ギュンターエベル

また、パブリックのGetObjectおよびListObjects権限をバケットに追加する必要があります。
ジョルジュ

8

@Cezzと同じ問題がありましたが、私の場合は解決しませんでした。

バケットの静的ウェブサイトホスティングが有効になるとすぐに、ユーザーがCloudfront URLまたはS3 URLのいずれかを介してコンテンツにアクセスできることを意味しますが、これは必ずしも望ましいとは限りません。たとえば、私の場合、CloudfrontディストリビューションはSSL対応であり、ユーザーは非SSL接続を介してアクセスできません。

私が見つけた解決策は:

  • S3バケットで静的なウェブサイトホスティングを無効にしておく
  • Cloudfront配布元をS3 IDとして保持する
  • [バケットへのアクセスを制限]を[はい]に設定します(簡単に、CloudFrontがバケットポリシーを自動的に更新できるようにします)
  • 「エラーページ」で、カスタムレスポンスを作成し、エラーコード「403:Forbidden」を目的のレスポンスページ(/index.html、レスポンスコード200)にマッピングします。

ただし、私の場合、すべてのパスがindex.htmlによって解決される単一ページのJavaScriptアプリケーションを提供しています。S3バケット内の異なるオブジェクトに解決するパスがある場合、これは機能しません。


1
ご回答有難うございます。これは私のために働いた。私はあなたと同じ問題を抱えていました。S3バケットにアクセスしてほしくないので、S3オリジンへのアクセスを制限する必要がありました。これは、Cloudfrontのオートコンプリートによって提案されたオリジンを入力するときにのみ機能します。ただし、静的なWebサイトホスティングを無効にする必要はありません。パブリックアクセスを許可するバケットポリシーを削除するだけで十分です。
トーステン

これは本当に役に立ちました。禁止メッセージはS3から来ていますが、最初は気づかなかったので、SPAが機能するようにカスタムエラーページでキャッチする必要があります。
イヴァン

4

私の場合、S3バケットのOrigin Pathとともに「Path Pattern」ビヘイビアを持つ複数のオリジンを使用していました。

悪いセットアップ:

CloudFrontの動作: /images/*->My-S3-origin

My-S3-origin:起点パス: /images

S3ファイル:/images/my-image.jpg

GETリクエスト:/images/my-image.jpg-> 403

何が起こっていたかというと、CloudFront GETリクエスト全体がorigin:/image/my-image.jpgにOrigin Path:というプレフィックスを付け/imagesて送信されるため、S3へのリクエスト/images/images/my-image.jpgは存在しないように見えます。

解決

Origin Pathを削除します。

これにより、元のアクセスIDとバケットのアクセス許可および個々のファイルのアクセス許可を制限して、バケットにアクセスできました。


1

私の場合、Route 53を誤って設定していました。ドメインでエイリアスを作成しましたが、CloudFrontディストリビューションではなくS3バケットを指定していました。

また、デフォルトのルートオブジェクトを省略しました。コンソールは、省略した場合の潜在的な結果について疑問符のテキストに少し情報を追加すると、本当に改善される可能性があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.