O blog da AWS

Crie aplicativos em tempo real com o Amazon EventBridge e o AWS AppSync

Esta postagem foi escrita por Josh Kahn, líder técnico, Serverless. Adaptado para o português por Guilherme Souza Gomes, arquiteto de aplicações cloud sênior.

O Amazon EventBridge agora oferece suporte à publicação de eventos nas APIs do AWS AppSync GraphQL como destinos nativos. A nova integração permite que os criadores publiquem eventos facilmente para uma variedade maior de consumidores e simplifica a atualização dos clientes com dados quase em tempo real. Você pode usar o EventBridge e o AWS AppSync para criar arquiteturas baseadas em eventos resilientes e baseadas em assinaturas para todos os consumidores.

Para ilustrar o uso do EventBridge com o AWS AppSync, considere um cenário simplificado de operações aeroportuárias. Neste exemplo, as companhias aéreas publicam eventos de voo (por exemplo, embarque, atrasos, mudanças de portão e atrasos) em um serviço que mantém o status do voo nas telas do aeroporto. As companhias aéreas também publicam eventos que são úteis para outras entidades no aeroporto, como manipuladores de bagagem e manutenção, mas não para passageiros. Isso mostra uma visão conceitual do sistema:

Os passageiros querem que os monitores do aeroporto estejam atualizados e precisos. Há várias maneiras de projetar o aplicativo de exibição para que os dados permaneçam atualizados. Em termos gerais, isso inclui o aplicativo fazendo consultas periódicas em alguma API ou o aplicativo se increvendo para receber as alterações de dados.

As assinaturas para esse cenário são melhores, pois as alterações nos dados são pequenas e incrementais em relação à grande quantidade de informações exibidas. Em caso de atraso, por exemplo, a tela atualiza o status e o horário de partida, mas nenhum outro detalhe de um único voo em uma lista maior de informações do voo.

O AWS AppSync pode permitir que os clientes escutem alterações de dados em tempo real por meio do uso de assinaturas do GraphQL. Eles são implementados usando uma conexão WebSocket entre o cliente e o serviço AWS AppSync. O cliente do aplicativo de exibição invoca a operação de assinatura do GraphQL para estabelecer uma conexão segura. O AWS AppSync enviará automaticamente alterações (ou mutações) de dados por meio da API GraphQL para assinantes que usam essa conexão.

Anteriormente, os criadores podiam usar o EventBridge API Destinations para conectar eventos publicados e roteados por meio do EventBridge ao AWS AppSync, conforme descrito em uma postagem anterior no blog, e disponível nos padrões Serverless Land (API Key, OAuth). A abordagem é útil para lidar com atualizações “fora de banda” nas quais os dados mudam fora de uma mutação do AWS AppSync. As atualizações fora da banda geralmente exigem uma fonte de dados NONE no AWS AppSync para notificar os assinantes sobre as mudanças, conforme descrito no Centro de conhecimento do AWS re:Post Knowledge Center. A adição do AWS AppSync como destino para o EventBridge simplifica esses casos de uso, pois agora você pode acionar uma mutação em resposta a um evento sem código adicional.

Eventos de operações aeroportuárias

Expandindo o cenário, os eventos de operações aeroportuárias são assim:

{
  "flightNum": 123,
  "carrierCode": "JK",
  "date": "2024-01-25",
  "event": "FlightDelayed",
  "message": "Delayed 15 minutes, late aircraft",
  "info": "{ \"newDepTime\": \"2024-01-25T13:15:00Z\", \"delayMinutes\": 15 }"
}

O campo do evento identifica o tipo de evento e se ele é relevante para os passageiros. Os detalhes do evento fornecem mais informações sobre o evento, que variam de acordo com o tipo de evento. O aeroporto publica uma variedade de eventos, mas as exibições do aeroporto precisam apenas de um subconjunto dessas mudanças.

As APIs do AWS AppSync GraphQL começam com um esquema do GraphQL que define os tipos, campos e operações disponíveis nessa API. A documentação do AWS AppSync fornece uma visão geral do esquema e de outros fundamentos do GraphQL. O esquema parcial do GraphQL para o cenário do aeroporto é o seguinte:

type DelayEventInfo implements EventInfo {
	message: String
	delayMinutes: Int
	newDepTime: AWSDateTime
}

interface EventInfo {
	message: String
}

enum StatusEvent {
	FlightArrived
	FlightBoarding
	FlightCancelled
	FlightDelayed
	FlightGateChanged
	FlightLanded
	FlightPushBack
	FlightTookOff
}

type StatusUpdate {
	num: Int!
	carrier: String!
	date: AWSDate!
	event: StatusEvent!
	info: EventInfo
}

input StatusUpdateInput {
	num: Int!
	carrier: String!
	date: AWSDate!
	event: StatusEvent!
	message: String
	extra: AWSJSON
}

type Mutation {
	updateFlightStatus(input: StatusUpdateInput!): StatusUpdate!
}

