Fallstudie: Aufbau eines Benachrichtigungssystems

Einführung in AWS Boto mit Python

Maksim Pecherskiy

Data Engineer

Endprodukt

Endprodukt

Endprodukt

Einführung in AWS Boto mit Python

Endprodukt

Endprodukt

Einführung in AWS Boto mit Python

Endprodukt

Endprodukt

Einführung in AWS Boto mit Python

Endprodukt

Endprodukt

Einführung in AWS Boto mit Python

Benachrichtigungssystem aufbauen

Einrichtung der Topics

  • Erstelle das Topic
  • Lade die Kontaktliste als CSV herunter
  • Erstelle Topics für jede Dienstleistung
  • Abonniere die Kontakte für ihre jeweiligen Topics
Einführung in AWS Boto mit Python

Benachrichtigungssystem aufbauen

Aggregierte Zahlen holen

  • Lade den monatlichen „Get it done"-Report herunter
  • Ermittle die Anzahl der Potholes
  • Ermittle die Anzahl der Illegal-dumping-Meldungen

Alarme senden

  • Wenn Potholes > 100, Alarm senden
  • Wenn Illegal Dumping > 30, Alarm senden
Einführung in AWS Boto mit Python

Topic-Einrichtung

SNS-Client initialisieren

sns = boto3.client('sns', 
                   region_name='us-east-1',
                   aws_access_key_id=AWS_KEY_ID, 
                   aws_secret_access_key=AWS_SECRET)

Topics erstellen und ihre ARNs speichern

trash_arn = sns.create_topic(Name="trash_notifications")['TopicArn']
streets_arn = sns.create_topic(Name="streets_notifications")['TopicArn']
Einführung in AWS Boto mit Python

Topic-Einrichtung

Topic-Einrichtung

Einführung in AWS Boto mit Python

Nutzer zu Topics abonnieren

contacts = pd.read_csv('http://gid-staging.contacts.csv')
Einführung in AWS Boto mit Python

Nutzer zu Topics abonnieren

contacts.csv

Name Email Phone Department
John Smith [email protected] +11224567890 trash
Fanny Mae [email protected] +11234597890 trash
Janessa Goldsmith [email protected] +11534567890 streets
Evelyn Monroe [email protected] +11234067890 streets
Max Pe [email protected] +11234517890 streets
Einführung in AWS Boto mit Python

Nutzer zu Topics abonnieren

Methode subscribe_user erstellen

def subscribe_user(user_row):

if user_row['Department'] == 'trash': sns.subscribe(TopicArn = trash_arn, Protocol='sms', Endpoint=str(user_row['Phone'])) sns.subscribe(TopicArn = trash_arn, Protocol='email', Endpoint=user_row['Email'])
else: sns.subscribe(TopicArn = streets_arn, Protocol='sms', Endpoint=str(user_row['Phone'])) sns.subscribe(TopicArn = streets_arn, Protocol='email', Endpoint=user_row['Email'])

Die Methode subscribe_user auf jede Zeile anwenden

contacts.apply(subscribe_user, axis=1)
Einführung in AWS Boto mit Python

Nutzer zu Topics abonnieren

Nutzer zu Topics abonnieren

Einführung in AWS Boto mit Python

Aggregierte Zahlen ermitteln

Januar-Report in ein DataFrame laden

df = pd.read_csv('http://gid-reports.2019/feb/final_report.csv')
Einführung in AWS Boto mit Python

Aggregierte Zahlen ermitteln

service_name count
Illegal Dumping 2580
Potential Missed Collection 150
Pothole 1170
Traffic Sign - Maintain 210
Traffic Signal Head Turned 60
Traffic Signal Light Out 120
Einführung in AWS Boto mit Python

Aggregierte Zahlen ermitteln

Index setzen, damit wir Counts direkt per service_name abrufen können

df.set_index('service_name', inplace=True)

Aggregierte Zahlen holen

trash_violations_count = df.at['Illegal Dumping', 'count']
streets_violations_count = df.at['Pothole', 'count']
Einführung in AWS Boto mit Python

Alarme senden

if trash_violations_count > 100:

# Construct the message to send message = "Trash violations count is now {}".format(trash_violations_count)
# Send message sns.publish(TopicArn = trash_arn, Message = message, Subject = "Trash Alert")
Einführung in AWS Boto mit Python

Alarme senden

if streets_violations_count > 30:

    # Construct the message to send
    message = "Streets violations count is now {}".format(streets_violations_count)

# Send message sns.publish(TopicArn = streets_arn, Message = message, Subject = "Streets Alert")
Einführung in AWS Boto mit Python

Endergebnis

Endergebnis

Einführung in AWS Boto mit Python

Lass uns üben!

Einführung in AWS Boto mit Python

Preparing Video For Download...