The following Lambda function can be used to watch a S3 bucket for new code to deploy using AWS Code Deploy. The zip file added to S3 requires the application-name and deploymentgroup-name metadata to associate with a Code Deploy application name and deployment group name.
Further details: https://blogs.aws.amazon.com/application-management/post/Tx3TPMTH0EVGA64/Automatically-Deploy-from-Amazon-S3-using-AWS-CodeDeploy
var aws = require('aws-sdk');
var s3 = new aws.S3({apiVersion: '2006-03-01'});
var codedeploy = new aws.CodeDeploy();
var artifact_type;
var bucket;
var key;
exports.handler = function(event, context)
{
/* runtime functions */
function getS3ObjectAndCreateDeployment()
{
// Get the s3 object to fetch application-name and deploymentgroup-name metadata.
console.log("New Code Deploy Started: " + bucket + " : " + key);
s3.headObject(
{
Bucket: bucket,
Key: key
},
function(err, data)
{
if (err)
{
console.log(err);
context.done('Error', 'Error getting s3 object: ' + err);
}
else
{
createDeployment(data);
}
});
}
function createDeployment(data)
{
//console.log('Creating deployment');
//return;
if (!data.Metadata['application-name'] || !data.Metadata['deploymentgroup-name'])
{
console.error('application-name and deploymentgroup-name object metadata must be set.');
context.done();
}
var params =
{
applicationName: data.Metadata['application-name'],
deploymentGroupName: data.Metadata['deploymentgroup-name'],
description: 'Lambda invoked codedeploy deployment',
ignoreApplicationStopFailures: false,
revision:
{
revisionType: 'S3',
s3Location:
{
bucket: bucket,
bundleType: artifact_type,
key: key
}
}
};
codedeploy.createDeployment(params,
function (err, data)
{
if (err)
{
console.log(err);
context.done('Error','Error creating deployment: ' + err);
}
else
{
//console.log(data); // successful response
//console.log('Finished executing lambda function');
console.log("New Code Deploy Completed: " + bucket + " : " + key);
context.done();
}
});
}
//console.log('s3 upload happened');
//console.log('Received event:');
//console.log(JSON.stringify(event, null, ' '));
// Get the object from the event
//console.log('get bucket');
bucket = event.Records[0].s3.bucket.name;
//console.log('get key');
key = event.Records[0].s3.object.key;
//console.log('s3 upload happened');
tokens = key.split('.');
//console.log(tokens);
artifact_type = tokens[tokens.length - 1];
//console.log(artifact_type);
if (artifact_type == 'gz')
{
artifact_type = 'tgz';
}
else if (artifact_type == 'zip')
{
artifact_type = 'tar';
}
//else if (['zip', 'tar', 'tgz'].indexOf(artifact_type) < 0)
//{
// artifact_type = 'tar';
//}
//console.log(artifact_type);
getS3ObjectAndCreateDeployment();
};