2015-07-23 21 views
9

Ho un'app AngularJS distribuita in S3 & CloudFront. Il mio processo di compilazione via Grunt & Jenkins include un passo FileRev per nominare in modo univoco ogni nuova versione del mio script & file JS del fornitore. Infine, FileRev aggiorna anche i miei tag di pagina 'index.html' per fare riferimento alle più recenti edizioni di versione dei miei file di script &.Amazon CloudFront Versioning 'index.html'

Tutto molto buono, tranne ...

Come raggiungo CloudFront di invalidare immediatamente 'index.html' in tutte le mie posizioni bordo, a corto di creare a livello di codice un nuovo invalidazione su ogni versione ??

Grazie!

+0

È possibile avere index.html con versione anche per ogni release se non vuoi invalidare. In questi casi su ogni release il tuo loadbalancer o proxy dovrebbe puntare al nuovo index.html Vorrei semplicemente chiamare invalidate su index.html avere aggiornato le versioni di tutte le altre risorse ui, piuttosto che fare tutto questo circo. – Dhananjay

+1

È possibile configurare Jenkins per utilizzare la CLI AWS per effettuare una chiamata per invalidare il file index.html in CloudFront https://docs.aws.amazon.com/cli/latest/reference/cloudfront/create-invalidation.html – JaredHatfield

+0

@ Come hai risolto? –

risposta

2

Ecco come è possibile farlo a livello di programmazione. Questo dovrebbe essere parte del tuo script di distribuzione. Ci sarà solo invalidare index.html dato che stiamo già delle versioni delle altre risorse attraverso i loro nomi di file:

const aws = require('aws-sdk') 

function invalidateIndex() { 
    const client = new aws.CloudFront({ 
    accessKeyId: process.env.AWS_ACCESS_ID, 
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, 
    }) 
    const invalidation = client.createInvalidation({ 
    DistributionId: process.env.AWS_CLOUDFRONT_DISTRIBUTION_ID, /* required */ 
    InvalidationBatch: { 
     /* required */ 
     CallerReference: Date.now() + '', /* required - request ID given by you, any string is okay*/ 
     Paths: { 
     /* required */ 
     Quantity: 1, /* required */ 
     Items: [ 
      '/', 
      /* more items */ 
     ] 
     } 
    } 
    }, function (err, data) { 
    if (err) console.log(err, err.stack); // an error occurred 
    else  console.log('Index was invalidated with invalidation id: ', data.Invalidation.Id);   // successful response 
    }) 
} 

invalidateIndex() 

Puoi leggere altro nella documentazione delle API qui: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CloudFront.html#createInvalidation-property

+0

Non hai bisogno di specificare /index.html come elemento? Ottimo post grazie. – Learner

+0

@Learner è gestito da 'Items: ['/']' – amit