Skip to content

Instantly share code, notes, and snippets.

@scholtenmartijn
Last active May 30, 2016 09:22
Show Gist options
  • Save scholtenmartijn/448c37db6a63dbb12d269a4d748fdf5a to your computer and use it in GitHub Desktop.
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.
'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