Last active
May 30, 2016 09:22
-
-
Save scholtenmartijn/448c37db6a63dbb12d269a4d748fdf5a to your computer and use it in GitHub Desktop.
Lambda for deleting a bucket and route53 record set based on a Github delete branch event.
This file contains 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
'use strict'; | |
console.log('Loading function'); | |
// Steps: | |
// First check if it is a delete event and then do the following: | |
// 1 - Empty and Remove bucket of the feature branch | |
// 2 - Delete resourcerecordset of the feature branch | |
var AWS = require('aws-sdk'); | |
// Set your region for future requests. | |
AWS.config.update({region: 'eu-west-1'}); // e.g. eu-west-1 | |
var s3 = new AWS.S3(); | |
var route53 = new AWS.Route53({apiVersion: '2013-04-01'}); | |
exports.handler = (event, context) => { | |
// Extract the GitHub event | |
var message = JSON.parse(event.Records[0].Sns.Message); | |
console.log('From SNS:', message); | |
// Check if a branch is being deleted | |
if(message.hasOwnProperty('deleted') && message.hasOwnProperty('forced') && message.deleted && message.forced) { | |
const addition = '.yourdomain.com'; | |
// Example: ref = refs/heads/feature/SD-1337/test-branch | |
const ref = message.ref; | |
// Need to extract feature name, we use: SD-XXX | |
// For example: SD-1337 | |
const regEx = /[A-Z][A-Z]-[0-9]*/; | |
const featureName = regEx.exec(ref); | |
if(featureName !== null && featureName !== undefined) { | |
const awsName = featureName + addition; | |
// Bucketname and Route53 record set are all lowercase. | |
clearBucket(s3, awsName.toLowerCase()); | |
removeRoute53(route53, awsName.toLowerCase()); | |
} | |
} | |
}; | |
function removeRoute53(route53Client, name) { | |
var params = { | |
"HostedZoneId": "XXXXXXXXXXXXX", | |
"ChangeBatch": { | |
"Changes": [ | |
{ | |
"Action": "DELETE", | |
"ResourceRecordSet": { | |
"Name": name, | |
"Type": "A", | |
"AliasTarget": { | |
"HostedZoneId": "Z1BKCTXD74EZPE", | |
"EvaluateTargetHealth": false, | |
"DNSName": "s3-website-eu-west-1.amazonaws.com." | |
} | |
} | |
} | |
] | |
} | |
}; | |
route53Client.changeResourceRecordSets(params, function(err,data) { | |
if (err) console.log(err, err.stack); // an error occurred | |
else console.log(data); // successful response | |
}); | |
} | |
function deleteBucket(s3Client, bucket) { | |
s3Client.deleteBucket({Bucket: bucket}, function (err, data) { | |
if (err) console.log(err, err.stack); // an error occurred | |
else console.log(data); // successful response | |
}); | |
} | |
function clearBucket(s3Client, bucket) { | |
s3Client.listObjects({Bucket: bucket}, function (err, data) { | |
if (err) { | |
console.log("error listing bucket objects "+err); | |
return; | |
} | |
var items = data.Contents; | |
for (var i = 0; i < items.length; i += 1) { | |
var deleteParams = {Bucket: bucket, Key: items[i].Key}; | |
deleteObject(s3Client, deleteParams); | |
} | |
}); | |
// Somewhat hacky solution to make sure the bucket is empty before deleting. | |
setTimeout(function() { | |
deleteBucket(s3Client, bucket); | |
}, 2000); | |
} | |
function deleteObject(s3Client, deleteParams) { | |
s3Client.deleteObject(deleteParams, function (err, data) { | |
if (err) console.log("delete err " + deleteParams.Key); // an error occurred | |
else console.log("deleted " + deleteParams.Key); // successful response | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment