web-dev-qa-db-ja.com

CloudFront + S3 Webサイト:暗黙的なインデックスドキュメントを表示する必要がある場合、「指定されたキーは存在しません」

静的WebサイトをAmazon S3にデプロイしましたが、現在ここで表示できます: http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/

記事のリンクのいずれかをクリックすると、次のエラーが表示されます。

S3 Error

S3は、ファイルが存在しないことを訴えています。さて、ここで奇妙な点があります-私は自分のドメインでCloudFrontを使用しています。そのため、その記事のリンクをクリックすると、CloudFrontにリクエストが送信され、CloudFrontはS3バケットからファイルを取得しようとします。

ただし、S3から同じURLに直接アクセスする場合、たとえば: http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/2015/building-a-heroku- addon-planning / ページは正常にロードされます。

ここで翻訳中に何かが失われているようです。

誰も私の設定を修正するために私ができることの提案を受けましたか?

36
rdegges

私は手足に出て、指定されたキーが存在しないと言います技術的にですので、エラーメッセージは技術的に正確ですが、全体を語っていません。これは簡単な修正方法です。

S3バケットには、2つのエンドポイント、「REST」と「ウェブサイト」があります。これらには2つの異なる機能セットがあります。 Webサイトのエンドポイントは、インデックスドキュメントの魔法のような解決策を提供します(たとえば、index.htmlは、提供された例では実際にブラウザに返されるはずです)RESTエンドポイントは提供しません。

Webサイトのホスティングに使用されるバケットの前にCloudFrontを構成する場合、通常、ドロップダウンリストからバケット名を選択して「S3」オリジンとしてオリジンを構成する必要はありません。代わりに、「カスタム」オリジンとして設定し、S3コンソールで提供されるWebサイトエンドポイントホスト名(例:example-bucket.s3-website-us-east-1...)を使用します。それ以外の場合、CloudFrontはRESTバケットのエンドポイント(認証およびプライベートコンテンツを許可しますが、Webサイトエンドポイントは許可しません)。

重要

リストからバケットの名前(example.com.s3.amazonaws.comなど)を選択しないでください。

http://docs.aws.Amazon.com/gettingstarted/latest/swh/getting-started-create-cfdist.html

この質問が最初に回答されたため、ドキュメントがリファクタリングされたため、上記のメッセージは1ページ後に表示され、書き直されましたが、要点は同じです。 「バケットの名前」は、ドロップダウンに表示される選択肢を参照しているようですが、これは望みのものではありません。

バケットの名前ではなく、静的なウェブサイトホスティングエンドポイントを必ず指定してください。

http://docs.aws.Amazon.com/AmazonS3/latest/dev/website-hosting-cloudfront-walkthrough.html

バケットにRESTエンドポイントを使用しているというヒントは、Webサイトエンドポイントを使用している場合はエラーメッセージがXMLに含まれないためです。WebサイトエンドポイントはHTMLでエラーメッセージを返し、 XMLの代わりに。

前述のように、CloudFrontディストリビューションの新しいオリジンを作成し、動作を変更して新しいオリジンにリクエストを送信し、/*のCloudFrontキャッシュ無効化リクエストを送信します。設定する必要があります。

こちらもご覧ください:

http://docs.aws.Amazon.com/AmazonS3/latest/dev/WebsiteEndpoints.html#WebsiteRestEndpointDiff


¹2つのエンドポイント。技術的には、すべてのバケットに少なくとも2つのRESTエンドポイントホスト名があるため、3つ以上ありますが、2つのtypesエンドポイントがあります。バケットには、AWS Edgeネットワーク(CloudFrontを駆動するのと同じインフラストラクチャ)を使用して、特にバケットがプロビジョニングされるリージョンから遠く離れた地理的場所からCloudFrontキャッシュを使用せずに転送を高速化するためのオプションの転送加速エンドポイントもあります。このエンドポイントは、アクティブにするとhttps://example-bucket.s3-accelerate.amazonaws.comのように見え、AWSネットワークをより多く使用し、パブリックインターネットをより少なく使用するため、ほとんどのリクエストに対して追加の使用料がかかります...しかし、それは背後の違いです-エンドポイントの動作ではなく、エンドポイントのシーン展開。転送加速エンドポイントは依然としてRESTエンドポイントなので、他のRESTエンドポイントと同様に、Webサイトホスティング機能はありません。 CloudFrontでは、Originドメイン名にアクセラレーションエンドポイントを使用できません。これは意味がないためです。そのような構成が許可されている場合、リクエストとレスポンスはAWS Edge Networkを2回ループし、レイテンシーとコストの両方を増加させます利益を提供します。

77

同じ問題が発生し、CloudFrontでどのように解決したかOrigin Settings set Origin Domain Name to <website bucket>.s3-website-us-west-2.amazonaws.com

CloudFrontで設定の生成index.html as デフォルトのルートオブジェクト

S3で、このバケットを使用してWebサイトをホストするを選択し、index.html as インデックスドキュメント

24
Miguel Mota

私もこの問題を解決したこれらの手順に従ってきた同様の問題を抱えていました

手順:

->go to CloudFront Distributions 
->click the ID
->after Clicking Id you will find different categories like General, Origins and Origin Groups .
->Click the Origins and Origin Groups
->Click the checkbox  of your s3 bucket and click edit
->under grand read Permissions on Bucket click "Yes, Update bucket policy"

この手順で問題が解決しました。

0

CloudFrontを使用してhttps を介してS3でホストされている静的ウェブサイトを提供する方法については、AWSドキュメントを参照してください。

便宜上(またはリンクがうまくいかない場合)、以下のコンテンツを書き起こします。


  1. Amazon S3コンソール を使用して バケットを作成し、バケットで静的ウェブサイトホスティング を有効にします。

  2. 静的ウェブサイトホスティングダイアログボックスから、先頭のhttp://なしでバケットのエンドポイントをコピーします。形式はbucketname.s3-website-region.amazonaws.comに似ています。後のステップでこの形式のエンドポイントが必要です。

  3. 作成したバケットへのパブリック読み取りアクセス を許可するバケットポリシーを追加します。

  4. CloudFrontウェブディストリビューション を作成します。必ず以下を構成してください。

    • Origin Domain Nameには、手順2でコピーしたエンドポイントを入力します。
    • Allowed HTTP Methodsの場合、GET、HEAD、OPTIONSを選択します。
    • 代替ドメイン名(CNAME)には、Webサイトに使用するCNAMEを入力します。
  5. WebサイトにSSL(HTTPS)を使用したくない場合は、次の手順に進みます。 WebサイトにSSLを使用する場合は、ACMで証明書を要求またはインポートを選択して証明書を要求できます。詳細については、 代替ドメイン名とHTTPS の使用を参照してください。

  6. ディストリビューションの作成を選択します。

  7. ドメインのDNSレコードを更新して、WebサイトのCNAMEがCloudFrontディストリビューションのドメイン名を指すようにします。ディストリビューションのドメイン名は、 CloudFront consoled1234abcd.cloudfront.netに類似した形式で見つけることができます。

  8. DNSの変更が伝播し、以前のDNSエントリが期限切れになるのを待ちます。

0
Derek Soike