O blog da AWS

Enriquecimento e customizações de notificações com o HAQM EventBridge Pipes

Esta postagem é de autoria de Elie Elmalem, arquiteto associado de soluções da AWS

Ao implementar arquiteturas orientadas a eventos, os clientes frequentemente precisam enriquecer seus eventos recebidos com informações adicionais para torná-los mais valiosos para os consumidores finais. Tradicionalmente, os clientes que usam o HAQM EventBridge conseguiriam isso escrevendo funções do AWS Lambda para aumentar seus eventos com dados suplementares. No entanto, essa abordagem exige escrever e manter código personalizado, adicionando complexidade ao pipeline de processamento de eventos.

O HAQM EventBridge Pipes facilita esse processo fornecendo um serviço simplificado e gerenciado para enriquecimento de eventos sem a necessidade de escrever e gerenciar funções personalizadas do Lambda. Esta postagem demonstra como você pode usar os recursos integrados de enriquecimento de dados do EventBridge Pipes para aprimorar dinamicamente seus eventos com contexto adicional e detalhes específicos do cliente, tornando o processamento de eventos mais eficiente e fácil de manter.

HAQM EventBridge Pipes

O HAQM EventBridge cria uma conexão direta entre fontes e destinos. Usar um barramento EventBridge ajuda você a rotear e distribuir eventos para serviços em um padrão pub/sub. O EventBridge Pipes, por outro lado, ajuda você com padrões de integrações de serviços ponto a ponto. O que o diferencia do padrão tradicional de barramento/regra de eventos é seu suporte à transformação e enriquecimento de dados.

Ao definir um EventBridge Pipes, você especifica a origem e o destino do canal. Os barramentos suportam uma variedade de fontes e alvos. Entre a origem e o destino, o EventBridge Pipes suporta filtragem e enriquecimento. A filtragem permite que você selecione e processe um subconjunto específico de eventos. O enriquecimento permite que você aprimore os dados adicionando as informações ausentes antes de enviá-las para um destino. Por exemplo, se um evento não tiver as informações necessárias, ele garante que o destino possa consumir adequadamente o evento. O enriquecimento de dados pode ser muito poderoso, pois possibilita aprimorar um evento genérico e transformá-lo. O EventBridge Pipes oferece suporte ao enriquecimento usando funções Lambda, AWS Step Functions, HAQM API Gateway e destinos de API EventBridge. Mais detalhes sobre esses conceitos podem ser encontrados na documentação de conceitos do HAQM EventBridge Pipes.

Representation of EventBridge Pipes showing filter and enrichment steps.

Figura 1: Representação dos EventBridge Pipes mostrando as etapas de filtro e enriquecimento

Esta postagem usará a etapa de enriquecimento do pipe para criar notificações personalizadas.

Visão geral

Para ilustrar a funcionalidade, esta solução usa um caso de uso de um varejista de roupas. Empresas como esse varejista querem manter seus clientes fiéis engajados. Freqüentemente, eles confiam em e-mails promocionais em massa que carecem de personalização. Nesse caso de uso, o varejista deseja enviar códigos de promoção direcionados. Assim que o 10º pedido é feito, o código é enviado por e-mail ou SMS ao cliente.

Sem o EventBridge Pipes, isso seria implementado usando o EventBridge para responder ao evento do pedido. Todos os eventos são enviados para uma função personalizada do Lambda para processá-los. Se o pedido atender às condições corretas, a função Lambda enviará uma notificação com o código de desconto ao cliente usando o HAQM Simple Notification Service (HAQM SNS).

Traditional approach using EventBridge.

Figura 2: Abordagem tradicional usando o EventBridge

Embora essa arquitetura funcione, ela exige que você mantenha o código de integração e a lógica de enriquecimento de dados na função Lambda, pois a função precisa extrair as informações necessárias dos eventos e gerenciar o roteamento para o SNS. À medida que mais microsserviços seguem o mesmo padrão, o código se torna mais complexo. Isso pode levar a tempos de execução mais longos, além de custos mais altos e maior esforço de manutenção.

Simplificando o uso do HAQM EventBridge Pipes

