import os import time import boto3 from botocore.exceptions import ClientError from dotenv import load_dotenv # Load env file if it exists load_dotenv(verbose=True) ENVIRONMENT = os.environ.get('Environment', 'dev') def delete_queues_with_no_messages(client, queue_url): # Double check that queue is still empty print('getting messages of empty queue') empty_queue = get_queues_with_no_messages(client, [queue_url]) if empty_queue and empty_queue == [queue_url]: print(f'Queue is still empty: {queue_url}. Deleting...') client.delete_queue(QueueUrl=queue_url) print(f'Queue has been deleted: {queue_url}') else: print(f'Queue is no longer empty: {queue_url}. Skipping...') def get_queues_with_no_messages(client, queue_urls=None): # There are generally < 1000 queues for an encoder type. Be simple. if not queue_urls: queues = client.list_queues( QueueNamePrefix=f'{ENVIRONMENT}-encoding18', MaxResults=1000 ) queue_urls = queues['QueueUrls'] else: print(queue_urls) empty_queue_urls = [] for queue_url in queue_urls: response = client.get_queue_attributes( QueueUrl=queue_url, AttributeNames=[ 'ApproximateNumberOfMessagesNotVisible', 'ApproximateNumberOfMessages', ] ) queue_attributes = response['Attributes'] if sum([ int(queue_attributes['ApproximateNumberOfMessagesNotVisible']), int(queue_attributes['ApproximateNumberOfMessages'])]) == 0: empty_queue_urls.append(queue_url) else: print( f'queue {queue_url} is NOT empty: details: {queue_attributes}.') return empty_queue_urls def main(): sqs_client = boto3.client('sqs', region_name='us-east-1') events_client = boto3.client('events', region_name='us-east-1') print('Disabling renew manager Cloudwatch event') events_client.disable_rule( Name=f'{ENVIRONMENT}-lambda-renew-manager-fargate-event' ) print('Renew manager Cloudwatch event has been disabled.') print('Sleeping for a minute to let running renew lambdas finish') time.sleep(60) try: empty_queue_urls = get_queues_with_no_messages(sqs_client) print(f'Empty queues are {empty_queue_urls}') # Delete empty queues for queue_url in empty_queue_urls: delete_queues_with_no_messages(sqs_client, queue_url) except ClientError as error: raise SystemExit(f'Error deleting SQS queues: {error}') finally: """ https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_CreateQueue.html Need to wait one minute so that queue can be recreated with same name by subsequent renew lambdas and not hit AWS limits. """ time.sleep(60) print('Enabling renew manager Cloudwatch event') events_client.enable_rule( Name=f'{ENVIRONMENT}-lambda-renew-manager-fargate-event' ) print('Renew manager Cloudwatch event has been enabled.') if __name__ == "__main__": main()