Domanda

Sto usando CloudFront di Amazon per servire i file statici delle mie applicazioni web.

Non c'è un modo per raccontare una distribuzione CloudFront che ha bisogno di aggiornare sia file o indicare un unico file che deve essere aggiornata?

Amazon consiglia di versione dei file come logo_1.gif, logo_2.gif e così via come una soluzione per questo problema, ma che sembra una soluzione abbastanza stupido. C'è assolutamente nessun altro modo?

È stato utile?

Soluzione

Una buona notizia. Amazon, infine, ha aggiunto un Feature invalidazione. Vedere le API Reference .

Questa è una richiesta campione dalla API Reference:

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>

Altri suggerimenti

A partire dal 19 marzo Amazon ora consente la cache TTL di Cloudfront di essere 0 secondi, quindi è (teoricamente) non dovrebbe mai vedere gli oggetti non aggiornati. Quindi, se avete il vostro patrimonio in S3, si potrebbe semplicemente andare al Pannello Web AWS => S3 => Modifica proprietà => Metadata, quindi impostare il valore di "Cache-Control" a "max-age = 0".

Questa è retta dal :

  

Per controllare se CloudFront memorizza nella cache un oggetto e per quanto tempo, si consiglia di utilizzare l'intestazione Cache-Control con il max-age = direttiva. CloudFront memorizza l'oggetto per il numero specificato di secondi. (Il valore minimo è 0 secondi.)

Con l'API di invalidazione, che viene aggiornato in pochi minuti.
Scopri PHP della convalida .

Impostazione aggiornamento automatico in 5 minuti

OK, ragazzi. Il miglior modo possibile per il momento di eseguire l'aggiornamento automatico CloudFront (invalidazione) è quello di creare la funzione Lambda che verrà attivato ogni volta che un file viene caricato a S3 secchio (uno nuovo o riscritta).

Anche se non hai mai usato funzioni lambda prima, è davvero facile - basta seguire le mie istruzioni passo-passo e ci vorrà a soli 5 minuti:

Passaggio 1

https://console.aws.amazon.com/lambda/home e fai clic su Creare una funzione lambda

Passaggio 2

Fare clic su vuoto Funzione (personalizzato)

Passaggio 3

Clicca sulla scatola vuota (accarezzato) e selezionare S3 dal combo

Passaggio 4

Seleziona il tuo Benna (lo stesso per la distribuzione CloudFront)

Passaggio 5

Imposta un Tipo di evento per "oggetto creato (Tutti)"

Passaggio 6

Imposta prefisso e suffisso o lasciare vuoto se non si sa cosa sia.

Passaggio 7

Verifica Attiva grilletto casella di controllo e fare clic su Avanti

Passaggio 8

un nome alla funzione (qualcosa come: YourBucketNameS3ToCloudFrontOnCreateAll )

Punto 9

Seleziona Python 2.7 (o successivo) come Runtime

Punto 10

Incolla seguente codice al posto di codice Python di default:

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())
            })

Passaggio 11

Apri https://console.aws.amazon.com/cloudfront/home in una nuova scheda del browser e copiare l'ID distribuzione CloudFront per l'utilizzo in fase successiva.

Passaggio 12

Ritornare alla scheda lambda e incollare il vostro ID Distribution, invece di _YOUR_DISTRIBUTION_ID_ nel codice Python. Mantenere citazioni circostante.

Passaggio 13

Imposta handler : lambda_function.lambda_handler

Passaggio 14

Fare clic sul ruolo Casella combinata e selezionare Crea un ruolo personalizzato . sarà aperto nuova scheda nel browser.

Passaggio 15

Fare clic su Visualizza documento politico , fai clic su modifica , fai clic su OK e sostituire definizione dei ruoli con i seguenti (come è):

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

Passaggio 16

Fare clic su permettere . In questo modo si tornerà a un lambda. Doppia verificare che nome del ruolo appena creato sia selezionato nel ruolo esistente combobox.

Passaggio 17

Imposta Memoria (MB) per 128 e Timeout per 5 sec.

Passaggio 18

Fare clic su Avanti , quindi su Crea funzione

Passaggio 19

Siete pronti per partire! Ora in poi, ogni volta che si caricare / ricaricare qualsiasi tipo di file a S3, sarà valutata in tutte le sedi di Edge CloudFront.