O HAQM EventBridge Pipes pode ser usado para simplificar a implementação anterior ao lidar com o enriquecimento e a integração entre os serviços. O HAQM EventBridge Pipes se encarrega de enviar o evento para sua etapa de enriquecimento configurada e, em seguida, encaminha o evento enriquecido para o destino. Se o método escolhido for uma função Lambda, ele deixará o código da função focado apenas na lógica de enriquecimento. Ele elimina a necessidade de código para extrair os campos necessários do evento e enviar notificações.

Solution architecture using EventBridge Pipes

Figura 3: Arquitetura da solução usando EventBridge Pipes

Quando o evento começa, a etapa de enriquecimento aciona uma função Lambda, que verificará a elegibilidade e retornará a mensagem para ser encaminhada ao SNS. Se o cliente não estiver qualificado para receber um código de desconto, ele retornará uma mensagem de confirmação do pedido com os dados recuperados do evento do pedido original. Se o cliente estiver qualificado para um desconto, a mensagem também conterá o código de desconto.

Essa é a arquitetura do fluxo atualizado:

  1. Um cliente pede um novo item. O pedido é enviado para uma fila de pedidos do Simple Queue Service (SQS).
  2. A nova mensagem na fila de pedidos aciona os EventBridge Pipes.
  3. O pipe aciona uma função do AWS Lambda para enriquecer os dados.
  4. As funções verificam se o cliente está qualificado para receber um código de desconto em uma tabela do HAQM DynamoDB. A tabela contém o número de vezes que cada cliente fez o pedido.
  5. A função Lambda retorna a mensagem personalizada que será enviada ao cliente, com ou sem o código de desconto.
  6. A mensagem é roteada para um tópico do SNS pelo EventBridge Pipe
  7. O cliente recebe a notificação por meio de seu método de assinatura preferido.

Criando o fluxo atualizado

Para criar o fluxo atualizado, optei por usar o AWS Cloud Development Kit (CDK) em Python. Você pode usar o código fornecido aqui para implantá-lo em sua conta. O código também pode ser encontrado no GitHub.

Observação: esse código de exemplo serve apenas para fins de teste e não deve ser usado em uma conta de produção.

Para essa solução, você precisa dos seguintes pré-requisitos:

  1. A AWS Command Line Interface (CLI) instalada e configurada para uso.
  2. Uma função ou usuário do Identity and Access Management (IAM) com permissões suficientes para criar uma política do IAM, uma tabela do DynamoDB, uma fila SQS, um tópico do SNS, uma função Lambda e um EventBridge Pipes.
  3. CDK DA AWS
  4. Python versão 3.9 ou superior, com pip e virtual virtualenv.

Depois que os pré-requisitos forem atendidos, configure um novo projeto CDK do Python em um diretório vazio:

mkdir blog_code
cd blog_code
cdk init app –-language python

Em seguida, ative o ambiente virtual e instale as dependências do CDK:

source .venv/bin/activate
python -m pip install -r requirements.txt

O comando cdk init cria uma pasta blog_code. O repositório do GitHub contém o código do arquivo blog_code_stack.py dentro da pasta blog_code.

Em seguida, dentro da pasta blog_code, crie uma nova pasta chamada lambda. Dentro dessa nova pasta, crie um arquivo chamado index.py. Esse arquivo conterá o código da função lambda de enriquecimento. Mais uma vez, esse código pode ser encontrado no repositório do GitHub. Aqui está uma seção do código Lambda:

def lambda_handler(event, context):

    message = json.loads(event[0]['body'])

    id = message['id']
    order_content = message['order_content']
    
    nmb_orders = get_number_of_orders(id)
    
    # Calculate orders left
    orders_left = MAX_ORDERS - nmb_orders
    
    # Update the DynamoDB table with the new number of orders
    if nmb_orders == MAX_ORDERS:
        update_table(id, 0)
    else:
        update_table(id, nmb_orders)
    
    if orders_left == 0:
        return [f"Thank you for your order of {order_content}. You have earned a 10% discount code on your next order: XA5GT2SF"]
    else:  
        # Return the confirmation message
        return [f"Thank you for your order of {order_content}. This is your confirmation message! Only {orders_left} orders left until a 10% discount!"]

