Question

J'utilise CloudFront d'Amazon pour servir des fichiers statiques de mes applications web.

Y at-il aucun moyen de dire une distribution CloudFront qu'il doit actualiser son fichier ou signaler un seul fichier qui doit être rafraîchi?

Amazon vous recommandons la version de vos fichiers comme logo_1.gif, logo_2.gif et ainsi de suite comme une solution pour ce problème, mais cela semble être une solution assez stupide. Est-il absolument aucun autre moyen?

Était-ce utile?

La solution

Bonnes nouvelles. Amazon a finalement ajouté une fonction de Invalidation. Voir l'API Référence .

Ceci est une demande d'échantillon de l'API Référence:

POST /2010-08-01/distribution/[distribution ID]/invalidation HTTP/1.0
Host: cloudfront.amazonaws.com
Authorization: [AWS authentication string]
Content-Type: text/xml

<InvalidationBatch>
   <Path>/image1.jpg</Path>
   <Path>/image2.jpg</Path>
   <Path>/videos/movie.flv</Path>
   <CallerReference>my-batch</CallerReference>
</InvalidationBatch>

Autres conseils

A partir du 19 Mars, Amazon permet maintenant le TTL cache de CloudFront à 0 secondes, donc vous (théoriquement) ne devriez jamais voir des objets obsolètes. Donc, si vous avez vos actifs dans S3, vous pouvez simplement aller à AWS Panel Web => S3 => Modifier les propriétés => métadonnées, puis définissez votre valeur "Cache-Control" à "max-age = 0".

Ceci est directement à partir de la :

  

Pour contrôler si CloudFront met en cache un objet et pour combien de temps, nous vous recommandons d'utiliser l'en-tête Cache-Control avec le max-age = directive. CloudFront met en cache l'objet pour le nombre spécifié de secondes. (La valeur minimale est de 0 seconde.)

Avec l'API Invalidation, il ne sont mis à jour en quelques minutes.
Consultez PHP Invalidator .

Configuration de mise à jour automatique en 5 minutes

OK, les gars. La meilleure façon possible pour l'instant d'effectuer la mise à jour automatique CloudFront (de infirmation) est de créer la fonction Lambda qui sera déclenché à chaque fois que tout fichier téléchargé au seau S3 (un nouveau ou réécrites).

Même si vous jamais utilisé les fonctions lambda avant, il est vraiment facile - il suffit de suivre mes instructions étape par étape et il faudra seulement 5 minutes:

Étape 1

Aller à https://console.aws.amazon.com/lambda/home et cliquez sur Créer une fonction lambda

Étape 2

Cliquez sur Fonction vide (sur mesure)

Étape 3

Cliquez sur la boîte vide (caressait) et sélectionnez S3 combo

Étape 4

Sélectionnez Bucket (le même que pour la distribution CloudFront)

Étape 5

Définir un Type d'événement pour "objet créé (All)"

Etape 6

Set Les préfixes et suffixes ou le laisser vide si vous ne savez pas ce qu'elle est.

Étape 7

Vérifier Activer déclenchement case et cliquez sur Suivant

Étape 8

Nom de votre fonction (quelque chose comme: YourBucketNameS3ToCloudFrontOnCreateAll )

Étape 9

Sélectionnez Python 2.7 (ou version ultérieure) Runtime

Étape 10

Coller le code suivant au lieu du code python par défaut:

from __future__ import print_function

import boto3
import time

def lambda_handler(event, context):
    for items in event["Records"]:
        path = "/" + items["s3"]["object"]["key"]
        print(path)
        client = boto3.client('cloudfront')
        invalidation = client.create_invalidation(DistributionId='_YOUR_DISTRIBUTION_ID_',
            InvalidationBatch={
            'Paths': {
            'Quantity': 1,
            'Items': [path]
            },
            'CallerReference': str(time.time())
            })

Étape 11

Ouvrir https://console.aws.amazon.com/cloudfront/home dans un nouvel onglet du navigateur et copiez votre ID de distribution CloudFront pour une utilisation à l'étape suivante.

Étape 12

Retour à l'onglet lambda et collez votre identifiant de distribution au lieu de _YOUR_DISTRIBUTION_ID_ dans le code Python. Gardez guillemets.

Étape 13

Set gestionnaire : lambda_function.lambda_handler

Étape 14

Cliquez sur le rôle combobox et sélectionnez Créer un rôle personnalisé . Nouvel onglet dans le navigateur sera ouvert.

Étape 15

Cliquez document de politique vue , cliquez sur modifier , cliquez sur OK et remplacer la définition du rôle à la suite (comme):

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Effect": "Allow",
      "Action": [
          "cloudfront:CreateInvalidation"
      ],
      "Resource": [
          "*"
      ]
    }
  ]
}

Étape 16

Cliquez sur allow . Cela vous ramènera à un lambda. Vérifiez que le nom du rôle que vous venez de créer est sélectionné dans le rôle existant combobox.

Étape 17

Set Mémoire (MB) à 128 et Timeout à 5 sec.

Étape 18

Cliquez sur Suivant , puis sur Créer la fonction

Étape 19

Vous êtes bon pour vous! Maintenant, chaque fois que vous télécharger / réimporter tout fichier à S3, il sera évalué dans tous les emplacements Edge CloudFront.

