import boto3, datetime def lambda_handler(event, context): hours_duration_for_trainers = 12 hours_duration_for_defaults = 2 region = "ap-southeast-1" cloudformation = boto3.client("cloudformation", region_name=region) print("lab control housekeeper started.") except_list = ["lab-control", "lab-control-v2", "lab-tidb-training"] # Reserved for course 303 trainers long_hours_list = [ "guanglei-bao", "dongfei", "chenhao-huang", "sean-bogaard", "todongfei-gmail-com", ] stacks = [] response = cloudformation.list_stacks( StackStatusFilter=["CREATE_FAILED", "CREATE_COMPLETE"], ) stacks += response["StackSummaries"] while "NextToken" in response and response["NextToken"] != None: nt = response["NextToken"] response = cloudformation.list_stacks( NextToken=nt, StackStatusFilter=["CREATE_FAILED", "CREATE_COMPLETE"], ) stacks += response["StackSummaries"] for s in stacks: stack_name = s["StackName"] if ( stack_name.replace("-class-env", "").replace("-demo-env", "") not in except_list ): stack_creation_time = s["CreationTime"] now = datetime.datetime.utcnow() stack_creation_time = stack_creation_time.replace(tzinfo=None) delta = now - stack_creation_time if ( # More than 4 hours, and not belongs to trainers delta > datetime.timedelta(hours=hours_duration_for_defaults) and stack_name.replace("-class-env", "").replace("-demo-env", "") not in long_hours_list ) or ( # More than 8 hours, and belongs to trainers delta > datetime.timedelta(hours=hours_duration_for_trainers) and stack_name.replace("-class-env", "").replace("-demo-env", "") in long_hours_list ): print("Stack creation time (utc truncated):", stack_creation_time) print( "Destroying", stack_name, "which was created at", stack_creation_time, ) cloudformation.delete_stack(StackName=stack_name) print("lab control housekeeper ended.") return "ap-southeast-1 lab-control housekeeper invoked."