web-dev-qa-db-fra.com

AWS cloudfront ne se met pas à jour lors de la mise à jour des fichiers dans S3

J'ai créé une distribution dans cloudfront en utilisant mes fichiers sur S3. Cela a bien fonctionné et tous mes fichiers étaient disponibles. Mais aujourd'hui, j'ai mis à jour mes fichiers sur S3 et j'ai essayé d'y accéder via Cloudfront, mais cela donnait toujours d'anciens fichiers.

Qu'est-ce que je rate ?

27
Jigar Tank

Vous devez invalider vos objets dans le cache de distribution CloudFront. Dans le passé, vous deviez le faire 1 fichier à la fois, maintenant vous pouvez le faire avec des caractères génériques, par exemple /images/*

https://aws.Amazon.com/about-aws/whats-new/2015/05/Amazon-cloudfront-makes-it-easier-to-invalidate-multiple-objects/

6
jpaljasma

Comment changer l'âge maximum du Cache-Control via la console AWS S3:

  • Accédez au fichier dont vous souhaitez modifier le Cache-Control.
  • Cochez la case à côté du nom du fichier (il deviendra bleu)
  • En haut à droite, cliquez sur Properties
  • Cliquez sur Metadata
  • Si vous ne voyez pas un Key nommé Cache-Control, puis clique Add more metadata.
  • Définissez Key sur Cache-Control définissez Value sur max-age=0 (où 0 est le nombre de secondes pendant lesquelles vous souhaitez que le fichier reste dans le cache). Vous pouvez remplacer 0 par ce que vous voulez.

enter image description here

4
nu everest

Le principal avantage de l'utilisation de CloudFront est d'obtenir vos fichiers à partir d'une source (S3 dans votre cas) et de les stocker sur des serveurs Edge pour répondre plus rapidement aux demandes GET. CloudFront ne reviendra pas à la source S3 pour chaque demande http.

Pour que CloudFront serve les derniers fichiers/objets, vous avez plusieurs options:

Utilisez CloudFront pour invalider les objets modifiés

Vous pouvez utiliser CloudFront pour invalider un ou plusieurs fichiers ou répertoires manuellement ou à l'aide d'un déclencheur. Cette option a été décrite dans d'autres réponses ici. Plus d'informations sur Invalider plusieurs objets dans CloudFront . Cette approche est pratique si vous mettez rarement à jour vos fichiers et que vous ne souhaitez pas affecter les performances des objets mis en cache.

Définition des dates d'expiration des objets sur les objets S3

C'est maintenant la solution recommandée. C'est simple:

  • Connectez-vous à AWS Management Console
  • Aller dans le seau S3
  • Sélectionnez tous les fichiers
  • Choisissez le menu déroulant "Actions" dans le menu
  • Sélectionnez "Modifier les métadonnées"
  • Dans le champ "Clé", sélectionnez "Cache-Control" dans le menu déroulant.
  • Dans le champ "Valeur", entrez "max-age = 300" (nombre de secondes)
  • Appuyez sur le bouton "Enregistrer". La valeur de cache par défaut pour les objets CloudFront est de 24 heures. En le modifiant sur une valeur inférieure, CloudFront vérifie auprès de la source S3 pour voir si une version plus récente de l'objet est disponible dans S3.

J'utilise une combinaison de ces deux méthodes pour m'assurer que les mises à jour sont propagées rapidement aux emplacements Edge et éviter de servir des fichiers obsolètes gérés par CloudFront.

AWS recommande toutefois de modifier les noms d'objet en utilisant un identifiant de version dans chaque nom de fichier. Si vous utilisez une commande de build et compilez vos fichiers, cette option est généralement disponible (comme dans la commande de build react npm).

0
Saeed D.

Merci tedder42 et Chris Heald

J'ai pu réduire la durée du cache dans mon objet Origin, c'est-à-dire s3 et livrer les fichiers plus instantanément que ce qu'il était par défaut 24 heures. pour certaines de mes autres distributions, j'ai également mis en avant tous les en-têtes vers Origin dans lesquels cloudfront ne met rien en cache et envoie toutes les demandes à Origin.

merci.

0
Jigar Tank

Veuillez vous référer à cette réponse, cela peut vous aider.

Quelle est la différence entre Cache-Control: max-age = 0 et no-cache?

Ajout d'une variable Cache-Control à 0 dans l'en-tête du fichier sélectionné dans S3 This worked me

0
banoth ravinder

J'ai également eu ce problème et je l'ai résolu en utilisant le contrôle de version (pas le même que le contrôle de version S3). Voici un lien complet vers l'utilisation du contrôle de version avec Cloudfront

Fichiers invalides En résumé:

Lorsque vous téléchargez un ou plusieurs nouveaux fichiers dans votre compartiment S3, modifiez la version et mettez à jour vos liens selon les besoins. D'après la documentation, l'avantage de l'utilisation de la gestion des versions par rapport à l'invalidation (l'autre façon de le faire) est qu'il n'y a pas de frais supplémentaires pour actualiser CloudFront par des changements de version alors qu'il y a invalidation. Si vous avez des centaines de fichiers, cela peut être problématique, mais il est possible qu'en ajoutant une version à votre répertoire racine, ou un objet racine par défaut (le cas échéant), ce ne soit pas un problème. Dans mon cas, j'ai un SPA, tout ce que j'ai à faire est de changer la version de mon objet racine par défaut (index.html en index2.html) et il se met à jour instantanément sur CloudFront.

0
Farasi78

Je suis juste tombé sur le même problème. Au début, j'ai essayé de mettre à jour le contrôle du cache à 0 et max-age = 0 pour les fichiers de mon compartiment S3 que j'ai mis à jour, mais cela n'a pas fonctionné.

Ce qui a fonctionné était de suivre les étapes de @jpaljasma. Voici les étapes avec quelques captures d'écran.

Accédez d'abord à votre service AWS CloudFront.

Cliquez ensuite sur la distribution CloudFront que vous souhaitez invalider. enter image description here

Cliquez sur l'onglet invalidations puis cliquez sur "Créer invalidation" qui est entouré en rouge. enter image description here

Dans le champ de texte "chemin d'objet", vous pouvez lister les fichiers spécifiques, c'est-à-dire /index.html ou utilisez simplement le caractère générique /* pour tout invalider. Cela oblige cloudfront à tirer le meilleur parti de tout dans votre compartiment S3.

Une fois que vous avez rempli le champ de texte, cliquez sur "Invalider", après que CloudFront aura fini d'invalider, vous verrez vos modifications la prochaine fois que vous accéderez à la page Web.

enter image description here

0
CAM_344