Saltar al contenido

¿Cómo puedo crear un patrón de eventos personalizado para una regla de EventBridge?

6 minutos de lectura
0

Quiero capturar eventos para los servicios de AWS con una regla de Amazon EventBridge. Sin embargo, no puedo crear un patrón de eventos personalizado que coincida con el evento.

Solución

Nota: Si se muestran errores al poner en marcha comandos de Interfaz de la línea de comandos de AWS (AWS CLI), consulte Solución de errores de AWS CLI. Además, asegúrese de utilizar la versión más reciente de la CLI de AWS.

EventBridge acepta eventos de los servicios de AWS, los socios de EventBridge y los eventos personalizados. En este artículo se describen los eventos de JSON que se originan en los servicios de AWS. Puede crear reglas de EventBridge con patrones de eventos para filtrar los eventos entrantes. De esta forma, la regla de EventBridge solo coincide con los eventos deseados y los reenvía a los destinos.

Determinación del formato JSON del evento entrante

Se utilizan tres métodos para determinar el formato JSON de un evento entrante:

Consulte esta lista de ejemplos de eventos de los servicios de AWS que recibe EventBridge.

EventBridge proporciona la herramienta Entorno de pruebas de Eventbridge para ayudar a los usuarios a crear y validar patrones de eventos. Por ejemplo, para crear un evento de cambio de estado de una instancia de EC2, siga estos pasos:

  1. Abra la consola de EventBridge.
  2. En el panel de navegación, expanda Recursos para desarrolladores y, a continuación, seleccione Entorno de pruebas.
  3. En la pestaña Patrón de eventos, de la sección Eventos de muestra, seleccione Eventos de AWS.
  4. En el campo Eventos de muestra, seleccione Notificación de cambios de estado en la instancia de EC2. Esto rellenará la ventana con el primer evento de ejemplo. Para un tipo de evento determinado, es posible que haya varios ejemplos disponibles.
  5. En la sección Método de creación, pruebe el patrón de eventos.
  6. Cree una regla de EventBridge con un patrón de eventos simple que coincida con todos los eventos de un servicio de AWS determinado. Por ejemplo, este patrón de eventos coincide con todos los eventos de Amazon Elastic Compute Cloud (Amazon EC2):
    <{ "source": [ "aws.ec2" ]
    }
    **Nota:**No se permiten eventos vacíos en el patrón de eventos.

A continuación, asocie un destino de SNS o de un grupo de registro de CloudWatch a la regla para capturar los eventos entrantes. El destino debe tener la opción Configurar entrada del destino establecida en Eventos coincidentes para recibir correctamente el formato JSON que emita el servicio.

Creación de un patrón de eventos en el mismo formato JSON que el evento entrante

Requisitos previos:

  • Los campos que no especifique en el patrón de eventos se comparan automáticamente. Por ejemplo, si el campo Detalles no se especifica en el patrón de eventos, entonces el patrón de eventos coincidirá con todos los eventos que tengan algún detalle.
  • Para hacer coincidir los campos que están un nivel por debajo de la estructura JSON, use llaves {}. Un visor JSON puede resultarle útil si busca estructuras de eventos más grandes.
  • La cadena que debe coincidir con el evento JSON debe estar entre corchetes []. Puede incluir varios valores entre corchetes para invocar al evento cuando alguno de los valores esté presente en un evento entrante. Por ejemplo, para invocar un evento en función de todos los eventos que envíe Amazon EC2 o Amazon DynamoDB, utilice el siguiente comando:
    { "source": [ "aws.ec2", "aws.dynamodb" ]
    }

Uso del destino de SNS o CloudWatch para obtener el evento entrante

En este ejemplo, se muestra un evento de tipo Route 53 emitido a EventBridge. La llamada a la API ChangeResourceRecordsets representa la creación de un registro A en una zona alojada de Amazon Route 53. Un tema de Amazon Simple Notification Service (Amazon SNS) o un objetivo del grupo de registro de Amazon CloudWatch captura el siguiente evento:

