Skip to content

Commit

Permalink
Bugfix for affected_accounts
Browse files Browse the repository at this point in the history
  • Loading branch information
gmridula authored Jul 30, 2021
1 parent e885425 commit e02060b
Showing 1 changed file with 38 additions and 15 deletions.
53 changes: 38 additions & 15 deletions BETA-multi-region/handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,10 +42,9 @@ def get_account_name(account_id):
account_name = org_client.describe_account(AccountId=account_id)['Account']['Name']
except Exception:
account_name = account_id

return account_name

def send_alert(event_details, event_type):
def send_alert(event_details, affected_accounts, affected_entities, event_type):
slack_url = get_secrets()["slack"]
teams_url = get_secrets()["teams"]
chime_url = get_secrets()["chime"]
Expand Down Expand Up @@ -277,24 +276,35 @@ def send_org_email(event_details, eventType, affected_org_accounts, affected_org
},
)

# organization view affected accounts
# non-organization view affected accounts
def get_health_accounts(health_client, event, event_arn):
affected_accounts = []
accounts_paginator = health_client.get_paginator('describe_affected_entities')
event_accounts_paginator = health_client.get_paginator('describe_affected_entities')
event_accounts_page_iterator = event_accounts_paginator.paginate(
eventArn=event_arn
filter = {
'eventArns': [
event_arn
]
}
)
for event_accounts_page in event_accounts_page_iterator:
json_event_accounts = json.dumps(event_accounts_page, default=myconverter)
parsed_event_accounts = json.loads(json_event_accounts)
affected_org_accounts = (parsed_event_accounts['entities'][0]['awsAccountId'])
try:
affected_accounts.append(parsed_event_accounts['entities'][0]['awsAccountId'])
except Exception:
affected_accounts = []
return affected_accounts

def get_health_entities(health_client, event, event_arn):
affected_entities = []
event_entities_paginator = health_client.get_paginator('describe_affected_entities')
event_entities_page_iterator = event_entities_paginator.paginate(
eventArn=event_arn
filter = {
'eventArns': [
event_arn
]
}
)
for event_entities_page in event_entities_page_iterator:
json_event_entities = json.dumps(event_entities_page, default=myconverter)
Expand Down Expand Up @@ -429,6 +439,7 @@ def update_ddb(event_arn, str_update, status_code, event_details, affected_accou
dynamodb = boto3.resource("dynamodb")
ddb_table = os.environ['DYNAMODB_TABLE']
aha_ddb_table = dynamodb.Table(ddb_table)
event_latestDescription = event_details['successfulSet'][0]['eventDescription']['latestDescription']

# set time parameters
delta_hours = os.environ['EVENT_SEARCH_BACK']
Expand Down Expand Up @@ -459,32 +470,41 @@ def update_ddb(event_arn, str_update, status_code, event_details, affected_accou
'arn': event_arn,
'lastUpdatedTime': str_update,
'added': sec_now,
'ttl': int(sec_now) + delta_hours_sec + 86400
'ttl': int(sec_now) + delta_hours_sec + 86400,
'statusCode': status_code,
'affectedAccountIDs': affected_accounts,
'latestDescription': event_latestDescription
# Cleanup: DynamoDB entry deleted 24 hours after last update
}
)
affected_accounts_details = [
f"{get_account_name(account_id)} ({account_id})" for account_id in affected_accounts]
f"{get_account_name(account_id)} ({account_id})" for account_id in affected_accounts]
# send to configured endpoints
if status_code != "closed":
send_alert(event_details, affected_accounts, affected_entities, event_type="create")
send_alert(event_details, affected_accounts_details, affected_entities, event_type="create")
else:
send_alert(event_details, affected_accounts, affected_entities, event_type="resolve")

send_alert(event_details, affected_accounts_details, affected_entities, event_type="resolve")
else:
item = response['Item']
if item['lastUpdatedTime'] != str_update:
if item['lastUpdatedTime'] != str_update and (item['statusCode'] != status_code or
item['latestDescription'] != event_latestDescription or
item['affectedAccountIDs'] != affected_org_accounts):
print(datetime.now().strftime(srt_ddb_format_full) + ": last Update is different")
# write to dynamodb
response = aha_ddb_table.put_item(
Item={
'arn': event_arn,
'lastUpdatedTime': str_update,
'added': sec_now,
'ttl': int(sec_now) + delta_hours_sec + 86400
'ttl': int(sec_now) + delta_hours_sec + 86400,
'statusCode': status_code,
'affectedAccountIDs': affected_org_accounts,
'latestDescription': event_latestDescription
# Cleanup: DynamoDB entry deleted 24 hours after last update
}
)
affected_accounts_details = [
f"{get_account_name(account_id)} ({account_id})" for account_id in affected_accounts]
# send to configured endpoints
if status_code != "closed":
send_alert(event_details, affected_accounts_details, affected_entities, event_type="create")
Expand All @@ -493,7 +513,6 @@ def update_ddb(event_arn, str_update, status_code, event_details, affected_accou
else:
print("No new updates found, checking again in 1 minute.")


def get_secrets():
secret_teams_name = "MicrosoftChannelID"
secret_slack_name = "SlackChannelID"
Expand Down Expand Up @@ -649,6 +668,10 @@ def describe_events(health_client):
str_update = parser.parse((event['lastUpdatedTime']))
str_update = str_update.strftime(str_ddb_format_sec)

# get non-organizational view requirements
affected_accounts = get_health_accounts(health_client, event, event_arn)
affected_entities = get_health_entities(health_client, event, event_arn)

# get event details
event_details = json.dumps(describe_event_details(health_client, event_arn), default=myconverter)
event_details = json.loads(event_details)
Expand Down

0 comments on commit e02060b

Please sign in to comment.