PS - Quando si esegue il test, assicurarsi che il browser sta caricando le immagini da CloudFront, non dalla cache locale

.

PSS - Si prega di notare che solo il primo 1000 file invalidazione al mese sono gratuiti, ogni invalidazione oltre il limite costa $ 0,005 USD. Inoltre potrebbero essere applicati costi aggiuntivi per la funzione Lambda, ma è estremamente a buon mercato.

Secchio Explorer ha un'interfaccia utente che rende questo abbastanza facile ora. Ecco come:

Fare clic destro il secchio. Selezionare "Gestione Distribuzioni."
Tasto destro del mouse la vostra distribuzione. Selezionare "Get lista invalidazione Cloudfront" Quindi selezionare "Crea" per creare un nuovo elenco invalidazione. Selezionare i file da invalidare, e fare clic su "Invalidate". Attendere 5-15 minuti.

Se hai boto installato (che non è solo per Python, ma installa anche un gruppo di comando utile utilità della riga), offre una linea di comando util specificamente chiamato cfadmin o 'nube anteriore amministratore' che offre le seguenti funzionalità:

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

È invaliate cose eseguendo:

$sam# cfadmin invalidate <distribution> <path>

Proprio la pubblicazione di informare chiunque voglia visitare questa pagina (primo risultato su 'Aggiorna file Cloudfront') che v'è un facile da usare l'accesso della convalida on-line disponibile a + swook.net

Questa nuova della convalida è:

  • Fully online (nessuna installazione)
  • Disponibile 24x7 (ospitato da Google) e non richiede qualsiasi appartenenza.
  • V'è il supporto della storia, e il percorso controllando che consente di invalidare la file con facilità. (Spesso con pochi clic dopo invalidante per la prima volta!)
  • E 'anche molto sicuro, come scoprirete quando si legge la sua dopo il rilascio .

Full disclosure: ho fatto questo. Buon divertimento!

Un modo molto semplice per farlo è CARTELLA delle versioni.

Quindi, se i file statici sono centinaia, ad esempio, è sufficiente mettere tutti in una cartella chiamata per anno + il controllo delle versioni.

Ad esempio io uso una cartella chiamata 2014_v1 dove al suo interno ho tutti i miei file statici ...

Quindi, all'interno del mio HTML ho sempre messo il riferimento alla cartella. (Ovviamente ho un PHP include dove ho impostato il nome della cartella). Così, modificando in 1 file, in realtà cambia in tutti i miei file PHP ..

Se voglio un aggiornamento completo, ho semplicemente rinominare la cartella a 2014_v2 nella mia fonte e cambiare all'interno del PHP include a 2014_v2

tutti HTML cambia automaticamente e chiedere al nuovo percorso, la cache CloudFront MISS e richiedere alla fonte.

Esempio: SOURCE.mydomain.com è la mia fonte, cloudfront.mydomain.com è CNAME alla distribuzione CloudFront.

Così il PHP chiamato questo file cloudfront.mydomain.com/2014_v1/javascript.js e quando voglio un aggiornamento completo, semplicemente ho rinominare la cartella nella fonte a "2014_v2" e cambio il PHP include impostando la cartella di "2014_v2".

Ti piace questa non v'è alcun ritardo per l'invalidazione e gratuita!

Questo è il mio primo post in StackOverflow, spero ho fatto bene!

In ruby, utilizzando la gemma nebbia

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

anche su invalidazione, ci vuole ancora 5-10 minuti per l'invalidazione di elaborare e aggiornare su tutti i server edge amazon

corrente AWS CLI sostegno invalidazione in modalità anteprima. Eseguire il seguente nella console una volta:

aws configure set preview.cloudfront true

schiero il mio progetto web utilizzando NPM. Ho i seguenti script nella mia 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"
}

Avere gli script di cui sopra in luogo è possibile distribuire il tuo sito con:

npm run deploy

Se si sta utilizzando AWS, probabilmente anche di utilizzare il suo strumento ufficiale CLI (prima o poi). AWS CLI versione 1.9.12 o superiore supporta invalidare un elenco di nomi di file.

Full disclosure: ho fatto questo. Buon divertimento!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top