blockscout-terraform/lambda/AMIRefresher.js

131 lines
4.7 KiB
JavaScript

var aws = require('aws-sdk');
var https = require('https');
var url = require('url');
var util = require("util");
var ASGName = process.env.ASGName;
var AMIInstanceID = process.env.AMIInstanceID;
var LCName= process.env.LCName;
var OnlyAMICreation=process.env.ONLY_AMI_CREATION;
var AMIName =process.env.AMIName;
exports.handler = function(event, context, callback) {
var ec2 = new aws.EC2();
var autoscaling = new aws.AutoScaling();
// Create unique AMI and launch configuration names
var date = new Date();
var timestamp = date.getTime();
AMIName = AMIName+timestamp;
LCName = LCName+timestamp;
var AMIID, LC, OldASG;
// Either simply create an image or execute the whole function
if (OnlyAMICreation) { createImage(); }
else { describeASG(); }
// Get info about autoscaling groups and proceed to get info about Launch configuration
function describeASG()
{
var params = {
AutoScalingGroupNames: [
ASGName
]
};
autoscaling.describeAutoScalingGroups(params, function(err, data) {
if (err) console.log("Error", err, err.stack); // an error occurred
else OldASG=data; describeLC(); // successful response
});
}
// Get info about launch configuration and proceed to AMI creation
function describeLC()
{
var params = {
LaunchConfigurationNames: [
OldASG.AutoScalingGroups[0].LaunchConfigurationName
]
};
autoscaling.describeLaunchConfigurations(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else { LC=data; createImage(); } // successful response
});
}
// Create AMI and either proceed to create a new launch configuration or exit function
function createImage()
{
var params = {
Description: "Created by AMIRefresher function",
InstanceId: AMIInstanceID,
Name: AMIName,
NoReboot: true
};
ec2.createImage(params, function(err, data) {
if (err) console.log("Error!", err, err.stack); // an error occurred
else if (OnlyAMICreation) { process.exit(0); }
else { AMIID=data; createLC(); } // successful response
});
}
// Create new launch configuration and proceed to update an autoscaling group
function createLC()
{
var params = {
LaunchConfigurationName: LCName,
AssociatePublicIpAddress: LC.LaunchConfigurations[0].AssociatePublicIpAddress,
BlockDeviceMappings: LC.LaunchConfigurations[0].BlockDeviceMappings,
ClassicLinkVPCId: LC.LaunchConfigurations[0].ClassicLinkVPCId,
ClassicLinkVPCSecurityGroups: LC.LaunchConfigurations[0].ClassicLinkVPCSecurityGroups,
EbsOptimized: LC.LaunchConfigurations[0].EbsOptimized,
IamInstanceProfile: LC.LaunchConfigurations[0].IamInstanceProfile,
ImageId: AMIID.ImageId,
InstanceMonitoring: LC.LaunchConfigurations[0].InstanceMonitoring,
InstanceType: LC.LaunchConfigurations[0].InstanceType,
KeyName: LC.LaunchConfigurations[0].KeyName,
PlacementTenancy: LC.LaunchConfigurations[0].PlacementTenancy,
SecurityGroups: LC.LaunchConfigurations[0].SecurityGroups,
UserData: LC.LaunchConfigurations[0].UserData
};
autoscaling.createLaunchConfiguration(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else updateASG(); // successful response
});
}
// update an autoscaling group and proceed to cleanup
function updateASG()
{
var params = {
AutoScalingGroupName: ASGName,
LaunchConfigurationName: LCName
};
autoscaling.updateAutoScalingGroup(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else clean(); // successful response
});
}
// Cleanup and exit - delete old launch configuration and old AMI
function clean()
{
var params = {
LaunchConfigurationName: OldASG.AutoScalingGroups[0].LaunchConfigurationName
};
autoscaling.deleteLaunchConfiguration(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
var params = {
ImageId: LC.LaunchConfigurations[0].ImageId,
};
ec2.deregisterImage(params, function(err, data) {
if (err) console.log(err, err.stack); // an error occurred
else console.log(data); // successful response
});
}
};