Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
if res.strip() != "[]":
raise Exception("cloud-init encountered errors")
break
except Exception as e:
if "ENOENT" in str(e) or "EPERM" in str(e) or "No such file or directory" in str(e):
sys.stderr.write(".")
sys.stderr.flush()
time.sleep(1)
else:
raise
else:
raise Exception("cloud-init encountered errors")
sys.stderr.write(GREEN("OK") + "\n")
description = "Built by {} for {}".format(__name__, ARN.get_iam_username())
for existing_ami in resources.ec2.images.filter(Owners=["self"], Filters=[{"Name": "name", "Values": [args.name]}]):
logger.info("Deleting existing image {}".format(existing_ami))
existing_ami.deregister()
image = instance.create_image(Name=args.name, Description=description, BlockDeviceMappings=get_bdm())
tags = dict(tag.split("=", 1) for tag in args.tags)
base_ami = resources.ec2.Image(args.ami)
tags.update(Owner=ARN.get_iam_username(), AegeaVersion=__version__,
Base=base_ami.id, BaseName=base_ami.name, BaseDescription=base_ami.description or "")
add_tags(image, **tags)
logger.info("Waiting for %s to become available...", image.id)
clients.ec2.get_waiter("image_available").wait(ImageIds=[image.id])
while resources.ec2.Image(image.id).state != "available":
sys.stderr.write(".")
sys.stderr.flush()
time.sleep(1)
instance.terminate()
return dict(ImageID=image.id, **tags)
else:
raise
else:
raise Exception("cloud-init encountered errors")
sys.stderr.write(GREEN("OK") + "\n")
description = "Built by {} for {}".format(__name__, ARN.get_iam_username())
for existing_ami in resources.ec2.images.filter(Owners=["self"], Filters=[{"Name": "name", "Values": [args.name]}]):
logger.info("Deleting existing image {}".format(existing_ami))
existing_ami.deregister()
image = instance.create_image(Name=args.name, Description=description, BlockDeviceMappings=get_bdm())
tags = dict(tag.split("=", 1) for tag in args.tags)
base_ami = resources.ec2.Image(args.ami)
tags.update(Owner=ARN.get_iam_username(), AegeaVersion=__version__,
Base=base_ami.id, BaseName=base_ami.name, BaseDescription=base_ami.description or "")
add_tags(image, **tags)
logger.info("Waiting for %s to become available...", image.id)
clients.ec2.get_waiter("image_available").wait(ImageIds=[image.id])
while resources.ec2.Image(image.id).state != "available":
sys.stderr.write(".")
sys.stderr.flush()
time.sleep(1)
instance.terminate()
return dict(ImageID=image.id, **tags)
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 watch(args):
_, cluster, task_id = ARN(args.task_arn).resource.split("/")
logger.info("Watching task %s (%s)", task_id, cluster)
last_status, events_received = None, 0
while last_status != "STOPPED":
res = clients.ecs.describe_tasks(cluster=cluster, tasks=[args.task_arn])
if len(res["tasks"]) == 1:
task_desc = res["tasks"][0]
if task_desc["lastStatus"] != last_status:
logger.info("Task %s %s", args.task_arn, format_task_status(task_desc["lastStatus"]))
last_status = task_desc["lastStatus"]
try:
for event in CloudwatchLogReader("/".join([args.task_name, args.task_name, task_id]),
log_group_name=args.task_name):
print(str(Timestamp(event["timestamp"])), event["message"])
events_received += 1
except ClientError as e:
expect_error_codes(e, "ResourceNotFoundException")
if last_status is None and events_received > 0:
def delete(self, name, value=None, record_type="CNAME", missing_ok=True):
if value is None:
res = clients.route53.list_resource_record_sets(HostedZoneId=self.zone_id,
StartRecordName=name + "." + self.zone["Name"],
StartRecordType=record_type)
for rrs in res["ResourceRecordSets"]:
if rrs["Name"] == name + "." + self.zone["Name"] and rrs["Type"] == record_type:
value = rrs["ResourceRecords"]
break
else:
msg = "Could not find {t} record {n} in Route53 zone {z}"
msg = msg.format(t=record_type, n=name, z=self.zone["Name"])
if missing_ok:
logger.warn(msg)
return
else:
raise AegeaException(msg)
return self.update(name, value, action="DELETE", record_type=record_type)
def get_kms_auth_token(session, bless_config, lambda_regional_config):
logger.info("Requesting new KMS auth token in %s", lambda_regional_config["aws_region"])
token_not_before = datetime.datetime.utcnow() - datetime.timedelta(minutes=1)
token_not_after = token_not_before + datetime.timedelta(hours=1)
token = dict(not_before=token_not_before.strftime("%Y%m%dT%H%M%SZ"),
not_after=token_not_after.strftime("%Y%m%dT%H%M%SZ"))
encryption_context = {
"from": session.resource("iam").CurrentUser().user_name,
"to": bless_config["lambda_config"]["function_name"],
"user_type": "user"
}
kms = session.client('kms', region_name=lambda_regional_config["aws_region"])
res = kms.encrypt(KeyId=lambda_regional_config["kms_auth_key_id"],
Plaintext=json.dumps(token),
EncryptionContext=encryption_context)
return base64.b64encode(res["CiphertextBlob"]).decode()