web-dev-qa-db-fra.com

Site Web CloudFront + S3: "La clé spécifiée n'existe pas" lorsqu'un document d'index implicite doit être affiché

Je viens de déployer un site Web statique sur Amazon S3, qui peut actuellement être consulté ici: http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/

Si vous cliquez sur l'un des liens de l'article, vous remarquerez l'erreur suivante:

S3 Error

S3 se plaint que le fichier n'existe pas. Maintenant, voici ce qui est bizarre: j'utilise CloudFront sur mon domaine. Ainsi, lorsque vous cliquez sur ce lien d'article, il envoie la demande à CloudFront qui tente ensuite de récupérer le fichier à partir du compartiment S3.

Cependant, si vous visitez directement la même URL depuis S3, par exemple: http://www.rdegges.com.s3-website-us-east-1.amazonaws.com/2015/building-a-heroku- addon-planning / la page se chargera très bien.

Il semble que quelque chose se perd dans la traduction ici.

Quelqu'un a-t-il une suggestion de ce que je peux faire pour corriger mes paramètres?

36
rdegges

Je vais sortir sur un membre et dire que la clé spécifiée n'existe pas techniquement, donc le message d'erreur est techniquement précis mais ne raconte pas toute l'histoire. Cela devrait être une solution facile.

Les compartiments S3 ont deux¹ points de terminaison, "REST" et "site Web". Ils ont deux jeux de fonctionnalités différents. Le point de terminaison du site Web fournit une résolution magique des documents d'index (par exemple index.html, qui semble être ce qui est réellement censé être renvoyé au navigateur dans l'exemple que vous avez fourni) tandis que les points de terminaison REST don 't.

Lorsque vous configurez CloudFront devant un compartiment utilisé pour l'hébergement de sites Web, vous ne souhaitez généralement pas configurer l'origine en tant qu'origine "S3" en sélectionnant le nom du compartiment dans la liste déroulante; à la place, vous souhaitez le configurer comme origine "personnalisée" et utiliser le nom d'hôte du point de terminaison du site Web tel qu'il est fourni dans la console S3 (par exemple example-bucket.s3-website-us-east-1...) car sinon, CloudFront suppose que vous souhaitez qu'il utilise le point de terminaison REST pour le compartiment (qui permet l'authentification et le contenu privé, ce que le point de terminaison du site Web ne permet pas)).

Important

Ne sélectionnez pas le nom de votre compartiment dans la liste, par exemple, example.com.s3.amazonaws.com.

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

La documentation a été remaniée depuis la réponse à cette question. Le message ci-dessus apparaît maintenant une page plus tard et a été reformulé, mais l'essentiel est le même. Le "nom du compartiment" semble faire référence aux choix affichés dans la liste déroulante, ce qui n'est pas ce que vous voulez.

Remarque

Veillez à spécifier le point de terminaison d'hébergement de site Web statique, et non le nom du compartiment.

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

L'astuce que vous utilisez le point de terminaison REST pour le compartiment est que le message d'erreur ne serait pas en XML si vous utilisiez le point de terminaison du site Web - le point de terminaison du site Web renvoie des messages d'erreur en HTML, au lieu de XML.

Créez une nouvelle origine pour la distribution CloudFront, comme décrit, puis modifiez le comportement pour envoyer des demandes à la nouvelle origine, puis envoyez une demande d'invalidation du cache CloudFront pour /* et vous devriez être réglé.

Voir également:

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


¹ deux points finaux. Techniquement, il y en a plus de deux, car tous les compartiments ont au moins deux possibles REST noms d'hôte de point de terminaison ... mais il y a deux types de points de terminaison. Les compartiments ont également un point de terminaison d'accélération de transfert facultatif qui utilise le réseau AWS Edge (la même infrastructure qui alimente CloudFront) pour des transferts plus rapides/optimisés, en particulier à partir d'emplacements géographiques plus éloignés de la région où le compartiment est provisionné, mais sans utiliser le cache CloudFront. Ce point de terminaison ressemble à https://example-bucket.s3-accelerate.amazonaws.com si vous l'activez et que des frais d'utilisation supplémentaires sont facturés pour la plupart des demandes, car vous utilisez davantage le réseau AWS et moins Internet public ... mais, c'est une différence dans le déploiement en arrière-plan du point de terminaison, pas le comportement du point de terminaison. Le point de terminaison d'accélération du transfert est toujours un point de terminaison REST, donc, tout comme les autres points de terminaison REST, il ne dispose pas des fonctionnalités d'hébergement de site Web. CloudFront ne le fera pas). vous permet d'utiliser un point de terminaison d'accélération pour un nom de domaine Origin, car cela n'aurait aucun sens - si une telle configuration était autorisée, les demandes et les réponses passeraient deux fois par le réseau AWS Edge et augmenteraient à la fois la latence et les coûts sans aucun avantage.

77
Michael - sqlbot

Rencontré le même problème et comment je l'ai résolu dans CloudFront Paramètres d'origine défini Nom de domaine d'origine à <website bucket>.s3-website-us-west-2.amazonaws.com

Dans CloudFront Générer les paramètres assurez-vous d'avoir index.html as Objet racine par défaut.

Dans S3, assurez-vous d'avoir tilisez ce compartiment pour héberger un site Web sélectionné et définissez index.html as Document d'index.

24
Miguel Mota

J'avais aussi un problème similaire, j'ai suivi ces étapes qui ont résolu ce problème

PAS:

->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"

Cette étape a résolu mon problème.

0
Ravi Teja Mureboina

Consultez les documents AWS sur la façon de tiliser CloudFront pour servir un site Web statique hébergé sur S3 sur https .

Transcrire le contenu ci-dessous pour plus de commodité (ou au cas où le lien deviendrait défectueux).


  1. Utilisez console Amazon S pour créer un compartiment et activer l'hébergement de site Web statique sur le compartiment.

  2. Dans la boîte de dialogue Hébergement de site Web statique , copiez le point de terminaison de votre compartiment sans le début http: // . Le format est similaire à bucketname.s3-website-region.amazonaws.com . Vous avez besoin du point de terminaison dans ce format pour une étape ultérieure.

  3. Ajouter une stratégie de compartiment qui autorise l'accès en lecture publique au compartiment que vous avez créé.

  4. Créez une distribution Web CloudFront . Assurez-vous de configurer les éléments suivants:

    • Pour Nom de domaine d'origine , entrez le point de terminaison que vous avez copié à l'étape 2.
    • Pour Méthodes HTTP autorisées , sélectionnez GET, HEAD, OPTIONS .
    • Pour Noms de domaine alternatifs (CNAME) , entrez le CNAME que vous souhaitez utiliser pour votre site Web.
  5. Si vous ne souhaitez pas utiliser SSL (HTTPS) pour votre site Web, passez à l'étape suivante. Si vous souhaitez utiliser SSL pour votre site Web, vous pouvez choisir Demander ou importer un certificat avec ACM pour demander un certificat. Pour plus d'informations, consultez tilisation d'autres noms de domaine et HTTPS .

  6. Choisissez Créer une distribution .

  7. Mettez à jour les enregistrements DNS de votre domaine pour pointer le CNAME de votre site Web vers le nom de domaine de votre distribution CloudFront. Vous pouvez trouver le nom de domaine de votre distribution dans console CloudFront dans un format similaire à d1234abcd.cloudfront.net .

  8. Attendez que vos modifications DNS se propagent et que les entrées DNS précédentes expirent.

0
Derek Soike