J'utilise CloudFront d'Amazon pour servir des fichiers statiques de mes applications Web.
N'existe-t-il aucun moyen d'indiquer à une distribution cloudfront qu'elle doit actualiser son fichier ou de signaler un seul fichier à actualiser?
Amazon vous recommande de version vos fichiers comme logo_1.gif, logo_2.gif et ainsi de suite pour contourner ce problème, mais cela semble être une solution assez stupide. N'y a-t-il absolument pas d'autre moyen?
Réponses:
Bonnes nouvelles. Amazon a finalement ajouté une fonctionnalité d'invalidation. Consultez la référence API .
Voici un exemple de demande de la référence API:
la source
createInvalidation
requête API , je vois toujours que la mise à jour prend 5 à 10 minutes environ pour être invalidée. Remarquez que j'écris ce commentaire 4 ans après le vôtre.Depuis le 19 mars, Amazon autorise désormais la durée de vie du cache de Cloudfront à 0 seconde, vous ne devriez donc (théoriquement) jamais voir d'objets périmés. Donc, si vous avez vos actifs dans S3, vous pouvez simplement accéder à AWS Web Panel => S3 => Modifier les propriétés => Métadonnées, puis définir votre valeur "Cache-Control" sur "max-age = 0".
Cela vient directement de la documentation de l' API :
la source
Avec l'API d'invalidation, il est mis à jour en quelques minutes.
Découvrez PHP Invalidator .
la source
Configuration de la mise à jour automatisée en 5 minutes
Ok les gars. Le meilleur moyen pour l'instant d'effectuer une mise à jour automatique de CloudFront (invalidation) est de créer une fonction Lambda qui sera déclenchée à chaque fois qu'un fichier est téléchargé dans le compartiment S3 (un nouveau ou une réécriture).
Même si vous n'avez jamais utilisé les fonctions lambda auparavant, c'est vraiment facile - suivez simplement mes instructions étape par étape et cela ne prendra que 5 minutes:
Étape 1
Accédez à https://console.aws.amazon.com/lambda/home et cliquez sur Créer une fonction lambda
Étape 2
Cliquez sur Fonction vide (personnalisé)
Étape 3
Cliquez sur la case vide (barrée) et sélectionnez S3 dans le combo
Étape 4
Sélectionnez votre bucket (comme pour la distribution CloudFront)
Étape 5
Définissez un type d'événement sur "Objet créé (tout)"
Étape 6
Définissez le préfixe et le suffixe ou laissez-le vide si vous ne savez pas ce que c'est.
Étape 7
Cochez la case Activer le déclencheur et cliquez sur Suivant
Étape 8
Nommez votre fonction (quelque chose comme: YourBucketNameS3ToCloudFrontOnCreateAll )
Étape 9
Sélectionnez Python 2.7 (ou version ultérieure) comme Runtime
Étape 10
Collez le code suivant au lieu du code Python par défaut:
Étape 11
Ouvrez https://console.aws.amazon.com/cloudfront/home dans un nouvel onglet de navigateur et copiez votre ID de distribution CloudFront pour l'utiliser à l'étape suivante.
Étape 12
Revenez à l'onglet lambda et collez votre ID de distribution au lieu de _VOTRE_DISTRIBUTION_ID_ dans le code Python. Gardez les citations environnantes.
Étape 13
Définir le gestionnaire : lambda_function.lambda_handler
Étape 14
Cliquez sur la liste déroulante des rôles et sélectionnez Créer un rôle personnalisé . Un nouvel onglet dans le navigateur sera ouvert.
Étape 15
Cliquez sur afficher le document de stratégie , cliquez sur modifier , cliquez sur OK et remplacez la définition de rôle par ce qui suit (tel quel):
Étape 16
Cliquez sur autoriser . Cela vous ramènera à un lambda. Vérifiez que le nom de rôle que vous venez de créer est sélectionné dans la zone de liste déroulante Rôle existant .
Étape 17
Réglez la mémoire (Mo) sur 128 et le délai d' expiration sur 5 sec.
Étape 18
Cliquez sur Suivant , puis sur Créer une fonction
Étape 19
Tu es prêt! Désormais, chaque fois que vous téléchargerez / remettez en ligne un fichier sur S3, il sera évalué dans tous les emplacements CloudFront Edge.
PS - Lorsque vous testez, assurez-vous que votre navigateur charge des images depuis CloudFront, et non depuis le cache local.
PSS - Veuillez noter que seules les 1000 premières invalidation de fichiers par mois sont gratuites, chaque invalidation dépassant la limite coûte 0,005 USD. Des frais supplémentaires pour la fonction Lambda peuvent également s'appliquer, mais c'est extrêmement bon marché.
la source
Bucket Explorer a une interface utilisateur qui rend cela assez facile maintenant. Voici comment:
Faites un clic droit sur votre seau. Sélectionnez «Gérer les distributions».
Cliquez avec le bouton droit sur votre distribution. Sélectionnez «Obtenir la liste d'invalidation Cloudfront», puis sélectionnez «Créer» pour créer une nouvelle liste d'invalidation. Sélectionnez les fichiers à invalider, puis cliquez sur «Invalider». Attendez 5 à 15 minutes.
la source
Si vous avez installé boto (ce qui n'est pas seulement pour python, mais installe également un tas d'utilitaires de ligne de commande utiles), il propose un utilitaire de ligne de commande spécifiquement appelé
cfadmin
ou `` cloud front admin '' qui offre les fonctionnalités suivantes:Vous invalidez des choses en exécutant:
la source
Il suffit de poster pour informer toute personne visitant cette page (premier résultat sur 'Cloudfront File Refresh') qu'il existe un invalidateur en ligne facile à utiliser + accessible disponible sur swook.net
Ce nouvel invalidateur est:
Divulgation complète: j'ai fait ça. S'amuser!
la source
un moyen très simple de le faire est le contrôle de version FOLDER.
Donc, si vos fichiers statiques sont des centaines par exemple, placez-les simplement tous dans un dossier appelé par année + versioning.
par exemple, j'utilise un dossier appelé 2014_v1 où à l'intérieur j'ai tous mes fichiers statiques ...
Donc, dans mon HTML, je mets toujours la référence au dossier. (bien sûr, j'ai un PHP include où j'ai défini le nom du dossier.) Donc, en changeant dans 1 fichier, il change réellement dans tous mes fichiers PHP.
Si je veux une actualisation complète, je renomme simplement le dossier en 2014_v2 dans ma source et change à l'intérieur du php include en 2014_v2
tout le HTML change automatiquement et demande le nouveau chemin, le cache cloudfront MISS et le demande à la source.
Exemple: SOURCE.mydomain.com est ma source, cloudfront.mydomain.com est CNAME vers la distribution cloudfront.
Donc, le PHP a appelé ce fichier cloudfront.mydomain.com/2014_v1/javascript.js et quand je veux une actualisation complète, je renomme simplement le dossier dans la source en "2014_v2" et je change l'inclusion PHP en définissant le dossier sur "2014_v2" .
Comme ça, il n'y a aucun délai pour l'invalidation et AUCUN FRAIS!
C'est mon premier article dans stackoverflow, j'espère que je l'ai bien fait!
la source
Réglez TTL = 1 heure et remplacez
http://developer.amazonwebservices.com/connect/ann.jspa?annID=655
la source
En rubis, en utilisant la gemme de brouillard
même en cas d'invalidation, il faut encore 5 à 10 minutes pour que l'invalidation soit traitée et actualisée sur tous les serveurs périphériques Amazon
la source
l'actuelle AWS CLI prend en charge l'invalidation en mode aperçu. Exécutez une fois ce qui suit dans votre console:
Je déploie mon projet Web en utilisant npm. J'ai les scripts suivants dans mon
package.json
:Après avoir mis en place les scripts ci-dessus, vous pouvez déployer votre site avec:
la source
--paths /
à--paths /*
. le mien était aussi comme le vôtre et il n'a pas invalidé la distribution ...Si vous utilisez AWS, vous utilisez probablement également son outil CLI officiel (tôt ou tard). AWS CLI version 1.9.12 ou supérieure prend en charge l'invalidation d'une liste de noms de fichiers.
Divulgation complète: j'ai fait ça. S'amuser!
la source
Accédez à CloudFront.
Cliquez sur votre ID / Distributions.
Cliquez sur Invalidations.
Cliquez sur créer une invalidation.
Dans la boîte d'exemple géante, tapez * et cliquez sur invalider
Terminé
la source