PS - Lorsque vous testez, assurez-vous que votre navigateur est le chargement des images à partir CloudFront, pas de cache local

.

PSS - S'il vous plaît noter que seulement le premier 1000 fichiers infirmation par mois sont gratuits, chaque limite coûte plus infirmation 0,005 $ USD. En outre des frais supplémentaires pour la fonction Lambda peuvent appliquer, mais il est extrêmement pas cher.

Bucket Explorateur a une interface utilisateur qui rend ce assez facile maintenant. Voici comment:

clic droit de votre seau. Sélectionnez "Gérer les distributions".
Faites un clic droit de votre distribution. Sélectionnez « Obtenir la liste de CloudFront infirmation » Ensuite, sélectionnez « Créer » pour créer une nouvelle liste de infirmation. Sélectionnez les fichiers à invalider, et cliquez sur « Invalider. » Attendez 5-15 minutes.

Si vous avez Boto installé (ce qui est non seulement pour python, mais installe également un tas d'utilitaires de ligne de commande utile), il offre une ligne de commande util spécifiquement appelé cfadmin ou « admin avant nuage » qui offre les fonctionnalités suivantes:

Usage: cfadmin [command]
cmd - Print help message, optionally about a specific function
help - Print help message, optionally about a specific function
invalidate - Create a cloudfront invalidation request
ls - List all distributions and streaming distributions

Vous invaliate choses en cours d'exécution:

$sam# cfadmin invalidate <distribution> <path>

affichage Juste pour informer tous ceux qui visitent cette page (premier résultat sur « Actualiser CloudFront Fichier ») qu'il existe un invalidator disponible en ligne à swook.net

Cette nouvelle invalidator est:

  • entièrement en ligne (sans installation)
  • 24x7 (hébergé par Google) et ne nécessite pas d'adhésion.
  • Il y a un soutien de l'histoire, et le chemin pour vous permettre de vérifier vos fichiers avec invalider la facilité. (Souvent avec seulement quelques clics après avoir désactivé pour la première fois!)
  • Il est également très sûr, comme vous le découvrirez en lisant son après la sortie .

La divulgation complète: Je l'ai fait. Amusez-vous bien!

d'une façon très facile de le faire est FOLDER versioning.

Donc, si vos fichiers statiques sont des centaines par exemple, il suffit de mettre tous dans un dossier appelé par année + versioning.

par exemple j'utiliser un dossier appelé 2014_v1 où à l'intérieur j'ai tous mes fichiers statiques ...

Alors dans mon HTML je mets toujours la référence au dossier. (Bien sûr j'ai un PHP include où j'ai mis le nom du dossier.) Donc, en changeant dans 1 fichier il réellement changer dans tous mes fichiers PHP ..

Si je veux un rafraîchissement complet, je renomme simplement le dossier à 2014_v2 dans ma source et changer à l'intérieur du php include à 2014_v2

tous les fichiers HTML changent automatiquement et demander au nouveau chemin, cache CloudFront MISS et demande à la source.

Exemple: SOURCE.mydomain.com est ma source, cloudfront.mydomain.com est CNAME à la distribution CloudFront.

PHP appelé ce fichier cloudfront.mydomain.com/2014_v1/javascript.js et quand je veux un rafraîchissement complet, il suffit de renommer le dossier dans la source « 2014_v2 » et je change include_path PHP en définissant le dossier « 2014_v2 ».

Comme cela il n'y a pas de délai pour invalidation et SANS FRAIS!

Ceci est mon premier message stackoverflow, espérons que je l'ai fait bien!

En ruby, en utilisant la pierre de brouillard

AWS_ACCESS_KEY = ENV['AWS_ACCESS_KEY_ID']
AWS_SECRET_KEY = ENV['AWS_SECRET_ACCESS_KEY']
AWS_DISTRIBUTION_ID = ENV['AWS_DISTRIBUTION_ID']

conn = Fog::CDN.new(
    :provider => 'AWS',
    :aws_access_key_id => AWS_ACCESS_KEY,
    :aws_secret_access_key => AWS_SECRET_KEY
)

images = ['/path/to/image1.jpg', '/path/to/another/image2.jpg']

conn.post_invalidation AWS_DISTRIBUTION_ID, images

même sur infirmation, il faut encore 5-10 minutes pour le infirmation de traiter et de rafraîchir sur tous les serveurs Edge amazon

en cours de support AWS infirmation CLI en mode de prévisualisation. Exécuter une fois ce qui suit dans la console:

aws configure set preview.cloudfront true

Je mon projet de déployer Web à l'aide NPM. Je les scripts suivants dans mon package.json:

{
    "build.prod": "ng build --prod --aot",
    "aws.deploy": "aws s3 sync dist/ s3://www.mywebsite.com --delete --region us-east-1",
    "aws.invalidate": "aws cloudfront create-invalidation --distribution-id [MY_DISTRIBUTION_ID] --paths /",
    "deploy": "npm run build.prod && npm run aws.deploy && npm run aws.invalidate"
}

Avoir les scripts ci-dessus en place, vous pouvez déployer votre site avec:

npm run deploy

Si vous utilisez AWS, vous utilisez probablement aussi son outil officiel de CLI (tôt ou tard). ou prend en charge ci-dessus une liste de invalidant les noms de fichiers.

La divulgation complète: Je l'ai fait. Amusez-vous bien!

scroll top