From ce3d2f4eba5e48553fa9ef88849adbbd16dc7a84 Mon Sep 17 00:00:00 2001 From: Marcel Radischat Date: Wed, 6 Jul 2016 16:52:07 +0200 Subject: [PATCH 1/2] Remove self requirement --- requirements.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 959eed0..a57c496 100644 --- a/requirements.txt +++ b/requirements.txt @@ -6,6 +6,5 @@ futures==3.0.5 jmespath==0.9.0 pyaml==15.8.2 python-dateutil==2.5.3 -python-lambda==0.2.0 PyYAML==3.11 six==1.10.0 \ No newline at end of file From 7b90f63e4f7090a5be87f1989170b3c8b8e3f761 Mon Sep 17 00:00:00 2001 From: Marcel Radischat Date: Wed, 6 Jul 2016 16:52:40 +0200 Subject: [PATCH 2/2] Add option to delete old versions of a lambda function Aliased versions and $Latest will never be deleted. --- aws_lambda/__init__.py | 2 +- aws_lambda/aws_lambda.py | 44 ++++++++++++++++++++++++++++++++++++++++ scripts/lambda | 7 +++++++ 3 files changed, 52 insertions(+), 1 deletion(-) diff --git a/aws_lambda/__init__.py b/aws_lambda/__init__.py index ef4487b..aad61f7 100755 --- a/aws_lambda/__init__.py +++ b/aws_lambda/__init__.py @@ -4,7 +4,7 @@ __email__ = 'nficano@gmail.com' __version__ = '0.4.0' -from .aws_lambda import deploy, invoke, init, build +from .aws_lambda import deploy, invoke, init, build, cleanup_old_versions # Set default logging handler to avoid "No handler found" warnings. import logging diff --git a/aws_lambda/aws_lambda.py b/aws_lambda/aws_lambda.py index 612484e..34190f5 100755 --- a/aws_lambda/aws_lambda.py +++ b/aws_lambda/aws_lambda.py @@ -8,6 +8,7 @@ from shutil import copy, copyfile from tempfile import mkdtemp +import botocore import boto3 import pip import yaml @@ -18,6 +19,49 @@ log = logging.getLogger(__name__) +def cleanup_old_versions(src, keep_last_versions): + """Deletes old deployed versions of the function in AWS Lambda. + + Won't delete $Latest and any aliased version + + :param str src: + The path to your Lambda ready project (folder must contain a valid + config.yaml and handler module (e.g.: service.py). + :param int keep_last_versions: + The number of recent versions to keep and not delete + """ + if keep_last_versions <= 0: + print("Won't delete all versions. Please do this manually") + else: + path_to_config_file = os.path.join(src, 'config.yaml') + cfg = read(path_to_config_file, loader=yaml.load) + + aws_access_key_id = cfg.get('aws_access_key_id') + aws_secret_access_key = cfg.get('aws_secret_access_key') + + client = get_client('lambda', aws_access_key_id, aws_secret_access_key, + cfg.get('region')) + + response = client.list_versions_by_function( + FunctionName=cfg.get("function_name") + ) + versions = response.get("Versions") + if len(response.get("Versions")) < keep_last_versions: + print("Nothing to delete. (Too few versions published)") + else: + version_numbers = [elem.get("Version") for elem in + versions[1:-keep_last_versions]] + for version_number in version_numbers: + try: + client.delete_function( + FunctionName=cfg.get("function_name"), + Qualifier=version_number + ) + except botocore.exceptions.ClientError as e: + print("Skipping Version {}: {}".format(version_number, + e.message)) + + def deploy(src, local_package=None): """Deploys a new function to AWS Lambda. diff --git a/scripts/lambda b/scripts/lambda index 02dc8b5..5ea9d01 100755 --- a/scripts/lambda +++ b/scripts/lambda @@ -38,9 +38,16 @@ def invoke(event_file, verbose): def deploy(local_package): aws_lambda.deploy(CURRENT_DIR, local_package) + +@click.command(help="Delete old versions of your functions") +@click.option("--keep-last", type=int, prompt="Please enter the number of recent versions to keep") +def cleanup(keep_last): + aws_lambda.cleanup_old_versions(CURRENT_DIR, keep_last) + if __name__ == '__main__': cli.add_command(init) cli.add_command(invoke) cli.add_command(deploy) cli.add_command(build) + cli.add_command(cleanup) cli()