def get_relevant_snapshots( conn, tag_name=DEFAULT_TAG_NAME, tag_value=DEFAULT_TAG_VALUE, native_only=True, filters={'status': SNAP_STATUSES}): """Returns snapshots with proper description.""" if tag_name and tag_value: filters.update({'tag:{0}'.format(tag_name): tag_value}) snaps = conn.get_all_snapshots(owner='self', filters=filters) is_described = lambda snap: get_snap_vol(snap) and get_snap_time(snap) snaps = [snp for snp in snaps if is_described(snp)] if native_only: is_native = lambda snp, reg: get_descr_attr(snp, 'Region') == reg.name snaps = [snp for snp in snaps if is_native(snp, conn.region)] return snaps
def launch_instance_from_ami(region_name, ami_id, inst_type=None, security_groups='', key_pair=None, zone_name=None, user_data=None): """Create instance from specified AMI. region_name location of the AMI and new instance; ami_id "ami-..." inst_type by default will be fetched from AMI description or used 't1.micro' if not mentioned in the description; security_groups list of AWS Security Groups names formatted as string separated with semicolon ';' key_pair name of key_pair to be granted access. Will be fetched from config by default, may be configured per region; zone_name in string format; user_data string with OS configuration commands.""" conn = get_region_conn(region_name) image = conn.get_all_images([ami_id])[0] inst_type = inst_type or get_descr_attr(image, 'Type') or 't1.micro' security_groups = filter(None, security_groups.strip(';').split(';')) security_groups.append(new_security_group(conn.region)) logger.info('Launching new instance in {reg} using {image}'.format( reg=conn.region, image=image)) inst = image.run(key_name=key_pair or config.get(conn.region.name, 'KEY_PAIR'), security_groups=security_groups, instance_type=inst_type, user_data=user_data or config.get('user_data', 'USER_DATA'), placement=zone_name).instances[0] wait_for(inst, 'running', limit=10 * 60) groups = [grp.name for grp in inst.groups] inst.add_tag('Security Groups', dumps(groups, separators=(',', ':'))) add_tags(inst, image.tags) modify_instance_termination(conn.region.name, inst.id) logger.info('{inst} created in {inst.placement}'.format(inst=inst)) info = ('\nYou may now SSH into the {inst} server, using:' '\n ssh -i {key} {user}@{inst.public_dns_name}') key_file = config.get(conn.region.name, 'KEY_FILENAME') logger.info(info.format(inst=inst, user=env.user, key=key_file)) return inst
def launch_instance_from_ami( region_name, ami_id, inst_type=None, security_groups='', key_pair=None, zone_name=None): """Create instance from specified AMI. region_name location of the AMI and new instance; ami_id "ami-..." inst_type by default will be fetched from AMI description or used 't1.micro' if not mentioned in the description; security_groups list of AWS Security Groups names formatted as string separated with semicolon ';' key_pair name of key_pair to be granted access. Will be fetched from config by default, may be configured per region; zone_name in string format.""" try: user_data = config.get('user_data', 'USER_DATA') except: user_data = None conn = get_region_conn(region_name) image = conn.get_all_images([ami_id])[0] inst_type = inst_type or get_descr_attr(image, 'Type') or 't1.micro' security_groups = filter(None, security_groups.strip(';').split(';')) security_groups.append(new_security_group(conn.region)) logger.info('Launching new instance in {reg} using {image}' .format(reg=conn.region, image=image)) inst = image.run( key_name=key_pair or config.get(conn.region.name, 'KEY_PAIR'), security_groups=security_groups, instance_type=inst_type, user_data=user_data, placement=zone_name).instances[0] wait_for(inst, 'running') groups = [grp.name for grp in inst.groups] inst.add_tag('Security Groups', dumps(groups, separators=(',', ':'))) add_tags(inst, image.tags) modify_instance_termination(conn.region.name, inst.id) logger.info('{inst} created in {inst.placement}'.format(inst=inst)) info = ('\nYou may now SSH into the {inst} server, using:' '\n ssh -i {key} {user}@{inst.public_dns_name}') key_file = config.get(conn.region.name, 'KEY_FILENAME') logger.info(info.format(inst=inst, user=env.user, key=key_file)) return inst
def create_ami(region, snap_id, force=None, root_dev='/dev/sda1', zone_name=None, default_arch=None, default_type='t1.micro', security_groups=''): """ Creates AMI image from given snapshot. Force option removes prompt request and creates new instance from created ami image. region, snap_id specify snapshot to be processed. Snapshot description in json format will be used to restore instance with same parameters. Will automaticaly process snapshots for same instance with near time (10 minutes or shorter), but for other devices (/dev/sdb, /dev/sdc, etc); force Run instance from ami after creation without confirmation. To enable set value to "RUN"; default_arch architecture to use if not mentioned in snapshot description; default_type instance type to use if not mentioned in snapshot description. Used only if ``force`` is "RUN"; security_groups list of AWS Security Groups names formatted as string separated with semicolon ';'. Used only if ``force`` is "RUN". """ conn = get_region_conn(region) snap = conn.get_all_snapshots(snapshot_ids=[snap_id, ])[0] instance_id = get_snap_instance(snap) _device = get_snap_device(snap) snaps = conn.get_all_snapshots(owner='self') snapshots = [snp for snp in snaps if get_snap_instance(snp) == instance_id and get_snap_device(snp) != _device and abs(get_snap_time(snap) - get_snap_time(snp)) <= timedelta(minutes=10)] snapshot = sorted(snapshots, key=get_snap_time, reverse=True) if snapshots else None # setup for building an EBS boot snapshot default_arch = default_arch or config.get('DEFAULT', 'ARCHITECTURE') arch = get_descr_attr(snap, 'Arch') or default_arch kernel = config.get(conn.region.name, 'KERNEL' + arch.upper()) dev = re.match(r'^/dev/sda$', _device) # if our instance encrypted if dev: kernel = config.get(conn.region.name, 'KERNEL_ENCR_' + arch.upper()) ebs = EBSBlockDeviceType() ebs.snapshot_id = snap_id ebs.delete_on_termination = True block_map = BlockDeviceMapping() block_map[_device] = ebs sdb = BlockDeviceType() sdb.ephemeral_name = 'ephemeral0' block_map['/dev/sdb'] = sdb if snapshot: for s in snapshot: s_dev = get_snap_device(s) s_ebs = EBSBlockDeviceType() s_ebs.delete_on_termination = True s_ebs.snapshot_id = s.id block_map[s_dev] = s_ebs name = 'Created {0} using access key {1}'.format(timestamp(), conn.access_key) name = name.replace(":", ".").replace(" ", "_") # create the new AMI all options from snap JSON description: wait_for(snap, '100%', limit=SNAP_TIME) result = conn.register_image( name=name, description=snap.description, architecture=get_descr_attr(snap, 'Arch') or default_arch, root_device_name=get_descr_attr(snap, 'Root_dev_name') or root_dev, block_device_map=block_map, kernel_id=kernel) sleep(2) image = conn.get_all_images(image_ids=[result, ])[0] wait_for(image, 'available', limit=10 * 60) add_tags(image, snap.tags) logger.info('The new AMI ID = {0}'.format(result)) new_instance = None if force == 'RUN': instance_type = get_descr_attr(snap, 'Type') or default_type new_instance = launch_instance_from_ami( region, image.id, inst_type=instance_type, security_groups=security_groups, zone_name=zone_name) return image, new_instance
def is_native(snap, region): return get_descr_attr(snap, 'Region') == region.name
def create_ami(region, snap_id, force=None, root_dev='/dev/sda1', zone_name=None, default_arch=None, default_type='t1.micro', security_groups=''): """ Creates AMI image from given snapshot. Force option removes prompt request and creates new instance from created ami image. region, snap_id specify snapshot to be processed. Snapshot description in json format will be used to restore instance with same parameters. Will automaticaly process snapshots for same instance with near time (10 minutes or shorter), but for other devices (/dev/sdb, /dev/sdc, etc); force Run instance from ami after creation without confirmation. To enable set value to "RUN"; default_arch architecture to use if not mentioned in snapshot description; default_type instance type to use if not mentioned in snapshot description. Used only if ``force`` is "RUN"; security_groups list of AWS Security Groups names formatted as string separated with semicolon ';'. Used only if ``force`` is "RUN". """ conn = get_region_conn(region) snap = conn.get_all_snapshots(snapshot_ids=[ snap_id, ])[0] instance_id = get_snap_instance(snap) _device = get_snap_device(snap) snaps = conn.get_all_snapshots(owner='self') snapshots = [ snp for snp in snaps if get_snap_instance(snp) == instance_id and get_snap_device(snp) != _device and abs(get_snap_time(snap) - get_snap_time(snp)) <= timedelta(minutes=10) ] snapshot = sorted(snapshots, key=get_snap_time, reverse=True) if snapshots else None # setup for building an EBS boot snapshot default_arch = default_arch or config.get('DEFAULT', 'ARCHITECTURE') arch = get_descr_attr(snap, 'Arch') or default_arch kernel = config.get(conn.region.name, 'KERNEL' + arch.upper()) dev = re.match(r'^/dev/sda$', _device) # if our instance encrypted if dev: kernel = config.get(conn.region.name, 'KERNEL_ENCR_' + arch.upper()) ebs = EBSBlockDeviceType() ebs.snapshot_id = snap_id ebs.delete_on_termination = True block_map = BlockDeviceMapping() block_map[_device] = ebs sdb = BlockDeviceType() sdb.ephemeral_name = 'ephemeral0' block_map['/dev/sdb'] = sdb if snapshot: for s in snapshot: s_dev = get_snap_device(s) s_ebs = EBSBlockDeviceType() s_ebs.delete_on_termination = True s_ebs.snapshot_id = s.id block_map[s_dev] = s_ebs name = 'Created {0} using access key {1}'.format(timestamp(), conn.access_key) name = name.replace(":", ".").replace(" ", "_") # create the new AMI all options from snap JSON description: wait_for(snap, '100%', limit=SNAP_TIME) result = conn.register_image( name=name, description=snap.description, architecture=get_descr_attr(snap, 'Arch') or default_arch, root_device_name=get_descr_attr(snap, 'Root_dev_name') or root_dev, block_device_map=block_map, kernel_id=kernel) sleep(2) image = conn.get_all_images(image_ids=[ result, ])[0] wait_for(image, 'available', limit=10 * 60) add_tags(image, snap.tags) logger.info('The new AMI ID = {0}'.format(result)) info = ('\nEnter RUN if you want to launch instance using ' 'just created {0}: '.format(image)) new_instance = None if force == 'RUN' or raw_input(info).strip() == 'RUN': instance_type = get_descr_attr(snap, 'Type') or default_type new_instance = launch_instance_from_ami( region, image.id, inst_type=instance_type, security_groups=security_groups, zone_name=zone_name) return image, new_instance