2015-07-23 15 views
9

Ich habe eine AngularJS App in S3 & CloudFront eingesetzt. Mein Build-Prozess über Grunt & Jenkins enthält einen FileRev-Schritt, um jede neue Version meines Skripts & Vendor JS-Dateien eindeutig zu benennen. Schließlich aktualisiert FileRev auch meine 'index.html' Seiten-Tags, um auf die neuesten versionierten Editionen meines Skripts & Herstellerdateien zu verweisen.Amazon CloudFront Versionierung 'index.html'

All sehr gut, außer ...

Wie erhalte ich Cloudfront sofort ungültig ‚index.html‘ in allen meinen Randpositionen, kurz programmatisch auf jeder Veröffentlichung eine neue Ungültigkeits zu schaffen ??

Danke!

+0

Sie index.html auch für jedes Release versioniert haben können wenn Sie nicht ungültig machen wollen. In solchen Fällen müßte Ihr Loadbalancer oder Proxy bei jedem Release auf new index.html verweisen. Ich würde einfach invalidate auf index.html aufrufen, habe die Versionen aller anderen ui-Ressourcen aktualisiert, anstatt all diesen Zirkus zu machen. – Dhananjay

+1

Sie können Jenkins so konfigurieren, dass die AWS-CLI verwendet wird, um die Datei index.html in CloudFront zu invalidieren. Https://docs.aws.amazon.com/cli/latest/reference/cloudfront/create-invalidation.html – JaredHatfield

+0

@ EarlD wie hast du es gelöst? –

Antwort

2

Hier ist, wie Sie dies programmgesteuert tun können. Dies sollte ein Teil Ihres Bereitstellungsskripts sein. Wir werden nur index.html ungültig, da wir bereits die anderen Ressourcen über ihre Dateinamen Versionierung sind:

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

Sie mehr in der API-Dokumentation hier lesen: http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/CloudFront.html#createInvalidation-property

+0

Sie müssen nicht /index.html als das Element angeben? Großer Beitrag danke. – Learner

+0

@Learner dies wird von 'Items: ['/']' behandelt – amit

Verwandte Themen