Introdução ao Amazon Simple Notification Service (SNS)

Marcelo AmorimMarcelo Amorim
6 min read

O Amazon Simple Notification Service (SNS) é um serviço de mensagens totalmente gerenciado de publicação/assinatura (pub/sub ou publish/subscribe) que permite o envio de mensagens de forma rápida, flexível e escalável. Com o SNS, você pode desacoplar e escalonar microsserviços, sistemas distribuídos e aplicativos sem servidor. Ele é amplamente utilizado para enviar notificações em tempo real e comunicação entre diferentes sistemas ou serviços.

Principais Características do Amazon SNS

  • Flexibilidade de Entrega: Suporta múltiplos protocolos de entrega, incluindo HTTP/S, e-mail, SMS, notificações push para dispositivos móveis e integração com outros serviços AWS como Amazon SQS e AWS Lambda.

  • Facilidade de Integração: Integra-se facilmente com outros serviços AWS, permitindo a construção de arquiteturas de aplicativos altamente interconectadas e orientadas a eventos.

    → Veja a documentação oficial: https://docs.aws.amazon.com/sns/latest/dg/welcome.html

  • Filtragem de Mensagens: Permite filtrar mensagens com base em atributos, garantindo que os assinantes recebam apenas as notificações relevantes para eles.

    → Abaixo um exemplo de mensagem e de um filtro que aceita essa mensagem. Ver documentação completa em https://docs.aws.amazon.com/sns/latest/dg/example-filter-policies.html.

Conceitos Fundamentais

a) Tópicos

Um tópico é um canal de comunicação que um publicador envia mensagens e ao qual os assinantes se inscrevem para receber essas mensagens. Cada tópico possui um nome único e pode ter múltiplos assinantes.

b) Assinantes

Assinantes são endpoints que recebem mensagens publicadas em um tópico SNS. Eles podem ser de diferentes tipos, como endereços de e-mail, números de telefone (SMS), URLs HTTP/S, filas Amazon SQS ou funções AWS Lambda.

c) Publicadores

Publicadores são entidades que enviam mensagens para os tópicos SNS. Podem ser aplicativos, serviços AWS ou quaisquer sistemas capazes de fazer chamadas à API do SNS para publicar mensagens.

d) Mensagens

Mensagens são os conteúdos de dados enviados pelos publicadores para os tópicos e entregues aos assinantes. Podem conter texto ou dados estruturados em formatos como JSON.

→ Vejamos no desenho de arquitetura abaixo um exemplo desses conceitos:

https://aws.amazon.com/blogs/architecture/get-started-with-amazon-s3-event-driven-design-patterns/

No desenho, a imagem do SNS representa nosso tópico. As filas SQS são os assinantes (subscribers) e o bucket do S3 nosso publicador. A mensagem sai do S3 e fica disponível no tópico para os assinantes poderem ter acesso.

Primeiros Passos com o Amazon SNS

Pré-requisitos

  • Acesso ao Console de Gerenciamento da AWS.

  • Desejo de enviar notificações ou mensagens entre sistemas.

Passo 1: Criar um Tópico

Usando o Console AWS

  1. Faça login no Console de Gerenciamento da AWS.

  2. No topo da página, utilize a barra de pesquisa para encontrar SNS e selecione Simple Notification Service nos resultados.

  3. Na página do Amazon SNS, no painel esquerdo, clique em Tópicos.

  4. Clique em Criar tópico.

    → Caminho: Amazon SNS > Topics > Create topic

  5. Escolha o tipo de tópico:

    • Padrão: Entrega de mensagens de melhor esforço com throughput ilimitado.

    • FIFO (First-In-First-Out): Garante a ordem de mensagens e entrega exatamente uma vez (ideal para aplicações que exigem processamento ordenado).

  6. Para este exemplo, selecione Padrão.

  7. Em Nome do tópico, insira um nome, por exemplo, meu-topico-exemplo.

  8. Opcionalmente, configure outras propriedades como criptografia, etiquetas e políticas de acesso.

  9. Clique em Criar tópico.

Passo 2: Inscrever um Assinante no Tópico

  1. Após criar o tópico, você será direcionado para a página de detalhes do tópico.

  2. Clique em Criar assinatura (Create subscription).

  3. Preencha os seguintes detalhes:

    • Protocolo: Selecione o protocolo de entrega (por exemplo, Email, SMS, Lambda, HTTP/S, Amazon SQS).

    • Endpoint: Insira o endpoint correspondente ao protocolo selecionado (por exemplo, o ARN da fila SQS que criamos no tutorial passado).

  4. Para este exemplo, selecione Amazon SQS como protocolo e insira seu o ARN da fila.

  5. Clique em Criar assinatura.

Passo 3: Disparar uma Mensagem para o SNS via Lambda

