Skip to content

Instantly share code, notes, and snippets.

@simenbrekken
Last active September 23, 2015 20:15
Show Gist options
  • Select an option

  • Save simenbrekken/50e943f22bdd46a51a39 to your computer and use it in GitHub Desktop.

Select an option

Save simenbrekken/50e943f22bdd46a51a39 to your computer and use it in GitHub Desktop.
Create CloudFront invalidations when S3 origin changes
var aws = require('aws-sdk');
var cloudFront = new aws.CloudFront();
function getDistributionDomains(distribution) {
return distribution.Origins.Items.map(function(origin) {
return origin.DomainName;
});
}
function findBucketDistributions(bucket, callback) {
cloudFront.listDistributions(function(err, data) {
if (err) {
return callback(err);
}
var distributions = data.Items.filter(function(distribution) {
return getDistributionDomains(distribution).some(function(domain) {
return domain.indexOf(bucket) === 0;
});
});
callback(null, distributions);
});
}
function createInvalidation(distribution, callerReference, key, callback) {
var path = '/' + key + '*';
var params = {
DistributionId: distribution.Id,
InvalidationBatch: {
CallerReference: callerReference,
Paths: {
Quantity: 1,
Items: [path]
}
}
};
cloudFront.createInvalidation(params, function(err, data) {
if (err) {
return callback(err);
}
console.log('Invalidating "%s" in distribution %s (%s)', path, distribution.Id, getDistributionDomains(distribution).join(', '));
callback(null, data.Invalidation);
});
}
exports.handler = function(event, context) {
var record = event.Records[0];
var bucket = record.s3.bucket.name;
var key = record.s3.object.key;
var requestId = record.responseElements['x-amz-request-id'];
findBucketDistributions(bucket, function(err, distributions) {
var distribution = distributions[0];
if (err || !distribution) {
return context.done(err);
}
createInvalidation(distribution, requestId, key, context.done);
});
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment