Amazon Cloudfront avec redirection S3

10

J'essaie de faire quelque chose qui devrait être relativement simple - je veux configurer quelques domaines et sous-domaines pour rediriger vers le domaine principal de notre site, mais je veux mettre les redirections sur Cloudfront. Tout fonctionne sauf la redirection du chemin racine - cela me donne un fichier XML décrivant en partie le compartiment S3.

Contexte

S3

S3 vous permet de configurer un compartiment entièrement redirigé , comme:

S3 avec redirection de la configuration de toutes les demandes

En testant cela, le point de terminaison Web (brass9-com.s3-website-us-west-1.amazonaws.com) fait ce qu'il doit - il redirige vers brass9.com. Bien.

Cloudfront

Cloudfront vous permet de pointer vers un compartiment S3, mais la façon dont il vous suggère de le faire est incorrecte - au lieu de pointer le compartiment par son nom, comme brass9-com.s3.amazonaws.com, vous devez utiliser le point de terminaison Web ci-dessus. En dehors de cela, vous pouvez tout laisser à ses valeurs par défaut et obtenir un bon comportement de redirection. Ainsi, un chemin comme www.brass9.com/portfolio redirige correctement là où il devrait. Bien aussi.

Le problème - la redirection du domaine racine

La seule chose qui ne fonctionne pas ensuite est la redirection depuis le site www.brass9.com . Au lieu de vous rediriger, vous obtenez ce résultat étrange:

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

D'ACCORD... . Ce n'est donc pas complètement inattendu - car il n'y a pas d'objet racine par défaut. Mais quel objet racine par défaut puis-je éventuellement spécifier pour empêcher ce comportement? Quel est le nom de l'objet de redirection S3, le cas échéant, vers lequel je dois pointer? Ou existe-t-il une autre configuration appropriée, ou s'agit-il simplement d'un bug dans la façon dont Cloudfront et S3 interagissent qu'Amazon doit corriger?

Solution non fonctionnelle connue: objet racine par défaut

Il est possible de spécifier un objet racine par défaut d'index.html, mais cela n'aide pas du tout - cela ne fait que changer le problème. L'url Cloudfront redirige à la place vers /index.html sur le site principal, qui est un 404 (nous n'utilisons pas de fichier index.html, c'est un site géré par le framework côté serveur). Je pourrais mettre un index.html sur le serveur, mais cela vainc le petit gain de vitesse de l'utilisation de Cloudfront en premier lieu.

Questions similaires

Une question demande quelque chose de similaire, mais renvoie une réponse vide de 0 octet pour une raison quelconque au lieu de ce que je vois, une réponse XML. Il ne comprend pas de question sur ce problème ni de résolution.

Articles Liés

Un article vous propose de servir l'ensemble du site sur le domaine nu et www . Cette vis avec les signets de n'importe quel utilisateur, votre classement de recherche, etc., etc. Vous ne devriez pas faire cela.

Plusieurs discutent de l' hébergement d'un site Web statique sur S3 et Cloudfront plutôt que d'un schéma de redirection, et ne sont donc pas liés.

Alors, comment dois-je procéder correctement?

Capture d'écran de la configuration Cloudfront - pas d'objet racine par défaut, pointant vers l'origine S3. Ignorez InProgress - je venais d'activer et de désactiver l'objet racine par défaut pour tester.

Distribution Cloudfront sans objet racine par défaut pointant vers S3

Et la configuration d'origine pour cette distribution:

Origine - pointe vers S3, valeurs par défaut

Chris Moschini
la source
1
Toute demande adressée à un point d'extrémité de site Web configuré pour rediriger tout "devrait" faire exactement cela, y compris la racine. Avez-vous une politique de compartiment sur ce compartiment de redirection? On dirait que vous pourriez, mais vous ne devriez pas. Cela semble également un peu comme si vous aviez pu voir une réponse en cache de Cloudfront GET /depuis avant de corriger votre configuration pour utiliser le point de terminaison Web.
Michael - sqlbot
1
C'était en fait une réponse ListBucket mise en cache qui persistait toujours dans S3, même si j'avais invalidé et changé la configuration de CF plusieurs fois. Il faut juste une heure ou 4 pour nettoyer. @ Michael-sqlbot Si vous postez votre commentaire comme réponse, je peux le marquer comme accepté.
Chris Moschini

Réponses:

4

Si vous rencontrez ce problème, vérifiez d'abord lorsque vous configurez l'origine du compartiment s3 pour le cloudfront, la saisie semi-automatique renvoie le point de terminaison s3 REST domain.amazonaws.com qui renvoie cette réponse ListBucketResult.

Vous devez noter manuellement le point final du site web domain.s3-website-region.amazonaws.com

Important: si vous avez mal configuré cloudfront avec le point de terminaison REST, vous devez invalider le cache via les invalidations ou il continuera à renvoyer la réponse REST

lapinkoira
la source
La note sur l'invalidation du cache m'a finalement aidé à résoudre un problème que j'ai chassé pendant plusieurs jours. Je vous remercie!
Nate
Merci beaucoup! Pour les utilisateurs Terraform, dans le originbloc de la distribution, utilisez aws_s3_bucket.BUCKET.website_endpointdans domain_name(pas bucket_regional_name) et ajoutez le custom_origin_configbloc.
dusan
Tu es un sauveur! Nous avons eu du mal avec ce problème le dernier jour, nous avons continué à récupérer ListBucketResult XML même si nous modifions les paramètres de distribution. Enfin, après avoir supprimé la distribution et en avoir créé une nouvelle pointant vers domain.s3-website-region.amazonaws.com, la redirection a fonctionné pour nous!
Dale Zak
2

Solution: configurez la redirection comme indiqué dans la question, puis attendez les heures de cache S3 et CloudFront. Ils peuvent durer 4 heures ou plus, il vous suffit donc de tout régler, puis d'attendre et d'espérer le meilleur.

(Ceci est la solution de Michael dans les commentaires, mais cela fait maintenant des années et cela méritait vraiment d'être marqué comme répondu).

Chris Moschini
la source
0

Écrire comme réponse car je ne peux pas commenter - à partir de la documentation à http://docs.aws.amazon.com/AmazonCloudFront/latest/APIReference/DistributionConfigDatatype.html#DistributionConfigDatatype_Elements, il semble que vous puissiez avoir un objet racine par défaut vide:

Si vous ne souhaitez pas spécifier un objet racine par défaut lorsque vous créez une distribution, incluez un élément DefaultRootObject vide.

Dani_l
la source
Vous pouvez (bien que certaines bibliothèques d'API l'interdisent) - mais l'utilisation d'un objet racine par défaut vide me donne la réponse ridicule de ListBucketResult XML que vous voyez dans ma question.
Chris Moschini