import boto3 import json import os description_list=['Bug Fixes'] action_list=['db-upgrade'] notification = "This is notification for Aurora,DocumentDB and Neptune patch \n" def query_docdb(): global notification EC2 = boto3.client('ec2') regions = EC2.describe_regions() for REGION in regions['Regions']: docDB = boto3.client('docdb',REGION['RegionName']) pma = docDB.describe_pending_maintenance_actions() if len(pma['PendingMaintenanceActions']) > 0: num = len(pma['PendingMaintenanceActions']) for inst in pma['PendingMaintenanceActions']: mw_description=inst['PendingMaintenanceActionDetails'][0]['Description'] mw_action=inst['PendingMaintenanceActionDetails'][0]['Action'] if mw_description not in description_list and mw_action not in action_list: num = num - 1 continue temp_string = "**********************************************" + "\n" notification += temp_string temp_string = "Region: " + REGION['RegionName'] + " has Aurora or docDB cluster needed to be upgrade.\n" notification += temp_string temp_string = "Mw_description: " + mw_description + "\n" notification += temp_string temp_string = "Mw_action: " + mw_action + "\n" notification += temp_string temp_string = "The Resource has pending maintenance action: " + inst['ResourceIdentifier'] + "\n" notification += temp_string cls_identifier=inst['ResourceIdentifier'].split(':')[-1] try: cls = docDB.describe_db_clusters(DBClusterIdentifier=cls_identifier) except Exception as e: temp_string = "Failed to get cluster information! This is instance level notification" + "\n" notification += temp_string temp_string = "**********************************************" + "\n" notification += temp_string continue dbclus=cls['DBClusters'] mw = dbclus[0]['PreferredMaintenanceWindow'] temp_string = "The Cluster maintenance window UTC time: " + mw + "\n" notification += temp_string temp_string = "Region: " + REGION['RegionName'] + " has total " + str(num) + " resource found.\n" notification += temp_string temp_string = "**********************************************" + "\n" notification += temp_string else: temp_string = "Region: " + REGION['RegionName'] + " No Cluster found.\n" notification += temp_string def lambda_handler(event, context): global notification sns_client = boto3.client('sns') query_docdb() print (notification) sns_arn = os.environ.get('SNS_TOPIC_ARN') sns_response = sns_client.publish ( TargetArn = sns_arn, Subject = "Database Patch Notification", Message = json.dumps({'default': notification}), MessageStructure = 'json' )