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
にリダイレクトされます。これを無効にするにはどうすればよいですか?
あなたの質問を支援するために、私は次の方法で状況を再現しました。
バケットを確認しましたが、CloudFrontはあなたに似たバケットポリシーを追加していました。
ディストリビューションはしばらくIn Progress
としてマークされました。 Enabled
と言ったら、xxx.cloudfront.net
URLからファイルにアクセスしました。
xxx.cloudfront.net/public.jpg
redirectedS3 URL http://bucketname.s3.amazonaws.com/public.jpg
にリダイレクトします。はい、ファイルを見ることができましたが、リダイレクトを使用するべきではありません。xxx.cloudfront.net/private.jpg
redirected私も、S3のプライベートファイルであるため、Access Denied
を受け取りました。その後、いくつかの research を実行しましたが、これは非常によくあることです。 CloudFrontディストリビューションを静的なホストWebサイトURLにポイントすることで回避策を使用する人もいますが、これには、Origin Access Identityで動作しないという欠点がありますまた、「エッジへの無料のS3トラフィック」の割引は受けられないと思います。
だから、私は一晩待って、今朝それをテストし、すべてが正常に動作しています。
一番下の行:たとえENABLED
と書かれていても、うまくいくまでに数時間(例、一晩)かかります。文書化されたとおりに動作します。
オリジンドメイン名にデフォルトのs3バケットを選択する代わりに、<bucket-name>.s3-website.<region>.amazonaws.com
配信元ドメイン名として(このURLは、S3バケットプロパティの下の静的Webサイトホスティングプロパティで取得できます)。
CloudFront 'Distribution Settings'のGeneralタブの下にあるDefault Root Object
に 'index.html'を追加しました。 index.htmlは私のプロジェクトのルートファイルだったので!
私の場合、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を削除します。