web-dev-qa-db-fra.com

Forcer la mise à jour de la distribution / fichier dans CloudFront

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

N'y a-t-il aucun moyen de dire à une distribution Cloudfront qu'elle a besoin d'actualiser son fichier ou d'indiquer un seul fichier à actualiser?

Amazon vous recommande de mettre à jour vos fichiers tels que logo_1.gif, logo_2.gif, etc. pour résoudre ce problème, mais cela semble être une solution assez stupide. N'y a-t-il absolument pas d'autre moyen?

144
Martin

Bonnes nouvelles. Amazon a finalement ajouté une fonctionnalité d'invalidation. Voir la référence de l'API .

Ceci est un exemple de demande de la référence API:

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>
132
James Lawruk

À compter du 19 mars, Amazon autorise désormais le cache de Cloudfront TTL à 0 secondes; vous ne devriez donc (théoriquement) jamais voir d'objets périmés. Si vous avez vos ressources dans S3, vous pouvez simplement accéder à AWS Web Panel => S3 => Modifier les propriétés => Métadonnées, puis définissez la valeur "Cache-Control" sur "max-age = 0".

Ceci vient directement de documentation de l'API :

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

19
John K. Chow

Configuration de la mise à jour automatisée en 5 minutes

Ok les gars. Le meilleur moyen pour l'instant d'effectuer la mise à jour automatique de CloudFront (invalidation) est de créer une fonction Lambda qui sera déclenchée chaque fois qu'un fichier est chargé dans le compartiment S3 (un nouveau ou réécrit).

Même si vous n’avez jamais utilisé les fonctions lambda auparavant, c’est très simple: il suffit de suivre mes instructions détaillées et cela ne vous prendra que 5 minutes:

Étape 1

Allez sur https://console.aws.Amazon.com/lambda/home et cliquez sur Créer une fonction lambda

Étape 2

Cliquez sur Fonction vide (personnalisée)

Étape 3

Cliquez sur la case vide (en grisé) et sélectionnez S3 dans la liste déroulante.

Étape 4

Sélectionnez votre Bucket (identique à celui de la distribution CloudFront)

Étape 5

Définissez un type d'événement sur "Objet créé (tout)"

Étape 6

Définissez Préfixe et 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) sous la forme Runtime

Étape 10

Collez le code suivant à la place de la valeur par défaut python code:

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

Ouvrez https://console.aws.Amazon.com/cloudfront/home dans un nouvel onglet de navigateur et copiez votre identifiant de distribution CloudFront pour l'utiliser à l'étape suivante.

Étape 12

Retournez à l'onglet lambda et collez votre identifiant de distribution à la place de _YOUR_DISTRIBUTION_ID_ dans le code Python. Conservez les guillemets.

Étape 13

Définir gestionnaire: lambda_function.lambda_handler

Étape 14

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

Étape 15

Cliquez sur voir le document de politique, cliquez sur modifier, cliquez sur [~ # ~] ok [~ # ~] et remplacez le rôle. définition avec ce qui suit (tel quel):

{
  "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 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 liste déroulante Rôle existant.

Étape 17

Définissez Mémoire (Mo) sur 128 et Délai d'attente sur 5 sec.

Étape 18

Cliquez sur Suivant, puis cliquez sur Créer une fonction

Étape 19

Tu es prêt! Désormais, chaque fois que vous téléchargerez/retrancherez 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 à partir de CloudFront, et non à partir du cache local.

PSS - Veuillez noter que seules les 1 000 premières invalidations de fichiers par mois sont gratuites, chaque invalidation dépassant la limite coûtant 0,005 USD. Des frais supplémentaires pour la fonction Lambda peuvent s’appliquer, mais c’est extrêmement bon marché.

10
Kainax

Avec l'API d'invalidation, elle est mise à jour en quelques minutes.
Départ PHP Invalidator .

10
anjanesh

Bucket Explorer a une interface utilisateur qui le rend très facile maintenant. Voici comment:

Faites un clic droit sur votre seau. Sélectionnez "Gérer les distributions".
Faites un clic droit sur votre distribution. Sélectionnez "Obtenir la liste d'invalidation de 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.

9
Leopd

Si vous avez boto installé (ce qui n'est pas juste pour python, mais installe également un tas d'utilitaires de ligne de commande utiles), il propose une utilitaire de ligne de commande spécifiquement appelée cfadmin ou 'front de nuage admin '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 invalidez les choses en exécutant:

$sam# cfadmin invalidate <distribution> <path>
4
samuraisam

Il suffit de poster pour informer les personnes visitant cette page (premier résultat sur 'Cloudfront File Refresh') qu'il existe un + accès facile à utiliser invalidateur en ligne disponible sur swook.net

Ce nouvel invalidateur est:

  • Entièrement en ligne (pas d'installation)
  • Disponible 24 heures sur 24, 7 jours sur 7 (hébergé par Google) et ne nécessite aucune adhésion.
  • Il existe un support de l'historique et une vérification du chemin pour vous permettre d'invalider facilement vos fichiers. (Souvent avec quelques clics après la première invalidation!)
  • C'est aussi très sécurisé, comme vous le découvrirez en lisant release post .

Divulgation complète: j'ai fait ceci. S'amuser!

3
swook

un moyen très facile de le faire est la version FOLDER.

Ainsi, si vos fichiers statiques sont des centaines, par exemple, il suffit de tous les placer dans un dossier appelé year + versioning.

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

Donc, dans mon code HTML, je mets toujours la référence dans le dossier. (Bien sûr, j'ai PHP inclure où j'ai défini le nom du dossier.) Donc, en changeant dans 1 fichier, il change réellement dans tous mes PHP des dossiers..

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

tout le HTML change automatiquement et demande le nouveau chemin, cache Cloudfront MISS et demande-le à la source.

Exemple: SOURCE.mydomain.com est ma source, cloudfront.mydomain.com est CNAME to Cloudfront Distribution.

Donc PHP a appelé ce fichier cloudfront.mydomain.com/2014_v1/javascript.js et quand je veux un rafraîchissement complet, je renomme simplement le dossier dans le code source en "2014_v2" et je change le = PHP inclure en définissant le dossier sur "2014_v2".

Comme cela, il n'y a pas de délai pour l'invalidation et AUCUN COÛT!

Ceci est mon premier article dans stackoverflow, j'espère que je l'ai bien fait!

3
MarcoP

invalidation actuelle de la prise en charge de l’AWS CLI en mode de prévisualisation. Exécutez les opérations suivantes dans votre console une fois:

aws configure set preview.cloudfront true

Je déploie mon projet Web à l'aide de npm. J'ai 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"
}

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

npm run deploy
2
Dmitry

En Ruby, utiliser le joyau du 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 en cas d'invalidation, le traitement et l'actualisation de l'invalidation sur tous les serveurs Amazon Edge prennent entre 5 et 10 minutes.

2
raycchan
2
Hml

Si vous utilisez AWS, vous utilisez probablement aussi 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 ceci. S'amuser!

1
RayLuo