Last active
September 23, 2015 20:15
-
-
Save simenbrekken/50e943f22bdd46a51a39 to your computer and use it in GitHub Desktop.
Create CloudFront invalidations when S3 origin changes
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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