{
  "version": "0",
  "id": "d857ae5c-cc83-3742-ab88-d825311ee4e9",
  "detail-type": "AWS API Call via CloudTrail",
  "source": "aws.route53",
  "account": "123456789012",
  "time": "2019-12-05T16:50:53Z",
  "region": "us-east-1",
  "resources": [],
  "detail": {
    "eventVersion": "1.05",
    "userIdentity": {
      "type": "AssumedRole",
      "principalId": "AROAABCDEFGHIJKLMNOPQ:Admin",
      "arn": "arn:aws:sts::123456789012:assumed-role/Admin",
      "accountId": "123456789012",
      "accessKeyId": "ASIAABCDEFGH12345678",
      "sessionContext": {
        "sessionIssuer": {
          "type": "Role",
          "principalId": "AROAABCDEFGHIJKLMNOPQ",
          "arn": "arn:aws:iam::123456789012:role/Admin",
          "accountId": "123456789012",
          "userName": "Admin"
        },
        "webIdFederationData": {},
        "attributes": {
          "mfaAuthenticated": "false",
          "creationDate": "2019-12-05T16:28:27Z"
        }
      }
    },
    "eventTime": "2019-12-05T16:50:53Z",
    "eventSource": "route53.amazonaws.com",
    "eventName": "ChangeResourceRecordSets",
    "awsRegion": "us-east-1",
    "sourceIPAddress": "12.34.56.78",
    "userAgent": "console.amazonaws.com",
    "requestParameters": {
      "hostedZoneId": "Z1RP12345WXRQD",
      "changeBatch": {
        "changes": [
          {
            "action": "CREATE",
            "resourceRecordSet": {
              "type": "A",
              "tTL": 300,
              "resourceRecords": [
                {
                  "value": "4.4.4.4"
                }
              ],
              "name": "test.example.us."
            }
          }
        ]
      }
    },
    "responseElements": {
      "changeInfo": {
        "status": "PENDING",
        "id": "/change/C271P4WIKN511J",
        "submittedAt": "Dec 5, 2019 4:50:53 PM"
      }
    },
    "additionalEventData": {
      "Note": "Do not use to reconstruct hosted zone"
    },
    "requestID": "bbbf9847-96cb-45ef-b617-d535b9fe83d8",
    "eventID": "74e2d2c8-7497-4292-94d0-348272dbc4f7",
    "eventType": "AwsApiCall",
    "apiVersion": "2013-04-01"
  }
}

Creación del elemento EventPattern correspondiente

Este ejemplo de patrón de eventos filtra varios campos. Por ejemplo, eventName, HostedZoneld, acción y tipo. Los eventos coincidentes deben contener todos los campos y los valores correspondientes. El patrón aísla los registros A que se crearon en una zona alojada específica.

{
  "source": [
    "aws.route53"
  ],
  "detail": {
    "eventSource": [
      "route53.amazonaws.com"
    ],
    "eventName": [
      "ChangeResourceRecordSets"
    ],
    "requestParameters": {
      "hostedZoneId": [
        "Z1RP12345WXRQD"
      ],
      "changeBatch": {
        "changes": {
          "action": [
            "CREATE"
          ],
          "resourceRecordSet": {
            "type": [
              "A"
            ]
          }
        }
      }
    }
  }
}

Pruebe el patrón de eventos

Uso de la consola de EventBridge para probar el patrón de eventos

Para aprovechar el entorno de pruebas de EventBridge, complete los siguientes pasos:

  1. En la sección Evento de muestra, seleccione o introduzca un evento de muestra.
  2. En la sección Patrón de eventos, proporcione un patrón de eventos. Puede usar los menús del formulario Patrón de eventos para crear un patrón de eventos. O bien, puede introducir un patrón de eventos personalizado con la opción Patrones personalizados (editor JSON).
  3. Una vez tenga rellenadas ambas secciones, seleccione Patrón de prueba para confirmar que el patrón de eventos coincide con el evento de muestra que se ha dado.

Uso de la CLI de AWS para probar el patrón de eventos

En la CLI de AWS, ejecute el comando test-event-pattern. Para confirmar que el patrón de eventos coincide, asegúrese de que el resultado sea true. Puede identificar los eventos JSON que envíe el servicio de AWS y ayudar al patrón de eventos personalizado a capturar eventos específicos.

Información relacionada

Patrones de eventos de Amazon EventBridge

Tutorial: Creación de una regla de EventBridge que reaccione a las llamadas a la API de AWS con CloudTrail

Amazon EventBridge: ¿Cuál es la diferencia entre CloudWatch Events y EventBridge? en el sitio web de YouTube