Skip to content

Commit 7b90f63

Browse files
author
Marcel Radischat
committed
Add option to delete old versions of a lambda function
Aliased versions and $Latest will never be deleted.
1 parent ce3d2f4 commit 7b90f63

File tree

3 files changed

+52
-1
lines changed

3 files changed

+52
-1
lines changed

aws_lambda/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
__email__ = 'nficano@gmail.com'
55
__version__ = '0.4.0'
66

7-
from .aws_lambda import deploy, invoke, init, build
7+
from .aws_lambda import deploy, invoke, init, build, cleanup_old_versions
88

99
# Set default logging handler to avoid "No handler found" warnings.
1010
import logging

aws_lambda/aws_lambda.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from shutil import copy, copyfile
99
from tempfile import mkdtemp
1010

11+
import botocore
1112
import boto3
1213
import pip
1314
import yaml
@@ -18,6 +19,49 @@
1819
log = logging.getLogger(__name__)
1920

2021

22+
def cleanup_old_versions(src, keep_last_versions):
23+
"""Deletes old deployed versions of the function in AWS Lambda.
24+
25+
Won't delete $Latest and any aliased version
26+
27+
:param str src:
28+
The path to your Lambda ready project (folder must contain a valid
29+
config.yaml and handler module (e.g.: service.py).
30+
:param int keep_last_versions:
31+
The number of recent versions to keep and not delete
32+
"""
33+
if keep_last_versions <= 0:
34+
print("Won't delete all versions. Please do this manually")
35+
else:
36+
path_to_config_file = os.path.join(src, 'config.yaml')
37+
cfg = read(path_to_config_file, loader=yaml.load)
38+
39+
aws_access_key_id = cfg.get('aws_access_key_id')
40+
aws_secret_access_key = cfg.get('aws_secret_access_key')
41+
42+
client = get_client('lambda', aws_access_key_id, aws_secret_access_key,
43+
cfg.get('region'))
44+
45+
response = client.list_versions_by_function(
46+
FunctionName=cfg.get("function_name")
47+
)
48+
versions = response.get("Versions")
49+
if len(response.get("Versions")) < keep_last_versions:
50+
print("Nothing to delete. (Too few versions published)")
51+
else:
52+
version_numbers = [elem.get("Version") for elem in
53+
versions[1:-keep_last_versions]]
54+
for version_number in version_numbers:
55+
try:
56+
client.delete_function(
57+
FunctionName=cfg.get("function_name"),
58+
Qualifier=version_number
59+
)
60+
except botocore.exceptions.ClientError as e:
61+
print("Skipping Version {}: {}".format(version_number,
62+
e.message))
63+
64+
2165
def deploy(src, local_package=None):
2266
"""Deploys a new function to AWS Lambda.
2367

scripts/lambda

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,16 @@ def invoke(event_file, verbose):
3838
def deploy(local_package):
3939
aws_lambda.deploy(CURRENT_DIR, local_package)
4040

41+
42+
@click.command(help="Delete old versions of your functions")
43+
@click.option("--keep-last", type=int, prompt="Please enter the number of recent versions to keep")
44+
def cleanup(keep_last):
45+
aws_lambda.cleanup_old_versions(CURRENT_DIR, keep_last)
46+
4147
if __name__ == '__main__':
4248
cli.add_command(init)
4349
cli.add_command(invoke)
4450
cli.add_command(deploy)
4551
cli.add_command(build)
52+
cli.add_command(cleanup)
4653
cli()

0 commit comments

Comments
 (0)