integ/sagemaker_cleaner.py (59 lines of code) (raw):

import datetime from sagemaker_core.main.resources import Model, EndpointConfig, Endpoint class SageMakerCleaner: """Provides methods to cleanup SageMaker resources""" def __init__(self): """Initialize a SageMakerCleaner Args: client (client): A boto3 Session SageMaker Client """ self.resource_tracker = {"total_deleted": 0, "total_failed": 0} def handle_cleanup(self, before_timestamp, after_timestamp): """Handles deletion for Sagmeker resources Args: before_timestamp (datetime): timestamp for 'CreationTimeBefore' or 'CreatedBefore' boto3 parameter after_timestamp (datetime): timestamp for 'CreationTimeAfter' or 'CreatedAfter' boto3 parameter """ RESOURCE_TYPE_ORDER = [ "Endpoints", "EndpointConfigs", "Models", ] CLEANUP_METHODS = { "Endpoints": self.cleanup_endpoints, "EndpointConfigs": self.cleanup_endpoint_configs, "Models": self.cleanup_models, } for resource_type in RESOURCE_TYPE_ORDER: CLEANUP_METHODS[resource_type](before_timestamp, after_timestamp) def cleanup_endpoints(self, creation_time_before, creation_time_after): """Deletes Models before a given timestamp Args: creation_time_before (datetime): timestamp for 'CreationTimeBefore' or 'CreatedBefore' boto3 parameter creation_time_after (datetime): timestamp for 'CreationTimeAfter' or 'CreatedAfter' boto3 parameter """ endpoints = Endpoint.get_all( creation_time_before=creation_time_before, creation_time_after=creation_time_after ) for endpoint in endpoints: try: endpoint.delete() except: self._track_resource(failed=1) self._track_resource(deleted=1) def cleanup_endpoint_configs(self, creation_time_before, creation_time_after): """Deletes Models before a given timestamp Args: creation_time_before (datetime): timestamp for 'CreationTimeBefore' or 'CreatedBefore' boto3 parameter creation_time_after (datetime): timestamp for 'CreationTimeAfter' or 'CreatedAfter' boto3 parameter """ endpoint_configs = EndpointConfig.get_all( creation_time_before=creation_time_before, creation_time_after=creation_time_after ) for endpoint_config in endpoint_configs: try: endpoint_config.delete() except: self._track_resource(failed=1) self._track_resource(deleted=1) def cleanup_models(self, creation_time_before, creation_time_after): """Deletes Models before a given timestamp Args: creation_time_before (datetime): timestamp for 'CreationTimeBefore' or 'CreatedBefore' boto3 parameter creation_time_after (datetime): timestamp for 'CreationTimeAfter' or 'CreatedAfter' boto3 parameter """ models = Model.get_all( creation_time_before=creation_time_before, creation_time_after=creation_time_after ) for model in models: try: model.delete() except: self._track_resource(failed=1) self._track_resource(deleted=1) def _track_resource(self, deleted=0, failed=0): """Updates the resource tracker with # of deleted, or failed resources Args: deleted (int): # of deleted resources to add to tracker failed (int): # of failed resources to add to tracker """ self.resource_tracker["total_deleted"] += deleted self.resource_tracker["total_failed"] += failed def handle_cleanup(): region = "us-west-2" print(f"\n\n=========== Cleaning SageMaker Resources in {region} ===========") before_timestamp = datetime.datetime.now(datetime.timezone.utc) after_timestamp = datetime.datetime.now(datetime.timezone.utc) - datetime.timedelta(weeks=2) sagemaker_cleaner = SageMakerCleaner() sagemaker_cleaner.handle_cleanup(before_timestamp, after_timestamp) print(f"resource_tracker: {sagemaker_cleaner.resource_tracker}")