type Query {
	listStatusUpdates(by: String): [StatusUpdate]
}

type Subscription {
	onFlightStatusUpdate(date: AWSDate, carrier: String): StatusUpdate
		@aws_subscribe(mutations: ["updateFlightStatus"])
}

schema {
	query: Query
	mutation: Mutation
	subscription: Subscription
}

Conecte o EventBridge ao AWS AppSync

O EventBridge permite filtrar, transformar e rotear eventos para vários destinos. O serviço de exibição do aeroporto só precisa de eventos que afetem diretamente os passageiros. Você pode definir uma regra no EventBridge que roteie somente esses eventos (incluídos no esquema anterior do GraphQL) para o destino do AWS AppSync. Outros eventos são roteados para outro lugar, conforme definido por outras regras, ou descartados. Detalhes sobre a criação das regras do EventBridge e o formato do padrão de correspondência de eventos podem ser encontrados na documentação do EventBridge.

O evento anterior de atraso de voo seria entregue usando o EventBridge da seguinte forma:

{
  "id": "b051312994104931b0980d1ad1c5340f",
  "detail-type": "Operations: Flight delayed",
  "source": "airport-operations",
  "time": "2024-01-25T16:58:37Z",
  "detail": {
    "flightNum": 123,
    "carrierCode": "JK",
    "date": "2024-01-25",
    "event": "FlightDelayed",
    "message": "Delayed 15 minutes, late aircraft",
    "info": "{ \"newDepTime\": \"2024-01-25T13:15:00Z\", \"delayMinutes\": 15 }"
  }

Nesse cenário, há uma lista específica de eventos de interesse, mas o EventBridge fornece um conjunto flexível de operações para combinar padrões, inspecionar matrizes e filtrar por conteúdo usando prefixo, numérico ou outra correspondência. Algumas organizações também permitirão que os assinantes definam suas próprias regras em um ônibus de eventos do EventBridge, permitindo que os alvos se inscrevam em eventos por meio de autoatendimento.

O padrão de eventos à seguir corresponde aos eventos necessários para o serviço de exibição do aeroporto:

{
  "source": [ "airport-operations" ],
  "detail": {
    "event": [ "FlightArrived", "FlightBoarding", "FlightCancelled", ... ]
  }
}

Para criar uma nova regra do EventBridge, você pode usar o AWS Management Console ou a infraestrutura como código. Você pode encontrar a definição do CloudFormation para a regra completa, com o destino do AWS AppSync, posteriormente nesta postagem.

Crie o destino do AWS AppSync

Agora que o EventBridge está configurado para rotear eventos selecionados, defina o AWS AppSync como o destino da regra. A API do AWS AppSync deve oferecer suporte à autorização do IAM para ser usada como destino do EventBridge. O AWS AppSync oferece suporte a vários tipos de autorização em um único tipo de GraphQL, então você também pode usar o OpenID Connect, grupos de usuários do Amazon Cognito ou outros métodos de autorização, conforme necessário.

Para configurar o AWS AppSync como um destino do EventBridge, defina o destino usando o AWS Management Console ou a infraestrutura como código. No console, selecione o tipo de destino como “Serviço da AWS” e o destino como “AppSync”. Selecione sua API. O EventBridge analisa o esquema do GraphQL e permite que você selecione a mutação a ser invocada quando a regra for acionada.

Ao usar o AWS Management Console, o EventBridge também configurará a função AWS IAM necessária para invocar a mutação selecionada. Lembre-se de criar e associar uma função a uma política de confiança apropriada ao configurar com o IaC.

O EventBridge suporta a transformação de entrada para personalizar o conteúdo de um evento antes de passar as informações como entrada para o destino. Configure o transformador de entrada para extrair os valores necessários do evento usando o caminho JSON e um modelo no formato de entrada esperado pela API do AWS AppSync. O EventBridge fornece um utilitário no console para aprovar e testar a saída de um evento de amostra.

Por fim, configure o conjunto de seleção para incluir a resposta da API do AWS AppSync. Esses são os campos que serão retornados ao EventBridge quando a mutação for invocada. Embora o resultado retornado ao EventBridge não seja muito útil (além da solução de problemas), o conjunto de seleção de mutações também determinará os campos disponíveis para os assinantes da assinatura OnFlightStatusUpdate.

Defina a regra do EventBridge para o AWS AppSync no CloudFormation

A infraestrutura como modelos de código, incluindo o AWS CloudFormation e o AWS CDK, são úteis para codificar definições de infraestrutura a serem implantadas em regiões e contas. Embora você possa escrever o CloudFormation manualmente, o EventBridge fornece uma exportação útil do CloudFormation no AWS Management Console. Você pode usar esse recurso para exportar o código de uma regra definida.

Esse é o CloudFormation para a regra configurada anteriormente e o destino do AWS AppSync. Esse trecho inclui a definição da regra e a configuração de destino.

PassengerEventsToDisplayServiceRule:
    Type: AWS::Events::Rule
    Properties:
      Description: Route passenger related events to the display service endpoint
      EventBusName: eb-to-appsync
      EventPattern:
        source:
          - airport-operations
        detail:
          event:
            - FlightArrived
            - FlightBoarding
            - FlightCancelled
            - FlightDelayed
            - FlightGateChanged
            - FlightLanded
            - FlightPushBack
            - FlightTookOff
      Name: passenger-events-to-display-service
      State: ENABLED
      Targets:
        - Id: 12344535353263463
          Arn: <AppSync API GraphQL API ARN>
          RoleArn: <EventBridge Role ARN (defined elsewhere)>
          InputTransformer:
            InputPathsMap:
              carrier: $.detail.carrierCode
              date: $.detail.date
              event: $.detail.event
              extra: $.detail.info
              message: $.detail.message
              num: $.detail.flightNum
            InputTemplate: |-
              {
                "input": {
                  "num": <num>,
                  "carrier": <carrier>,
                  "date": <date>,
                  "event": <event>,
                  "message": "<message>",
                  "extra": <extra>
                }
              }
          AppSyncParameters:
            GraphQLOperation: >-
              mutation
              UpdateFlightStatus($input:StatusUpdateInput!){updateFlightStatus(input:$input){
                event
                date
                carrier
                num
                info {
                  __typename
                  ... on DelayEventInfo {
                    message
                    delayMinutes
                    newDepTime
                  }
                }
              }}

O ARN da API do AWS AppSync segue o formato
arn:aws:appsync:<AWS_REGION>:<ACCOUNT_ID>:endpoints/graphql-api/<GRAPHQL_ENDPOINT_ID>. O ARN está disponível no CloudFormation (consulte o valor de retorno do GraphQLEndpointARN) ou pode ser criado usando o identificador encontrado no endpoint do AWS AppSync GraphQL. O ARN incluído na política de função de execução do EventBridge é o ARN da API do AWS AppSync (um ARN diferente).

O campo AppSyncParameters inclui a operação GraphQL para o EventBridge invocar na API do AWS AppSync. Isso deve estar bem formatado e corresponder ao esquema do GraphQL. Inclua todos os campos que devem estar disponíveis para os assinantes no conjunto de seleção.

Testando assinaturas

O AWS AppSync agora está configurado como um destino para a regra do EventBridge. O aplicativo de exibição real usaria uma biblioteca GraphQL, como o AWS Amplify, para assinar alterações de dados em tempo real. O AWS Management Console fornece um utilitário útil para testar. Navegue até o console do AWS AppSync e selecione Consultas no menu da sua API. Insira a consulta a seguir e escolha Executar para assinar as alterações de dados:

subscription MySubscription {
  onFlightStatusUpdate {
    carrier
    date
    event
    num
    info {
      __typename
      … on DelayEventInfo {
        message
        delayMinutes
        newDepTime
      }
    }
  }
}

}

