Skip to content

Instantly share code, notes, and snippets.

@aarondodd
Created February 28, 2018 15:53
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save aarondodd/3f0f3f81c82dc5cce1a828ecc904a6b9 to your computer and use it in GitHub Desktop.
Save aarondodd/3f0f3f81c82dc5cce1a828ecc904a6b9 to your computer and use it in GitHub Desktop.
lambda function to replace AMI in launch config and apply to autoscaling group, keeping root volume information
from __future__ import print_function
import json
import datetime
import time
import boto3
print('Loading function')
def lambda_handler(event, context):
print("Received event: " + json.dumps(event, indent=2))
# get autoscaling client
client = boto3.client('autoscaling')
clientEc2 = boto3.client('ec2')
# get object for the ASG we're going to update, filter by name of target ASG
response = client.describe_auto_scaling_groups(AutoScalingGroupNames=[event['targetASG']])
if not response['AutoScalingGroups']:
return 'No such ASG'
# get name of InstanceID in current ASG that we'll use to model new Launch Configuration after
sourceInstanceId = response.get('AutoScalingGroups')[0]['Instances'][0]['InstanceId']
# get the snapshotID of the source AMI
responseAmi = clientEc2.describe_images(ImageIds=[event['newAmiID']])
sourceAmiSnapshot = responseAmi.get('Images')[0]['BlockDeviceMappings'][0]['Ebs']['SnapshotId']
print('New source AMI: ' + event['newAmiID'] + " has snapshot ID: " + sourceAmiSnapshot)
# get block device mapping (by default boto doesn't copy this)
sourceLaunchConfig = response.get('AutoScalingGroups')[0]['LaunchConfigurationName']
print('current launch config name:' + sourceLaunchConfig)
responseLC = client.describe_launch_configurations(LaunchConfigurationNames=[sourceLaunchConfig])
#print(responseLC)
sourceBlockDevices = responseLC.get('LaunchConfigurations')[0]['BlockDeviceMappings']
print('Current LC block devices:')
print(sourceBlockDevices[0]['Ebs'])
sourceBlockDevices[0]['Ebs']['SnapshotId'] = sourceAmiSnapshot
print('New LC block devices (snapshotID changed):')
print(sourceBlockDevices[0]['Ebs'])
# create LC using instance from target ASG as a template, only diff is the name of the new LC and new AMI
timeStamp = time.time()
timeStampString = datetime.datetime.fromtimestamp(timeStamp).strftime('%Y-%m-%d-%H-%M-%S')
newLaunchConfigName = event['targetASG'] + '_'+ event['newAmiID'] + '_' + timeStampString
print('new launch config name: ' + newLaunchConfigName)
client.create_launch_configuration(
InstanceId = sourceInstanceId,
LaunchConfigurationName=newLaunchConfigName,
ImageId= event['newAmiID'],
BlockDeviceMappings = sourceBlockDevices )
# update ASG to use new LC
response = client.update_auto_scaling_group(AutoScalingGroupName = event['targetASG'],LaunchConfigurationName = newLaunchConfigName)
return 'Updated ASG `%s` with new launch configuration `%s` which includes AMI `%s`.' % (event['targetASG'], newLaunchConfigName, event['newAmiID'])
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment