web-dev-qa-db-ja.com

S3バケットへのAWS CloudFrontアクセスが拒否されました

S3バケットでホストされている静的ファイルを提供するためにCloudFrontをセットアップしようとしています。セットアップの配布はありますが、S3バケット内のCSS(/CSS/stlyle.css)ファイルを参照しようとするとAccessDeniedが返されます。

<Error>
    <Code>AccessDenied</Code>
    <Message>Access Denied</Message>
    <RequestId>E193C9CDF4319589</RequestId>
    <HostId>
xbU85maj87/jukYihXnADjXoa4j2AMLFx7t08vtWZ9SRVmU1Ijq6ry2RDAh4G1IGPIeZG9IbFZg=
    </HostId>
</Error>

CloudFrontディストリビューションをS3バケットに設定し、S3バケットに自動的に追加された新しいOrigin Access Identity policyを作成しました。

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

私は何か見落としてますか?

このS3バケット内のすべてのファイルをCloudFront経由で提供したい...

*更新*

このクラウドフロント ガイド 言う:

デフォルトでは、Amazon S3バケットとその中のすべてのオブジェクトはプライベートです。バケットを作成したAWSアカウントのみが、その中のオブジェクトの読み取りまたは書き込みのアクセス許可を持っています。 CloudFront URLを使用してAmazon S3バケット内のオブジェクトに誰でもアクセスできるようにするには、オブジェクトにパブリック読み取りアクセス許可を付与する必要があります。 (これは、CloudFrontとAmazon S3を使用する際の最も一般的な間違いの1つです。AmazonS3バケット内の各オブジェクトに明示的に権限を付与する必要があります。)

これに基づいて、S3バケット内のすべてのオブジェクトにEveryone Read/Downloadの新しい権限を追加しました。これで、ファイルにアクセスできます。

しかし、https://d3u61axijg36on.cloudfront.net/css/style.cssのようなファイルにアクセスすると、S3 URIとHTTPにリダイレクトされます。これを無効にするにはどうすればよいですか?

25
Primoz Rome

あなたの質問を支援するために、私は次の方法で状況を再現しました。

  • バケットポリシーなしでAmazon S3バケットを作成しました
  • public.jpgをアップロードし、「公開する」で公開します
  • private.jpgをアップロードし、非公開にしました
  • Amazon CloudFrontウェブディストリビューションを作成しました
    • 元のドメイン名:リストからS3バケットを選択しました
    • バケットアクセスの制限:はい
    • Origin Access Identity:新しいIDを作成
    • バケットの読み取り許可を付与:はい、バケットポリシーを更新

バケットを確認しましたが、CloudFrontはあなたに似たバケットポリシーを追加していました。

ディストリビューションはしばらくIn Progressとしてマークされました。 Enabledと言ったら、xxx.cloudfront.net URLからファイルにアクセスしました。

  • xxx.cloudfront.net/public.jpgredirectedS3 URL http://bucketname.s3.amazonaws.com/public.jpgにリダイレクトします。はい、ファイルを見ることができましたが、リダイレクトを使用するべきではありません。
  • xxx.cloudfront.net/private.jpgredirected私も、S3のプライベートファイルであるため、Access Deniedを受け取りました。

その後、いくつかの research を実行しましたが、これは非常によくあることです。 CloudFrontディストリビューションを静的なホストWebサイトURLにポイントすることで回避策を使用する人もいますが、これには、Origin Access Identityで動作しないという欠点がありますまた、「エッジへの無料のS3トラフィック」の割引は受けられないと思います。

だから、私は一晩待って、今朝それをテストし、すべてが正常に動作しています

一番下の行:たとえENABLEDと書かれていても、うまくいくまでに数時間(例、一晩)かかります。文書化されたとおりに動作します。

35
John Rotenstein

オリジンドメイン名にデフォルトのs3バケットを選択する代わりに、<bucket-name>.s3-website.<region>.amazonaws.com配信元ドメイン名として(このURLは、S3バケットプロパティの下の静的Webサイトホスティングプロパティで取得できます)。

6
uday reddy

CloudFront 'Distribution Settings'のGeneralタブの下にあるDefault Root Objectに 'index.html'を追加しました。 index.htmlは私のプロジェクトのルートファイルだったので!

4
Zohab Ali

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

悪いセットアップ:

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

My-S3-Origin:Origin Path:/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を削除します。

2
Scott Jungwirth