From 7061c1810921bf5af0c9b79663c2f3096f626733 Mon Sep 17 00:00:00 2001 From: Brian O Mahony Date: Tue, 12 Nov 2024 17:27:25 +0000 Subject: [PATCH 1/3] Adding directive for logic.azure.com --- handler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handler.py b/handler.py index 2be0414..24f8d4a 100644 --- a/handler.py +++ b/handler.py @@ -226,7 +226,7 @@ def send_org_alert( except URLError as e: print("Server connection failed: ", e.reason) pass - if "office.com/webhook" in teams_url: + if "logic.azure.com:443/workflows" in teams_url: try: print("Sending the alert to Teams") send_to_teams( From cf68569fdf9e7cd79c50c00cfcffbfd9e14978c3 Mon Sep 17 00:00:00 2001 From: Brian O Mahony Date: Tue, 12 Nov 2024 17:30:21 +0000 Subject: [PATCH 2/3] Adding Teams Workflows adaptive card code block for AWS Orgs --- messagegenerator.py | 181 +++++++++++++++++++++++++++++++++++--------- 1 file changed, 146 insertions(+), 35 deletions(-) diff --git a/messagegenerator.py b/messagegenerator.py index 12c619b..81f7268 100644 --- a/messagegenerator.py +++ b/messagegenerator.py @@ -423,55 +423,166 @@ def get_org_message_for_teams(event_details, event_type, affected_org_accounts, 'service'].upper() + " service in the " + event_details['successfulSet'][0]['event'][ 'region'].upper() + " region." message = { - "@type": "MessageCard", - "@context": "http://schema.org/extensions", - "themeColor": "FF0000", - "summary": "AWS Health Aware Alert", - "sections": [ + "type": "AdaptiveCard", + "msteams": { "width": "full" }, + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.5", + "body": [ { - "activityTitle": title, - "markdown": False, + "type": "TextBlock", + "size": "Medium", + "weight": "Bolder", + "text": "AHA Health Alert" + }, + { + "type": "TextBlock", + "weight": "Bolder", + "text": "🚨 [NEW] AWS Health reported an issue with the " + event_details['successfulSet'][0]['event'][ + 'service'].upper() + " service in the " + event_details['successfulSet'][0]['event'][ + 'region'].upper() + " region.", + "wrap": "true" + }, + { + "type": "TextBlock", + "spacing": "None", + "text": "Created DATE", + "isSubtle": "true", + "wrap": "true", + "isVisible": "false" + }, + { + "type": "FactSet", "facts": [ - {"name": "Account(s)", "value": affected_org_accounts}, - {"name": "Resource(s)", "value": affected_org_entities}, - {"name": "Service", "value": event_details['successfulSet'][0]['event']['service']}, - {"name": "Region", "value": event_details['successfulSet'][0]['event']['region']}, - {"name": "Start Time (UTC)", "value": cleanup_time(event_details['successfulSet'][0]['event']['startTime'])}, - {"name": "Status", "value": event_details['successfulSet'][0]['event']['statusCode']}, - {"name": "Event ARN", "value": event_details['successfulSet'][0]['event']['arn']}, - {"name": "Updates", "value": event_details['successfulSet'][0]['eventDescription']['latestDescription']} + { + "title": "Account(s)", + "value": affected_org_accounts + }, + { + "title": "Resource(s)", + "value": affected_org_entities + }, + { + "title": "Service", + "value": event_details['successfulSet'][0]['event']['service'] + }, + { + "title": "Region", + "value": event_details['successfulSet'][0]['event']['region'] + }, + { + "title": "Start Time (UTC)", + "value": cleanup_time(event_details['successfulSet'][0]['event']['startTime']) + }, + { + "title": "End Time (UTC)", + "value": cleanup_time(event_details['successfulSet'][0]['event']['endTime']) + }, + { + "title": "Status", + "value": event_details['successfulSet'][0]['event']['statusCode'] + }, + { + "title": "Event ARN", + "value": event_details['successfulSet'][0]['event']['arn'] + } ], + "$data": "${facts}" + }, + { + "type": "TextBlock", + "text": "Description:", + "wrap": "true", + "weight": "Bolder" + }, + { + "type": "TextBlock", + "text": get_last_aws_update(event_details), + "wrap": "true" } - ] + ], } - + elif event_type == "resolve": title = "✅ [RESOLVED] The AWS Health issue with the " + event_details['successfulSet'][0]['event'][ 'service'].upper() + " service in the " + event_details['successfulSet'][0]['event'][ 'region'].upper() + " region is now resolved." message = { - "@type": "MessageCard", - "@context": "http://schema.org/extensions", - "themeColor": "00ff00", - "summary": "AWS Health Aware Alert", - "sections": [ + "type": "AdaptiveCard", + "msteams": { "width": "full" }, + "$schema": "http://adaptivecards.io/schemas/adaptive-card.json", + "version": "1.5", + "body": [ { - "activityTitle": title, - "markdown": False, + "type": "TextBlock", + "size": "Medium", + "weight": "Bolder", + "text": "AHA Health Alert" + }, + { + "type": "TextBlock", + "weight": "Bolder", + "text": "✅ [RESOLVED] The AWS Health issue with the " + event_details['successfulSet'][0]['event'][ 'service'].upper() + " service in the " + event_details['successfulSet'][0]['event']['region'].upper() + " region is now resolved.", + "wrap": "true" + }, + { + "type": "TextBlock", + "spacing": "None", + "text": "Created DATE", + "isSubtle": "true", + "wrap": "true", + "isVisible": "false" + }, + { + "type": "FactSet", "facts": [ - {"name": "Account(s)", "value": affected_org_accounts}, - {"name": "Resource(s)", "value": affected_org_entities}, - {"name": "Service", "value": event_details['successfulSet'][0]['event']['service']}, - {"name": "Region", "value": event_details['successfulSet'][0]['event']['region']}, - {"name": "Start Time (UTC)", "value": cleanup_time(event_details['successfulSet'][0]['event']['startTime'])}, - {"name": "End Time (UTC)", "value": cleanup_time(event_details['successfulSet'][0]['event']['endTime'])}, - {"name": "Status", "value": event_details['successfulSet'][0]['event']['statusCode']}, - {"name": "Event ARN", "value": event_details['successfulSet'][0]['event']['arn']}, - {"name": "Updates", "value": event_details['successfulSet'][0]['eventDescription']['latestDescription']} + { + "title": "Account(s)", + "value": affected_org_accounts + }, + { + "title": "Resource(s)", + "value": affected_org_entities + }, + { + "title": "Service", + "value": event_details['successfulSet'][0]['event']['service'] + }, + { + "title": "Region", + "value": event_details['successfulSet'][0]['event']['region'] + }, + { + "title": "Start Time (UTC)", + "value": cleanup_time(event_details['successfulSet'][0]['event']['startTime']) + }, + { + "title": "End Time (UTC)", + "value": cleanup_time(event_details['successfulSet'][0]['event']['endTime']) + }, + { + "title": "Status", + "value": event_details['successfulSet'][0]['event']['statusCode'] + }, + { + "title": "Event ARN", + "value": event_details['successfulSet'][0]['event']['arn'] + } ], + "$data": "${facts}" + }, + { + "type": "TextBlock", + "text": "Description:", + "wrap": "true", + "weight": "Bolder" + }, + { + "type": "TextBlock", + "text": get_last_aws_update(event_details), + "wrap": "true" } - ] - } + ], + } return message print("Message sent to Teams: ", message) From 1230d2b157fef703390cd271fb181472b1ae7c7f Mon Sep 17 00:00:00 2001 From: Brian O Mahony Date: Thu, 14 Nov 2024 16:50:49 +0000 Subject: [PATCH 3/3] Adding accordian for ARN and Description to save screen space and pretty it up --- messagegenerator.py | 300 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 275 insertions(+), 25 deletions(-) diff --git a/messagegenerator.py b/messagegenerator.py index 81f7268..7e4d01b 100644 --- a/messagegenerator.py +++ b/messagegenerator.py @@ -480,28 +480,153 @@ def get_org_message_for_teams(event_details, event_type, affected_org_accounts, { "title": "Status", "value": event_details['successfulSet'][0]['event']['statusCode'] - }, - { - "title": "Event ARN", - "value": event_details['successfulSet'][0]['event']['arn'] } ], "$data": "${facts}" }, { - "type": "TextBlock", - "text": "Description:", - "wrap": "true", - "weight": "Bolder" - }, + "type": "Container", + "items": [{ + "type": "ColumnSet", + "columns": [{ + "type": "Column", + "items": [{ + "type": "TextBlock", + "text": "Event ARN", + "wrap": "true", + "size": "Medium", + "weight": "Bolder" + }], + "width": "stretch" + }, + { + "type": "Column", + "id": "chevronDown1", + "spacing": "Small", + "verticalContentAlignment": "Center", + "items": [{ + "type": "Image", + "url": "https://adaptivecards.io/content/down.png", + "width": "20px", + "altText": "collapsed" + }], + "width": "auto", + "isVisible": "false" + }, + { + "type": "Column", + "id": "chevronUp1", + "spacing": "Small", + "verticalContentAlignment": "Center", + "items": [{ + "type": "Image", + "url": "https://adaptivecards.io/content/up.png", + "width": "20px", + "altText": "expanded" + }], + "width": "auto" + } + ], + "selectAction": { + "type": "Action.ToggleVisibility", + "targetElements": [ + "cardContent1", + "chevronUp1", + "chevronDown1" + ] + } + }, + { + "type": "Container", + "id": "cardContent1", + "isVisible" : "false", + "items": [{ + "type": "Container", + "items": [{ + "type": "TextBlock", + "text": event_details['successfulSet'][0]['event']['arn'], + "isSubtle": "true", + "wrap": "true" + } + ], + } + ] + } + ] + }, { - "type": "TextBlock", - "text": get_last_aws_update(event_details), - "wrap": "true" + "type": "Container", + "items": [{ + "type": "ColumnSet", + "columns": [{ + "type": "Column", + "items": [{ + "type": "TextBlock", + "text": "Description", + "wrap": "true", + "size": "Medium", + "weight": "Bolder" + }], + "width": "stretch" + }, + { + "type": "Column", + "id": "chevronDown2", + "spacing": "Small", + "verticalContentAlignment": "Center", + "items": [{ + "type": "Image", + "url": "https://adaptivecards.io/content/down.png", + "width": "20px", + "altText": "collapsed" + }], + "width": "auto", + "isVisible": "false" + }, + { + "type": "Column", + "id": "chevronUp2", + "spacing": "Small", + "verticalContentAlignment": "Center", + "items": [{ + "type": "Image", + "url": "https://adaptivecards.io/content/up.png", + "width": "20px", + "altText": "expanded" + }], + "width": "auto" + } + ], + "selectAction": { + "type": "Action.ToggleVisibility", + "targetElements": [ + "cardContent2", + "chevronUp2", + "chevronDown2" + ] + } + }, + { + "type": "Container", + "id": "cardContent2", + "isVisible" : "false", + "items": [{ + "type": "Container", + "items": [{ + "type": "TextBlock", + "text": get_last_aws_update(event_details), + "isSubtle": "true", + "wrap": "true" } ], - } - + } + ] + } + ] + }, + ] + } + elif event_type == "resolve": title = "✅ [RESOLVED] The AWS Health issue with the " + event_details['successfulSet'][0]['event'][ 'service'].upper() + " service in the " + event_details['successfulSet'][0]['event'][ @@ -562,26 +687,151 @@ def get_org_message_for_teams(event_details, event_type, affected_org_accounts, { "title": "Status", "value": event_details['successfulSet'][0]['event']['statusCode'] - }, - { - "title": "Event ARN", - "value": event_details['successfulSet'][0]['event']['arn'] } ], "$data": "${facts}" }, { - "type": "TextBlock", - "text": "Description:", - "wrap": "true", - "weight": "Bolder" + "type": "Container", + "items": [{ + "type": "ColumnSet", + "columns": [{ + "type": "Column", + "items": [{ + "type": "TextBlock", + "text": "Event ARN", + "wrap": "true", + "size": "Medium", + "weight": "Bolder" + }], + "width": "stretch" }, + { + "type": "Column", + "id": "chevronDown1", + "spacing": "Small", + "verticalContentAlignment": "Center", + "items": [{ + "type": "Image", + "url": "https://adaptivecards.io/content/down.png", + "width": "20px", + "altText": "collapsed" + }], + "width": "auto", + "isVisible": "false" + }, + { + "type": "Column", + "id": "chevronUp1", + "spacing": "Small", + "verticalContentAlignment": "Center", + "items": [{ + "type": "Image", + "url": "https://adaptivecards.io/content/up.png", + "width": "20px", + "altText": "expanded" + }], + "width": "auto" + } + ], + "selectAction": { + "type": "Action.ToggleVisibility", + "targetElements": [ + "cardContent1", + "chevronUp1", + "chevronDown1" + ] + } + }, + { + "type": "Container", + "id": "cardContent1", + "isVisible" : "false", + "items": [{ + "type": "Container", + "items": [{ + "type": "TextBlock", + "text": event_details['successfulSet'][0]['event']['arn'], + "isSubtle": "true", + "wrap": "true" + } + ], + } + ] + } + ] + }, { - "type": "TextBlock", - "text": get_last_aws_update(event_details), - "wrap": "true" + "type": "Container", + "items": [{ + "type": "ColumnSet", + "columns": [{ + "type": "Column", + "items": [{ + "type": "TextBlock", + "text": "Description", + "wrap": "true", + "size": "Medium", + "weight": "Bolder" + }], + "width": "stretch" + }, + { + "type": "Column", + "id": "chevronDown2", + "spacing": "Small", + "verticalContentAlignment": "Center", + "items": [{ + "type": "Image", + "url": "https://adaptivecards.io/content/down.png", + "width": "20px", + "altText": "collapsed" + }], + "width": "auto", + "isVisible": "false" + }, + { + "type": "Column", + "id": "chevronUp2", + "spacing": "Small", + "verticalContentAlignment": "Center", + "items": [{ + "type": "Image", + "url": "https://adaptivecards.io/content/up.png", + "width": "20px", + "altText": "expanded" + }], + "width": "auto" + } + ], + "selectAction": { + "type": "Action.ToggleVisibility", + "targetElements": [ + "cardContent2", + "chevronUp2", + "chevronDown2" + ] + } + }, + { + "type": "Container", + "id": "cardContent2", + "isVisible" : "false", + "items": [{ + "type": "Container", + "items": [{ + "type": "TextBlock", + "text": get_last_aws_update(event_details), + "isSubtle": "true", + "wrap": "true" } ], + } + ] + } + ] + }, + ] } return message print("Message sent to Teams: ", message)