S3リダイレクトを使用したAmazon Cloudfront


10

比較的簡単なことをしようとしています。いくつかのドメインとサブドメインをセットアップして、サイトのコアドメインにリダイレクトしたいのですが、リダイレクトをCloudfrontに配置したいと思います。ルートパスのリダイレクト以外はすべて機能します。これにより、S3バケットを部分的に説明するXMLファイルが取得されます。

バックグラウンド

S3

S3では、次のような全リダイレクトバケット設定できます。

Redirect all requests setupを使用したS3

これをテストすると、Webエンドポイント(brass9-com.s3-website-us-west-1.amazonaws.com)は、本来あるべきことを実行します-brass9.comにリダイレクトします。良い。

クラウドフロント

CloudfrontではS3バケットを指すことができますが、そうするように提案されている方法は間違っています。bras9-com.s3.amazonaws.comのように、バケットをその名前で指すのではなく、上記のWebエンドポイントを使用する必要があります。それ以外は、すべてをデフォルトのままにして、良好なリダイレクト動作を得ることができます。したがって、www.brass9.com / portfolioのようなパスは、適切な場所に正しくリダイレ​​クトされます。また良い。

問題-ルートドメインのリダイレクト

その後、機能しないのは、単純なwww.brass9.comからリダイレクトすることです。リダイレクトを取得する代わりに、次の奇妙な結果を取得します。

<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<Name>brass9-com</Name><Prefix></Prefix>
<Marker></Marker><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated>
</ListBucketResult>

OK... 。したがって、これは完全に予期されることではありません。デフォルトルートオブジェクトがないためです。しかし、この動作を防ぐために、どのデフォルトルートオブジェクトを指定できるでしょうか。指し示す必要があるS3リダイレクトオブジェクトがある場合、その名前は何ですか?または、他に適切な構成がありますか、これは、Amazonが修正する必要があるCloudfrontとS3の相互作用のバグにすぎませんか?

機能しない既知のソリューション:デフォルトのルートオブジェクト

index.htmlのデフォルトルートオブジェクトを指定することは可能ですが、それは何の助けにもなりません-問題を変更するだけです。代わりに、CloudfrontのURLは、404であるメインサイトの/index.htmlにリダイレクトします(index.htmlファイルは使用せず、サーバー側のフレームワーク駆動型サイトです)。index.htmlをサーバーに配置することもできますが、そもそもCloudfrontを使用することによるわずかな速度の向上に勝るものはありません。

同様の質問

1つの質問が似たような質問をしますが、なんらかの理由で、XML応答ではなく、何らかの理由で空白の0バイトの応答が返されます。その問題や解決策に関する質問は含まれていません。

関連記事

ある記事では、ベアドメインとwwwドメインの両方でサイト全体を提供することを提案しています。これは、ユーザーのブックマーク、検索ランキングなどに影響します。これを行うべきではありません。

リダイレクト方式ではなく、S3とCloudfront静的Webサイトをホストすることについて議論しているものもあり、関係はありません。

それで、これを適切に行うにはどうすればよいですか?

Cloudfront構成のスクリーンショット-デフォルトルートオブジェクトがなく、S3の起点を指しています。InProgressを無視-テストのためにデフォルトルートオブジェクトのオンとオフを切り替えました。

S3を指すデフォルトのルートオブジェクトがないCloudfrontディストリビューション

そしてそのディストリビューションのOrigin設定:

原点-S3を指し、デフォルト


1
すべてをリダイレクトするように構成されたWebサイトのエンドポイントへの要求は、ルートを含めて、まさに「すべき」です。そのリダイレクトバケットにバケットポリシーがありますか?聞こえるかもしれませんが、そうすべきではありません。またGET /、Webエンドポイントを使用するように構成を修正する前から、Cloudfrontからキャッシュされた応答が表示されていた可能性があるようにも思えます。
マイケル-sqlbot 2014

1
CFの構成を複数回無効にして変更したにもかかわらず、実際にはキャッシュされたListBucket応答がS3に残っています。片付けるには1時間か4時間かかります。@ Michael-sqlbotコメントを回答として投稿した場合、承諾済みとしてマークできます。
Chris Moschini、2014

回答:


4

この問題がある場合は、まずクラウドフロントのs3バケットオリジンを設定するときに確認してください。オートコンプリートは、このListBucketResultレスポンスを返すs3 RESTエンドポイント domain.amazonaws.comを返します

ウェブサイトのエンドポイントdomain.s3-website-region.amazonaws.comを手動で書き留める必要があります

重要: RESTエンドポイントでcloudfrontを誤って構成した場合は、無効化によってキャッシュを無効にする必要があります。そうしないと、REST応答が返され続けます。


キャッシュの無効化に関するメモは、数日間追跡してきた問題を解決するのに役立ちました。ありがとうございました!
ネイト

どうもありがとう!Terraformユーザーの場合origin、ディストリビューションのブロックaws_s3_bucket.BUCKET.website_endpointで、domain_name(ではなくbucket_regional_name)を使用してcustom_origin_configブロックを追加します。
dusan

あなたは命の恩人です!配布設定を変更していても、この問題に最後の日は苦労しており、ListBucketResult XMLを取得し続けました。最後に、ディストリビューションを削除し、domain.s3-website-region.amazonaws.comを指す新しいディストリビューションを作成した後、リダイレクトが機能しました。
Dale Zak

2

解決策:質問に記載されているようにリダイレクトを設定してから、S3とCloudFrontのキャッシュ時間を待ちます。彼らは4時間以上になる可能性があるので、あなたはそれをすべて設定してから待って最高のものを期待する必要があります。

(これはコメントからのマイケルの解決策ですが、それは今では年月であり、これは本当に回答済みとマークされるに値します)。


0

コメントできないので回答として書いています-http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/DistributionConfigDatatype.html#DistributionConfigDatatype_Elementsのドキュメントから、デフォルトのルートオブジェクトが空になっているようです:

ディストリビューションを作成するときにデフォルトのルートオブジェクトを指定したくない場合は、空のDefaultRootObject要素を含めます。


できます(ただし、一部のAPIライブラリでは禁止されています)。ただし、空白のデフォルトルートオブジェクトを使用すると、質問に表示されるとんでもないListBucketResult XML応答が返されます。
Chris Moschini、2014
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.