Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def ensure_ssh_key(name=None, base_name=__name__, verify_pem_file=True):
if name is None:
from getpass import getuser
from socket import gethostname
name = base_name + "." + getuser() + "." + gethostname().split(".")[0]
try:
ec2_key_pairs = list(resources.ec2.key_pairs.filter(KeyNames=[name]))
if verify_pem_file and not os.path.exists(get_ssh_key_path(name)):
msg = "Key {} found in EC2, but not in ~/.ssh."
msg += " Delete the key in EC2, copy it to {}, or specify another key."
raise KeyError(msg.format(name, get_ssh_key_path(name)))
except ClientError as e:
expect_error_codes(e, "InvalidKeyPair.NotFound")
ec2_key_pairs = None
if not ec2_key_pairs:
ssh_key = ensure_local_ssh_key(name)
resources.ec2.import_key_pair(KeyName=name,
PublicKeyMaterial=get_public_key_from_pair(ssh_key))
logger.info("Imported SSH key %s", get_ssh_key_path(name))
add_ssh_key_to_agent(name)
return name
class InstanceSpotFleetBuilder(SpotFleetBuilder):
def instance_types(self, **kwargs):
yield args.instance_type, 1
spot_fleet_builder = InstanceSpotFleetBuilder(**spot_fleet_args)
else:
spot_fleet_builder = SpotFleetBuilder(**spot_fleet_args)
logger.info("Launching {}".format(spot_fleet_builder))
sfr_id = spot_fleet_builder()
instances = []
while not instances:
res = clients.ec2.describe_spot_fleet_instances(SpotFleetRequestId=sfr_id)
instances = res["ActiveInstances"]
time.sleep(0 if instances else 1)
# FIXME: there may be multiple instances, and spot fleet provides no indication of whether the SFR is
# fulfilled
instance = resources.ec2.Instance(instances[0]["InstanceId"])
else:
if args.spot_price is None:
args.spot_price = get_spot_bid_price(args.instance_type)
logger.info("Bidding ${}/hour for a {} spot instance".format(args.spot_price, args.instance_type))
res = clients.ec2.request_spot_instances(
SpotPrice=str(args.spot_price),
ValidUntil=datetime.datetime.utcnow() + datetime.timedelta(hours=1),
LaunchSpecification=launch_spec,
ClientToken=args.client_token,
DryRun=args.dry_run
)
sir_id = res["SpotInstanceRequests"][0]["SpotInstanceRequestId"]
clients.ec2.get_waiter("spot_instance_request_fulfilled").wait(SpotInstanceRequestIds=[sir_id])
res = clients.ec2.describe_spot_instance_requests(SpotInstanceRequestIds=[sir_id])
instance = resources.ec2.Instance(res["SpotInstanceRequests"][0]["InstanceId"])
else:
def ensure_subnet(vpc, availability_zone=None):
if availability_zone is not None and availability_zone not in availability_zones():
msg = "Unknown availability zone {} (choose from {})"
raise AegeaException(msg.format(availability_zone, list(availability_zones())))
for subnet in vpc.subnets.all():
if availability_zone is not None and subnet.availability_zone != availability_zone:
continue
break
else:
from ipaddress import ip_network
from ... import config
subnet_cidrs = ip_network(str(config.vpc.cidr[ARN.get_region()])).subnets(new_prefix=config.vpc.subnet_prefix)
subnets = {}
for az, subnet_cidr in zip(availability_zones(), subnet_cidrs):
logger.info("Creating subnet with CIDR %s in %s, %s", subnet_cidr, vpc, az)
subnets[az] = resources.ec2.create_subnet(VpcId=vpc.id, CidrBlock=str(subnet_cidr), AvailabilityZone=az)
clients.ec2.get_waiter("subnet_available").wait(SubnetIds=[subnets[az].id])
add_tags(subnets[az], Name=__name__)
clients.ec2.modify_subnet_attribute(SubnetId=subnets[az].id,
MapPublicIpOnLaunch=dict(Value=config.vpc.map_public_ip_on_launch))
subnet = subnets[availability_zone] if availability_zone is not None else list(subnets.values())[0]
return subnet
def ensure_vpc():
for vpc in resources.ec2.vpcs.filter(Filters=[dict(Name="isDefault", Values=["true"])]):
break
else:
for vpc in resources.ec2.vpcs.all():
break
else:
from ... import config
logger.info("Creating VPC with CIDR %s", config.vpc.cidr[ARN.get_region()])
vpc = resources.ec2.create_vpc(CidrBlock=config.vpc.cidr[ARN.get_region()])
clients.ec2.get_waiter("vpc_available").wait(VpcIds=[vpc.id])
add_tags(vpc, Name=__name__)
vpc.modify_attribute(EnableDnsSupport=dict(Value=config.vpc.enable_dns_support))
vpc.modify_attribute(EnableDnsHostnames=dict(Value=config.vpc.enable_dns_hostnames))
internet_gateway = resources.ec2.create_internet_gateway()
vpc.attach_internet_gateway(InternetGatewayId=internet_gateway.id)
for route_table in vpc.route_tables.all():
route_table.create_route(DestinationCidrBlock="0.0.0.0/0", GatewayId=internet_gateway.id)
ensure_subnet(vpc)
return vpc
def acls(args):
page_output(filter_and_tabulate(resources.ec2.network_acls, args))
def find_devnode(volume_id):
if os.path.exists("/dev/disk/by-id"):
for devnode in os.listdir("/dev/disk/by-id"):
if "Elastic_Block_Store" in devnode and volume_id.replace("-", "") in devnode:
return "/dev/disk/by-id/" + devnode
if os.path.exists("/dev/disk/by-label/" + get_fs_label(volume_id)):
return "/dev/disk/by-label/" + get_fs_label(volume_id)
attachment = resources.ec2.Volume(volume_id).attachments[0]
if get_metadata("instance-id") == attachment["InstanceId"] and os.path.exists("/dev/" + attachment["Device"]):
return "/dev/" + attachment["Device"]
raise Exception("Could not find devnode for {}".format(volume_id))
def describe_peer(peer):
if "CidrIp" in peer:
if peer["CidrIp"] not in peer_desc_cache:
peer_desc_cache[peer["CidrIp"]] = describe_cidr(peer["CidrIp"])
return peer["CidrIp"], peer_desc_cache[peer["CidrIp"]]
else:
if peer["GroupId"] not in peer_desc_cache:
peer_desc_cache[peer["GroupId"]] = resources.ec2.SecurityGroup(peer["GroupId"])
return peer_desc_cache[peer["GroupId"]].group_name, peer_desc_cache[peer["GroupId"]].description
raise AegeaException("Unrecognized partition {}".format(partition))
manifest_url = "https://cloud-images.ubuntu.com/{channel}/streams/v1/com.ubuntu.cloud:{stream}:{partition}.json"
manifest_url = manifest_url.format(partition=partition, channel=channel, stream=stream)
manifest = requests.get(manifest_url).json()
if product not in manifest["products"]:
raise AegeaException("Ubuntu version {} not found in Ubuntu cloud image manifest".format(product))
versions = manifest["products"][product]["versions"]
for version in sorted(versions.keys(), reverse=True)[:8]:
for ami in versions[version]["items"].values():
if ami["crsn"] == region and ami["root_store"] == root_store and ami["virt"] == virt:
logger.info("Found %s for %s", ami["id"], ":".join([product, version, region, root_store, virt]))
return ami["id"]
elif product.startswith("Amazon Linux"):
filters = {"root-device-type": "ebs" if root_store == "ssd" else root_store, "virtualization-type": virt,
"architecture": "x86_64", "owner-alias": "amazon", "state": "available"}
images = resources.ec2.images.filter(Filters=[dict(Name=k, Values=[v]) for k, v in filters.items()])
for image in sorted(images, key=lambda i: i.creation_date, reverse=True):
if root_store == "ebs" and not image.name.endswith("x86_64-gp2"):
continue
if image.name.startswith("amzn-ami-" + virt) and image.description.startswith(product):
return image.image_id
raise AegeaException("No AMI found for {} {} {} {}".format(product, region, root_store, virt))