Пример #1
0
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
Пример #2
0
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))
Пример #3
0
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
Пример #5
0
# -*- 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"])
Пример #7
0
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