Blog de Amazon Web Services (AWS)

Cree aplicaciones para actualizaciones en tiempo real con Amazon EventBridge y AWS AppSync

Esta publicación está escrita por Josh Kahn, líder de tecnología, Serverless.

Amazon EventBridge ahora soporta la publicación de eventos hacia APIs GraphQL de AWS AppSync como un destino nativo. La nueva integración permite a los desarrolladores publicar eventos fácilmente a una variedad más amplia de consumidores y simplifica la actualización de los clientes con datos prácticamente en tiempo real. Puede usar EventBridge y AWS AppSync para crear arquitecturas orientadas a eventos de forma resiliente y basadas en suscripciones desde múltiples consumidores.

Para ilustrar el uso de EventBridge con AWS AppSync, considere un escenario simplificado de operaciones aeroportuarias. En este ejemplo, las compañías aéreas publican eventos relacionados a los vuelos (por ejemplo, embarque, aplazamiento, cambios de puerta y retrasos) hacia un servicio que mantiene el estado del vuelo en las pantallas de los aeropuertos. Las aerolíneas también emiten eventos que son útiles para otras entidades del aeropuerto, como los gestores de equipaje y equipos de mantenimiento, pero no para los pasajeros. A continuación una vista conceptual del sistema:

Conceptual view of the system

Los pasajeros quieren que las pantallas del aeropuerto estén actualizadas y sean precisas. Hay varias formas de diseñar la aplicación de visualización para que los datos permanezcan actualizados. En términos generales, estas opciones incluyen que la aplicación sondee alguna API o que la aplicación se suscriba a los cambios en los datos.

En este escenario es mejor usar la solución basada en suscripciones, ya que los cambios en los datos son pequeños e incrementales en relación con la gran cantidad de información que se muestra. En caso de retraso, por ejemplo, la pantalla actualiza el estado y la hora de salida, pero no los demás detalles de un vuelo que hace parte una lista más amplia de informaciones de vuelo.

Flight board

AWS AppSync permite a los clientes detectar cambios en los datos en tiempo real mediante el uso de suscripciones de GraphQL. Se implementan mediante una conexión WebSocket entre el cliente y el servicio AWS AppSync. El cliente de la aplicación de visualización invoca la operación de suscripción de GraphQL para establecer una conexión segura. AWS AppSync enviará automáticamente los cambios (o mutaciones) de datos a través de la API de GraphQL a los suscriptores que utilicen esa conexión.

Anteriormente, los desarrolladores podían usar los destinos tipo API de EventBridge para enviar a AWS AppSync los eventos publicados y enrutados a través de EventBridge, tal como se explica en éste blog más antiguo, y qué también están disponibles en la sección de patrones de Serverless Land (API Key, OAuth). Este enfoque resulta útil para tratar las actualizaciones “fuera de banda”, en las que los datos cambian por fuera de una mutación de AWS AppSync. Las actualizaciones fuera de banda requieren una fuente de datos tipo NONE en AWS AppSync para notificar los cambios a los suscriptores, tal y como se describe en el centro de conocimiento de AWS re:Post. La incorporación de AWS AppSync como destino para EventBridge simplifica estos casos de uso, ya que ahora puede activar una mutación en respuesta a un evento sin necesidad de código adicional.

Eventos de operaciones aeroportuarias

Ampliando el escenario, los eventos de operaciones aeroportuarias tienen el siguiente aspecto:

{
  "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 }"
}

El campo event identifica el tipo de evento y si es relevante para los pasajeros. Los detalles del evento proporcionan más información sobre el evento, que varía según el tipo de evento. El aeropuerto publica una variedad de eventos, pero las pantallas del aeropuerto solo necesitan un subconjunto de esos cambios.

Las API GraphQL de AWS AppSync comienzan con un esquema de GraphQL que define los tipos, los campos y las operaciones disponibles en esa API. La documentación de AWS AppSync proporciona una descripción general del esquema y otros elementos esenciales de GraphQL. El esquema parcial de GraphQL para el escenario aeroportuario es el siguiente:


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 EventBridge a AWS AppSync

EventBridge le permite filtrar, transformar y dirigir los eventos a varios destinos. El servicio de visualización del aeropuerto solo necesita eventos que afecten directamente a los pasajeros. Puede definir una regla en EventBridge que enrute solo esos eventos (incluidos en el esquema de GraphQL anterior) al destino de AWS AppSync. Otros eventos se redirigen a otros lugares, según lo definen otras reglas, o se descartan. Los detalles sobre la creación de las reglas de EventBridge y el formato del patrón de coincidencia de eventos se encuentran en la documentación de EventBridge.

El evento anterior correspondiente al retraso de un vuelo se entregaría mediante EventBridge de la siguiente manera:

{
  "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 }"
  }
}

En este escenario, hay una lista específica de eventos de interés, pero EventBridge proporciona un conjunto flexible de operaciones para hacer coincidir patrones, inspeccionar arreglos y filtrar por contenido mediante combinaciones de prefijos, numéricas u otros tipos de coincidencias. Algunas organizaciones también permitirán a los suscriptores definir sus propias reglas en un bus de eventos de EventBridge, lo que permitirá a los destinatarios suscribirse a los eventos mediante autoservicio.

El siguiente patrón de eventos sirve para hacer coincidir los eventos necesarios para el servicio de visualización del aeropuerto:

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

Para crear una nueva regla de EventBridge, puede utilizar la consola de administración de AWS o usar infraestructura como código. Encontrará la definición de CloudFormation para la regla creada, junto con el requerido para crear el destino de AWS AppSync, más adelante en esta publicación.