Para publicar uma mensagem no tópico SNS usando uma função Lambda, siga as etapas abaixo:

  1. Crie ou atualize sua função Lambda:

    • Acesse o console do AWS Lambda.

    • Crie uma nova função ou edite uma função existente.

  2. Adicione o código para publicar no SNS:

    • Copie e cole o seguinte código em sua função Lambda:

        import os
        import boto3
        from botocore.exceptions import ClientError
      
        # Inicializa o cliente do SNS
        sns_client = boto3.client('sns')
      
        def lambda_handler(event, context):
            # Obter o ARN do tópico SNS das variáveis de ambiente
            topic_arn = os.getenv('SNS_TOPIC_ARN')
      
            # Mensagem a ser publicada
            message = "Mensagem disparada via Lambda para o SNS!"
      
            try:
                # Publicar a mensagem no tópico SNS
                response = sns_client.publish(
                    TopicArn=topic_arn,
                    Message=message
                )
                print(f"Mensagem publicada com sucesso. ID da mensagem: {response['MessageId']}")
      
                return {
                    'statusCode': 200,
                    'body': f"Mensagem enviada para o tópico SNS com sucesso! ID: {response['MessageId']}"
                }
            except ClientError as e:
                print(f"Erro ao publicar mensagem no SNS: {e}")
                return {
                    'statusCode': 500,
                    'body': f"Erro ao enviar mensagem: {e}"
                }
      
  3. Configure a variável de ambiente:

    • Adicione a variável de ambiente SNS_TOPIC_ARN com o ARN do tópico SNS ao qual a mensagem será enviada.

      • Exemplo: arn:aws:sns:us-east-1:123456789012:MeuTopico.
  4. Crie uma IAM Role para sua Lambda poder publicar uma mensagem no SNS:

    • Ela ficará próxima a isso:

        {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": "sns:Publish",
              "Resource": "arn:aws:sns:us-east-1:123456789012:MeuTopico"
            }
          ]
        }
      
  5. Teste o disparo da mensagem:

    • Acesse a aba Testar no console do Lambda.

    • Crie um evento de teste (o evento pode ser genérico, o Lambda não depende dele neste exemplo).

    • Execute a função e observe os logs na saída do console.

  6. Verifique o recebimento da mensagem:

    • O assinante configurado no tópico SNS (por exemplo, um e-mail) deve receber a mensagem "Mensagem disparada via Lambda para o SNS!".

Passo 4: Como ficou nossa arquitetura final?

  1. Vamos lembrar que chegamos nesse ponto agora, após irmos adicionando novos serviços aos poucos ao nosso desenho.

  2. Vamos testar? Aqui na minha conta criei apenas duas filas, duas funções lambdas e um tópico SNS. Esse desenho com mais serviços é apenas ilustrativo que podemos ir crescendo a solução.

  3. Vamos lá…primeiro, disparando um evento via lambda:

    Vamos utilizar o id da mensagem para buscar os logs nos outros serviços:

    → c9d5bfb9-7109-53c5-ab31-e00f7767ab25

  4. Agora, será que nossa mensagem chegou em nossas filas?

    → Vejamos que situação interessante para entendermos os conceitos trabalhados aqui. Minha primeira fila (MyTestQueue) tinha a função Lambda escutando os eventos da fila, logo, ficou esvaziada de mensagens. A segunda fila não tem nenhum serviço ouvindo seus eventos, logo, guarda a mensagem até que configuremos isso:

  5. Pronto, temos a mensagem na nossa função lambda recebendo os eventos do SQS com o mesmo id que registrado na publicação da mensagem via Lambda (c9d5bfb9-7109-53c5-ab31-e00f7767ab25):

Conceitos Adicionais

Filtragem de Mensagens por Atributos

O SNS permite configurar filtros para que os assinantes recebam apenas mensagens com atributos específicos.

  1. Ao criar ou editar uma assinatura, você pode adicionar uma política de filtro.

  2. Defina os atributos e valores que a mensagem deve conter para ser entregue ao assinante.

Integração com Outros Serviços AWS

  • Amazon SQS: Envie mensagens para filas SQS para processamento assíncrono.

  • AWS Lambda: Dispare funções Lambda em resposta a mensagens publicadas.

  • Amazon Kinesis Data Firehose: Envie dados para serviços de análise e armazenamento.

Segurança e Controle de Acesso

  • Use políticas de tópico para controlar quem pode publicar ou se inscrever em um tópico.

  • Integre com o AWS IAM para gerenciar permissões de usuários e serviços.

  • Habilite HTTPS para garantir a criptografia em trânsito das mensagens.

Considerações Finais

O Amazon SNS é uma ferramenta poderosa para construir sistemas altamente escaláveis e desacoplados. Compreender os conceitos de tópicos, assinaturas, publicadores e mensagens é fundamental para utilizar o SNS de forma eficaz. Usando o Console de Gerenciamento da AWS, você pode configurar rapidamente a infraestrutura de mensagens necessária para suas aplicações.

Recursos Adicionais

  • Documentação do Amazon SNS: Link

  • Tutoriais do Amazon SNS: Link

  • AWS CLI Command Reference for SNS: Link

  • Exemplos de Integração com AWS Lambda: Link

  • Práticas Recomendadas de Segurança para SNS: Link

0
Subscribe to my newsletter

Read articles from Marcelo Amorim directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Marcelo Amorim
Marcelo Amorim

Senior Software Engineer - Java, Spring and AWS