Estudo de caso: Construindo um sistema de notificações

Introdução ao AWS Boto em Python

Maksim Pecherskiy

Data Engineer

Produto final

Produto final

Produto final

Introdução ao AWS Boto em Python

Produto final

Produto final

Introdução ao AWS Boto em Python

Produto final

Produto final

Introdução ao AWS Boto em Python

Produto final

Produto final

Introdução ao AWS Boto em Python

Construindo o sistema de notificações

Configuração do tópico

  • Criar o tópico
  • Baixar o CSV da lista de contatos
  • Criar tópicos para cada serviço
  • Inscrever os contatos nos respectivos tópicos
Introdução ao AWS Boto em Python

Construindo o sistema de notificações

Obter os números agregados

  • Baixar o relatório mensal "get it done"
  • Obter a contagem de Potholes
  • Obter a contagem de Illegal dumping

Enviar alertas

  • Se potholes passar de 100, enviar alerta
  • Se illegal dumping passar de 30, enviar alerta
Introdução ao AWS Boto em Python

Configuração do tópico

Inicializar o cliente SNS

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

Criar tópicos e guardar seus ARNs

trash_arn = sns.create_topic(Name="trash_notifications")['TopicArn']
streets_arn = sns.create_topic(Name="streets_notifications")['TopicArn']
Introdução ao AWS Boto em Python

Configuração do tópico

Configuração do tópico

Introdução ao AWS Boto em Python

Inscrevendo usuários em tópicos

contacts = pd.read_csv('http://gid-staging.contacts.csv')
Introdução ao AWS Boto em Python

Inscrevendo usuários em tópicos

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
Introdução ao AWS Boto em Python

Inscrevendo usuários em tópicos

Criar o método subscribe_user

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'])

Aplicar subscribe_user a cada linha

contacts.apply(subscribe_user, axis=1)
Introdução ao AWS Boto em Python

Inscrevendo usuários em tópicos

Inscrevendo usuários em tópico

Introdução ao AWS Boto em Python

Obter os números agregados

Carregar o relatório de janeiro em um DataFrame

df = pd.read_csv('http://gid-reports.2019/feb/final_report.csv')
Introdução ao AWS Boto em Python

Obter os números agregados

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
Introdução ao AWS Boto em Python

Obter os números agregados

Definir o índice para acessar as contagens pelo serviço

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

Obter os números agregados

trash_violations_count = df.at['Illegal Dumping', 'count']
streets_violations_count = df.at['Pothole', 'count']
Introdução ao AWS Boto em Python

Enviar alertas

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")
Introdução ao AWS Boto em Python

Enviar alertas

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")
Introdução ao AWS Boto em Python

Resultado final

Resultado final

Introdução ao AWS Boto em Python

Vamos praticar!

Introdução ao AWS Boto em Python

Preparing Video For Download...