Console view

Cree el destino de AWS AppSync

Ahora que EventBridge está configurado para enrutar los eventos seleccionados, defina AWS AppSync como el destino de la regla. La API de AWS AppSync debe admitir autorización IAM para utilizarla como destino de EventBridge. AWS AppSync soporta varios tipos de autorización en cada tipo de GraphQL, por lo que también puede utilizar OpenID Connect, los grupos de usuarios de Amazon Cognito u otros métodos de autorización según sea necesario.

Para configurar AWS AppSync como un destino de EventBridge, defina el destino utilizando la consola de administración de AWS o infraestructura como código. En la consola, seleccione el tipo de destino como “Servicio de AWS” y el objetivo como “AppSync”. Seleccione su API. EventBridge analiza el esquema de GraphQL y le permite seleccionar la mutación que se invocará cuando se active la regla.

Al utilizar la consola de administración de AWS, EventBridge también configurará el rol de IAM de AWS necesario para invocar la mutación seleccionada. Recuerde crear y asociar el rol a una política de confianza adecuada cuando lo configure con IaC (Infraestructura como Código).

EventBridge target types

EventBridge admite la transformación de entradas para personalizar el contenido de un evento antes de pasar la información como entrada al destino. Configure el transformador de entrada para extraer los valores necesarios del evento mediante rutas JSON y una plantilla en el formato de entrada esperado por la API de AWS AppSync. EventBridge incluye una práctica utilidad en la consola para pasar y probar el resultado de un evento de muestra.

Target input transformer

Por último, configure el conjunto de selección para incluir la respuesta de la API de AWS AppSync. Estos son los campos que se devolverán a EventBridge cuando se invoque la mutación. Si bien el resultado devuelto a EventBridge no es demasiado útil (más allá de la solución de problemas), el conjunto de selección de mutaciones también determinará los campos disponibles para los suscriptores a onFlightStatusUpdate.

Configuring the selection set

Defina la regla EventBridge a AWS AppSync en CloudFormation

Las plantillas de infraestructura como código, incluidas AWS CloudFormation y AWS CDK, son útiles para codificar las definiciones de infraestructura para desplegarlas en todas las regiones y cuentas como sea requerido. Si bien puede escribir CloudFormation manualmente, EventBridge ofrece una utilidad de exportación de CloudFormation en la consola de administración de AWS. Puede utilizar esta funcionalidad para exportar la definición de una regla definida.

Export definition

Este es el CloudFormation para la regla configurada anteriormente y también para el destino AWS AppSync. Este fragmento incluye tanto la definición de la regla como la configuración 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
                  }
                }
              }}

El ARN del API de AWS AppSync tiene el formato arn:aws:appsync:<AWS_REGION>:<ACCOUNT_ID>:endpoints/graphql-api/<GRAPHQL_ENDPOINT_ID>. El ARN está disponible en CloudFormation (consulte el valor retornado en GraphQLendpointArn) o se puede crear con el identificador que se encuentra en el endpoint GraphQL de AWS AppSync. El ARN incluido en la política el rol de ejecución de EventBridge es el ARN de la API de AWS AppSync (un ARN diferente).

El campo AppSyncParameters incluye la operación GraphQL que EventBridge debe invocar en el API de AWS AppSync. Debe estar bien formateado y coincidir con el esquema de GraphQL. Incluya todos los campos que deben estar disponibles para los suscriptores en el conjunto de selección (selection set).

Probando las suscripciones

AWS AppSync ahora está configurado como un destino para la regla de EventBridge. La aplicación de visualización real utilizaría una librería de GraphQL, como por ejemplo AWS Amplify, para suscribirse a los cambios de datos en tiempo real. La consola de administración de AWS proporciona una utilidad para realizar pruebas. Diríjase a la consola de AWS AppSync y seleccione Consultas en el menú de su API. Introduzca la siguiente consulta y elija Ejecutar para suscribirse a los cambios de datos:

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

En otra pestaña del navegador, navegue hasta la consola de EventBridge y seleccione Enviar eventos.  En la página Enviar eventos, seleccione el bus de eventos correspondiente y establezca el origen del evento como “airport-operations”. A continuación, introduzca el tipo de detalle que desee. Por último, pegue lo siguiente como detalle del evento y, a continuación, presione 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 }"
  }
}

Regrese a la pestaña AWS AppSync en su navegador para ver los datos que han sido modificados en el panel de resultados:

Result pane

Conclusión

La invocación directa de los destinos tipo API GraphQL de AWS AppSync desde EventBridge simplifica y agiliza la integración entre estos dos servicios, lo que resulta ideal para notificar a diversos suscriptores sobre cambios en los datos en las cargas de trabajo con arquitecturas orientadas a eventos. También puede aprovechar otras funcionalidades disponibles en los dos servicios. Por ejemplo, utilice el filtrado de suscripciones mejorado de AWS AppSync para actualizar únicamente las pantallas de los aeropuertos de la terminal en la que se encuentran.

Para obtener más información sobre la tecnología sin servidor en AWS, visite Serverless Land y encontrará una amplia gama de patrones, tutoriales y materiales de aprendizaje reutilizables. Se ha añadido recientemente a la biblioteca de patrones un patrón de EventBridge a AWS AppSync similar al que se describe en esta publicación. Consulte la documentación de EventBridge para obtener más información.

Para obtener más recursos de aprendizaje serverless en aws, visite Serverless Land.

 

Este blog en español es una traducción de la publicación original del blog en inglés (Enlace aquí).

Traductor: Andres Victoria | Senior Solution Architect en AWS – Bogotá, Colombia