def launch_spot(props, ami_id): # Connect to EC2 ec2 = connect_ec2() ['LaunchSpecification']['ImageId'] = ami_id # Request spot instance spot = ec2.meta.client.request_spot_instances(**props) return spot
def launch(k, config=None): # Load configuration if not config: with open(CONFIG_FILE) as file: config = json.load(file) instance_type = config[k]['type'] props = config[k]['props'] ami_tags = config[k]['ami-tags'] # overwrite DryRung prop props['DryRun'] = True if DRY_RUN else False # Connect to EC2 ec2 = connect_ec2() # Get ami ami = get_latest_ami(ec2, dict2tags(tags2dict(ami_tags), filters=True))[0] if instance_type == 'instance': launch_instance(props, ami.id) elif instance_type == 'spot': launch_spot(props, ami.id) elif instance_type == 'fleet': launch_fleet(props, ami.id) else: raise ValueError('unknown instance type {0}'.format(instance_type))
def launch_fleet(props, ami_id): # Connect to EC2 ec2 = connect_ec2() instance_types = props['SpotFleetRequestConfig'].pop('InstanceTypes') key_name = props['SpotFleetRequestConfig'].pop('KeyName') security_groups = props['SpotFleetRequestConfig'].pop("SecurityGroups") props['SpotFleetRequestConfig']['LaunchSpecifications'] = [] for itype in instance_types: props['SpotFleetRequestConfig']['LaunchSpecifications'].append( { "ImageId": ami_id, "InstanceType": itype, "KeyName": key_name, "SecurityGroups": security_groups } ) # Request spot instance spot = ec2.meta.client.request_spot_fleet(**props) return spot
def get_fleet_id_from_instance_id(instance_id): # connect ec2 = connect_ec2() # Get fleet request sfrcs = ec2.meta.client.describe_spot_fleet_requests( )["SpotFleetRequestConfigs"] # Filter active fleet request: active_ids = [] for sfrc in sfrcs: if sfrc['SpotFleetRequestState'] == 'active': active_ids.append(sfrc['SpotFleetRequestId']) # Loop through active fleet to spot instance_id for sfid in active_ids: res = ec2.meta.client.describe_spot_fleet_instances( SpotFleetRequestId=sfid)['ActiveInstances'] for r in res: if instance_id in r['InstanceId']: return sfid raise None
# -*- coding: utf-8 -*- """Update instance tags either based on AMI tag (if tags is empty, i.e. this is a newly launched instance) or based on instance current tags and newly fetched data (i.e. after a new deploy for instance)""" from __future__ import unicode_literals, absolute_import from aws import connect_ec2, get_local_instance_id, tag_instance, \ associate_elastic_ip from time import sleep if __name__ == '__main__': # Get local instance id instance_id = get_local_instance_id() # Connect to EC2 ec2 = connect_ec2() # Build tags tag_instance(ec2, instance_id) # Associate elastic IP associate_elastic_ip(ec2, instance_id) # Go to sleep for 10 sec sleep(20)
def cancel_and_restart(): # connect ec2 = connect_ec2() # Get local instance instance_id = get_local_instance_id() instance = list(ec2.instances.filter(InstanceIds=[instance_id]))[0] # Get relate spot and fleet ids spot_id = instance.spot_instance_request_id fleet_id = get_fleet_id_from_instance_id(instance_id) # Get latest AMI for instance d = tags2dict(instance.tags) d.pop('Name', None) for key in list(d.keys()): if key.startswith('aws:'): d.pop(key) ami = get_latest_ami(ec2, dict2tags(d, filters=True))[0] if fleet_id: # spot instance from fleet # Get fleet config fleet = ec2.meta.client.describe_spot_fleet_requests( SpotFleetRequestIds=[fleet_id]) # Cancel related fleet request ec2.meta.client.cancel_spot_fleet_requests( SpotFleetRequestIds=[fleet_id], TerminateInstances=False) # Update config with new amis props = fleet['SpotFleetRequestConfigs'][0]['SpotFleetRequestConfig'] for ins in props['LaunchSpecifications']: ins['ImageId'] = ami.id ins.pop('BlockDeviceMappings', None) props.pop('ValidFrom', None) props.pop('ClientToken', None) props['ValidUntil'] = VALID_UNTIL # Start a new fleet with latest ami ec2.meta.client.request_spot_fleet(DryRun=DRY_RUN, SpotFleetRequestConfig=props) elif spot_id: # spot instance not from fleet # Describe spot instance spot = ec2.meta.client.describe_spot_instance_requests( SpotInstanceRequestIds=[spot_id]) # Cancel spot request instance ec2.meta.client.cancel_spot_instance_requests( SpotInstanceRequestIds=[spot_id]) # start a spot request with latest ami props = SPOT_TEMPLATE last_spot = spot['SpotInstanceRequests'][0] props['LaunchSpecification']['ImageId'] = ami.id props['SpotPrice'] = last_spot['SpotPrice'] props['LaunchSpecification']['InstanceType'] = \ last_spot['LaunchSpecification']['InstanceType'] props['DryRun'] = DRY_RUN ec2.meta.client.request_spot_instances(**props) else: raise EnvironmentError('Not a spot instance') # Try a clean service shutdown subprocess.call(["supervisorctl", "stop", "all"])
def launch_instance(props, ami_id): # Connect to EC2 ec2 = connect_ec2() # Create instance ins = ec2.create_instances(ImageId=ami_id, **props)[0] return ins