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?
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.
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.
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"
http://docs.aws.Amazon.com/cli/latest/reference/cloudfront/get-invalidation.html
http://docs.aws.Amazon.com/cli/latest/reference/cloudfront/create-invalidation.html
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.
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.
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
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
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.