Em uma guia separada do navegador, navegue até o console do EventBridge e escolha Enviar eventos. Na página Enviar eventos, selecione o barramento de eventos necessário e defina a origem do evento como “operações aeroportuárias”. Em seguida, insira um tipo de detalhe de sua escolha. Por fim, cole o seguinte como detalhe do evento e escolha Enviar.

{
  "id": "b051312994104931b0980d1ad1c5340f",
  "detail-type": "Operations: Flight delayed",
  "source": "airport-operations",
  "time": "2024-01-25T16:58:37Z",
  "detail": {
    "flightNum": 123,
    "carrierCode": "JK",
    "date": "2024-01-25",
    "event": "FlightDelayed",
    "message": "Delayed 15 minutes, late aircraft",
    "info": "{ \"newDepTime\": \"2024-01-25T13:15:00Z\", \"delayMinutes\": 15 }"
  }
}

Retorne à guia AWS AppSync em seu navegador para ver os dados alterados no painel de resultados:

Conclusão

A invocação direta de destinos da API AWS AppSync GraphQL do EventBridge simplifica e agiliza a integração entre esses dois serviços, ideal para notificar uma variedade de assinantes sobre alterações de dados em cargas de trabalho orientadas por eventos. Você também pode aproveitar outros recursos disponíveis nos dois serviços. Por exemplo, use a filtragem de assinatura aprimorada do AWS AppSync para atualizar somente as telas do aeroporto no terminal em que estão localizadas.

Para saber mais sobre serverless, visite Serverless Land para ver uma grande variedade de padrões reutilizáveis, tutoriais e materiais didáticos. Recentemente adicionado à biblioteca de padrões está um padrão do EventBridge para o AWS AppSync semelhante ao descrito nesta postagem. Visite a documentação do EventBridge para obter mais detalhes.

Para obter mais recursos de aprendizado serverless, visite Serverless Land.

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

Tradutor: Guilherme Souza Gomes | Senior Cloud Application Architect