import os import json import boto3 from datetime import datetime from botocore.exceptions import ClientError region = os.environ['AWS_REGION'] originationNumber = os.environ['ORIGINATION_NUMBER'] application_id = os.environ['APPLICATION_ID'] statemachine_arn = os.environ['STATEMACHINE_ARN'] table_name = os.environ['DYNAMODB_INCIDENTINFO'] table_name_mid = os.environ['DYNAMODB_MESSAGEID'] dynamodbendpointurl = "https://dynamodb." + region + ".amazonaws.com" dynamodb = boto3.resource('dynamodb', endpoint_url=dynamodbendpointurl) table_mid = dynamodb.Table(table_name_mid) table = dynamodb.Table(table_name) clientpinp = boto3.client('pinpoint') client_step = boto3.client('stepfunctions') today = datetime.now() timestamp = today.strftime("%d/%m/%Y %H:%M:%S") #Get incident id using message_id from DynamoDB def get_incident_id(prev_message_id): incident_id = table_mid.get_item(Key={'message_id': prev_message_id}) print("Message_id obtained from DynamoDB using message_id: ") print(incident_id) incident_id = incident_id['Item']['incident_id'] return incident_id #Get incident information from DynamoDB def get_incident_info(incident_id): incident_info = table.get_item(Key={'incident_id': incident_id}) print("Incident information obtained from DynamoDB: ") print(incident_info) return incident_info #Update incident status date in DynamoDB def update_status_date(incident_id): response = table.update_item( Key={ 'incident_id': incident_id, }, UpdateExpression="set stat_date = :stat_date", ExpressionAttributeValues={ ':stat_date': timestamp }, ReturnValues="UPDATED_NEW" ) print("Incident status date updated: ") print(response) #Update incident to indicate that there is a double escalation in DynamoDB def update_escalation_status(incident_id,escalation_status): response = table.update_item( Key={ 'incident_id': incident_id, }, UpdateExpression="set double_escalation = :double_escalation", ExpressionAttributeValues={ ':double_escalation': escalation_status }, ReturnValues="UPDATED_NEW" ) print("Incident status updated to indicate double scalation: ") print(response) #Update incident status in DynamoDB def update_status(incident_id,new_status): response = table.update_item( Key={ 'incident_id': incident_id, }, UpdateExpression="set incident_stat = :incident_stat", ExpressionAttributeValues={ ':incident_stat': new_status }, ReturnValues="UPDATED_NEW" ) print("Incident status update: ") print(response) #Delete message_id & incident_id from DynamoDB def delete_message_id(message_id): response = table_mid.delete_item( Key={ 'message_id': message_id }) print("Deleted message_id & incident_id from DynamoDB: ") print(response) #Send SMS def sendsms(destinationNumber, message): try: send_sms = clientpinp.send_messages( ApplicationId=application_id, MessageRequest={ 'Addresses': { destinationNumber: { 'ChannelType': 'SMS' } }, 'MessageConfiguration': { 'SMSMessage': { 'Body': message, 'MessageType': "TRANSACTIONAL", 'OriginationNumber': originationNumber } } } ) except ClientError as e: print(e.send_sms['Error']['Message']) else: message_id = send_sms['MessageResponse']['Result'][destinationNumber]['MessageId'] return message_id #Execute StateMachine def execute_step_function(data_to_step): data_to_step = json.dumps(data_to_step) start_step_functions = client_step.start_execution( stateMachineArn=statemachine_arn, input=data_to_step ) print("StepMachine triggered: ") print(start_step_functions)