A função Lambda funciona da seguinte forma:

  1. Recebe um evento do EventBridge Pipe que consiste no pedido e no ID do usuário que fez o pedido
  2. Obtém o número de pedidos que o usuário já fez chamando um comando getItem na tabela do DynamoDB.
  3. Calcula quantos pedidos faltam antes que o usuário receba o código de desconto.
  4. Atualiza a tabela do DynamoDB com o novo número de pedidos para contabilizar o que acabou de ser feito.
  5. Se o usuário tiver feito o número certo de pedidos, retornará uma mensagem de confirmação com o código de desconto. Caso contrário, notifica o usuário sobre o número de pedidos que ainda precisam ser feitos para obter o desconto.

Agora, implante a stack do CDK em sua conta. Verifique se você está no diretório raiz do seu projeto:

cdk bootstrap
cdk deploy

Quando a implantação da stack for concluída, você encontrará um pipe do EventBridge visível no console acessando a página de serviço do EventBridge e clicando em Pipes no painel esquerdo.

Testando a solução

Para testar a solução, você deve primeiro configurar uma assinatura do tópico do SNS para receber notificações. É recomendável configurar notificações por e-mail para fins de simplicidade e teste. Para fazer isso, siga as instruções na documentação do HAQM SNS para o tópico com o nome TargetTopic. Quando a assinatura estiver configurada, não se esqueça de verificar sua caixa de entrada de e-mail e confirmar a assinatura.

Depois que as notificações estiverem configuradas, visite a página do console do DynamoDB. Você precisa adicionar manualmente uma entrada à tabela de elegibilidade para simular um ambiente real:

  1. Clique em Tabelas no painel esquerdo
  2. Selecione a tabela de elegibilidade.
  3. Clique em Explorar itens da tabela e depois em Criar item
  4. Insira um id com um valor de 01.
  5. Clique em Adicionar novo atributo e selecione String.
  6. Em nome do atributo, insira pedidos e, em valor, insira 8.
  7. Clique em Criar item.

A tabela Itens devolvidos deve ter a seguinte aparência. Isso pressupõe que o cliente já tenha feito 8 pedidos.

Items returned table after adding a new item.

Figura 4: Tabela de itens retornados após a adição de um novo item

Agora, visite a página do console SQS. Você precisará enviar uma mensagem para a fila para imitar os novos pedidos que estão sendo feitos.

  1. Clique na fila chamada SourceQueue.
  2. Clique em Enviar e receber mensagens.
  3. No corpo da mensagem, cole a mensagem a seguir e clique em Enviar mensagem:
{
    "order_content": "large shirt",
    "id": "01",
    "username": "johndoe01",
    "transaction_time": "10:04:00"
  }

Após alguns minutos, você deverá receber um e-mail confirmando seu pedido, pois sua mensagem de pedido é considerada o pedido. Envie a mensagem novamente para fazer um 10º pedido e você deverá receber seu código de desconto!

Email received with a discount code.

Figura 5: E-mail recebido com um código de desconto

Limpeza

Para excluir os recursos da sua conta, execute o seguinte comando no diretório raiz do seu projeto:

cdk destroy

Conclusão

Esta postagem mostrou como o HAQM EventBridge Pipes e seu recurso de enriquecimento podem ajudar você a criar notificações personalizadas. Primeiro, discutiu como ele poderia ser implementado usando o EventBridge e, em seguida, apresentou uma implementação simplificada usando o EventBridge Pipes.

Para obter mais informações sobre padrões comuns para EventBridge Pipes, você pode conferir Implementação de padrões arquitetônicos com HAQM EventBridge Pipes.

Para obter mais recursos de aprendizado sem servidor, visite Serverless Land. Para encontrar mais padrões, acesse diretamente a Coleção de padrões serverless.

Este blog é uma tradução do conteúdo original em inglês (link aqui).

Biografia dos Autores

Elie Elmalem, Associate Scale Solutions Architect

Biografia do Tradutor

Rodrigo Peres é Arquiteto de Soluções na AWS, com mais de 20 anos de experiência trabalhando com arquitetura de soluções, desenvolvimento de sistemas e modernização de sistemas legados.

Biografia do Revisor

Daniel Abib é arquiteto de soluções sênior na AWS, com mais de 25 anos trabalhando com gerenciamento de projetos, arquiteturas de soluções escaláveis, desenvolvimento de sistemas e CI/CD, microsserviços, arquitetura Serverless & Containers e segurança. Ele trabalha apoiando clientes corporativos, ajudando-os em sua jornada para a nuvem.

http://www.linkedin.com/in/danielabib/