web-dev-qa-db-fra.com

Cache Amazon S3 et Cloudfront, comment effacer le cache ou synchroniser leur cache

J'ai un travail cron qui s'exécute toutes les 10 minutes et met à jour le type de contenu et x-amz-meta. Mais depuis hier, il semble qu'après l'exécution du travail cron, Amazon ne détecte pas les modifications apportées (actualise son cache).

Je suis même allé faire les changements manuellement mais aucun changement ...

Quand une vidéo est téléchargée, elle a un type de contenu application/x-mp4 et le travail cron la change en video/mp4.

Bien que S3 ait le bon type de contenu, video/mp4, cloudfront affiche application/x-mp4 (ancien type de contenu) .... 

Le job cron fonctionne sans problème depuis 6 mois. 

Quel est le problème avec la mise en cache Amazon? Comment puis-je synchroniser la mise en cache?

50
mamesaye

Utilisez Invalidations pour vider le cache, vous pouvez indiquer le chemin d'accès aux fichiers que vous souhaitez vider ou simplement utiliser des caractères génériques pour tout effacer.

_ { http://docs.aws.Amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html#invalidating-objects-api } _

Cela peut également être effectué à l'aide de l'API! http://docs.aws.Amazon.com/cloudfront/latest/APIReference/API_CreateInvalidation.html

Le SDK AWS PHP contient maintenant les méthodes, mais si vous voulez utiliser quelque chose de plus léger, consultez la bibliothèque suivante: http://www.subchild.com/2010/09/17/Amazon-cloudfront -php-invalidator /

la solution de user3305600 ne fonctionne pas car la mise à zéro équivaut à l'utilisation des en-têtes de cache d'origine. 

52
Neo

Quant au code actuel

obtenez votre identifiant de distribution CloudFront

aws cloudfront list-distributions

Invalider tous les fichiers de la distribution, donc CloudFront en extrait de nouveaux

aws cloudfront create-invalidation --distribution-id=S11A16G5KZMEQD --paths /

Mon script de version complète actuelle est

#!/usr/bin/env bash

BUCKET=mysite.com
SOURCE_DIR=dist/

export AWS_ACCESS_KEY_ID=xxxxxxxxxxx
export AWS_SECRET_ACCESS_KEY=xxxxxxxxx
export AWS_DEFAULT_REGION=eu-west-1


echo "Building production"
if npm run build:prod ; then
   echo "Build Successful"
else
  echo "exiting.."
  exit 1
fi


echo "Removing all files on bucket"
aws s3 rm s3://${BUCKET} --recursive


echo "Attempting to upload site .."
echo "Command:  aws s3  sync $SOURCE_DIR s3://$BUCKET/"
aws s3  sync ${SOURCE_DIR} s3://${BUCKET}/
echo "S3 Upload complete"

echo "Invalidating cloudfrond distribution to get fresh cache"
aws cloudfront create-invalidation --distribution-id=S11A16G5KZMEQD --paths / --profile=myawsprofile

echo "Deployment complete"  

Références

http://docs.aws.Amazon.com/cli/latest/reference/cloudfront/get-invalidation.html

http://docs.aws.Amazon.com/cli/latest/reference/cloudfront/create-invalidation.html

23
Dr Manhattan

S3 n'est pas utilisé pour le développement en temps réel, mais si vous voulez vraiment tester l'utilisation de votre site Web fraîchement déployé

http://yourdomain.com/index.html?v=2
http://yourdomain.com/init.js?v=2

Ajouter un paramètre de version à la fin invalidera la version mise en cache du fichier et le navigateur obtiendra une nouvelle copie du fichier à partir du compartiment du serveur.

9
HimalayanCoder

Cloudfront mettra en cache un fichier/objet jusqu'à son expiration. Par défaut, c'est 24 heures. Si vous avez modifié cette valeur en une valeur élevée, cela prend plus de temps.

Si vous devez à tout moment effacer de force le cache, utilisez le fichier invalidation . Il est facturé séparément.

Une autre option consiste à modifier l'URL (clé d'objet) afin de toujours récupérer le nouvel objet.

5
Sony Kadavan

Si vous recherchez une solution minimale qui invalide le cache, cette version modifiée de la solution de Dr Manhattan devrait suffire. Notez que je spécifie le répertoire racine/pour indiquer que je veux que tout le site soit actualisé.

export AWS_ACCESS_KEY_ID=<Key>
export AWS_SECRET_ACCESS_KEY=<Secret>
export AWS_DEFAULT_REGION=eu-west-1

echo "Invalidating cloudfrond distribution to get fresh cache"
aws cloudfront create-invalidation --distribution-id=<distributionId> --paths / --profile=<awsprofile>

Les codes de région peuvent être trouvés ici

Vous devrez également créer un profil à l'aide de aws cli . Utilisez l'option aws configure --profile. Vous trouverez ci-dessous un exemple d'extrait d'Amazon.

$ aws configure --profile user2
AWS Access Key ID [None]: AKIAI44QH8DHBEXAMPLE
AWS Secret Access Key [None]: je7MtGbClwBF/2Zp9Utk/h3yCo8nvbEXAMPLEKEY
Default region name [None]: us-east-1
Default output format [None]: text
3
Francis

Ne pas utiliser les invalidations. Ils ne peuvent pas être annulés et vous serez facturé. La seule façon dont cela fonctionne pour moi est de réduire le TTL et d’attendre.

Cordialement

(edit: ne fonctionne pas) À partir de 2014, vous pouvez vider votre cache à tout moment. Consultez la documentation ou dans les paramètres de distribution> Comportements> Modifier 

Utilisation de la mise en cache des objets (en-têtes de cache d'origine) Personnaliser

Minimum TTL = 0

http://docs.aws.Amazon.com/AmazonCloudFront/latest/DeveloperGuide/Expiration.html

1
user3305600

Je crois que l'utilisation de * invalide tout le cache de la distribution. J'essaie pour le moment, je le mettrais à jour davantage

invalider demande capture d'écran

Mettre à jour:

Cela a fonctionné comme prévu. Veuillez noter que vous pouvez invalider l'objet de votre choix en spécifiant le chemin de l'objet.

0
greengreyblue