Comment puis-je créer un modèle d'événement personnalisé pour une règle EventBridge ?

Date de la dernière mise à jour : 27/09/2022

Je veux capturer certains événements pour les services AWS avec une règle Amazon EventBridge. Cependant, je ne parviens pas à créer un modèle d'événement personnalisé correspondant à l'événement. Comment puis-je créer un modèle d'événement EventBridge personnalisé ?

Solution

Remarque : si vous recevez des erreurs lors de l'exécution des commandes de l'interface de la ligne de commande AWS (AWS CLI), assurez-vous que vous utilisez la version la plus récente d'AWS CLI.

EventBridge accepte les événements des services AWS, des partenaires EventBridge, ainsi que les événements personnalisés. Cet article décrit les événements JSON qui proviennent des services AWS. Vous pouvez créer des règles EventBridge à l’aide de modèles d'événements pour filtrer les événements entrants. Ce faisant, la règle EventBridge fait correspondre uniquement les événements souhaités et transmet ces événements aux cibles.

Détermination du format JSON de l'événement entrant

Il existe trois méthodes pour déterminer le format JSON d'un événement entrant :

    1. Ouvrez la console EventBridge.
    2. Dans le volet de navigation, sous Developer resources (Ressources pour développeurs), sélectionnez Sandbox (Environnement de test [sandbox]).
    3. Accédez à la section Sample event (Exemple d'événement), puis sélectionnez AWS events (Événements AWS).
    4. Dans le menu Sample events (Exemples d'événements), sélectionnez EC2 Instance State-change Notification (Notification de changement d'état de l'instance EC2). Le premier exemple d’événement est alors renseigné dans la fenêtre. Pour un type d'événement donné, il est possible que plusieurs exemples soient disponibles.
  • Créer une règle EventBridge avec un modèle d'événement simple qui correspond à tous les événements d'un service AWS donné. Par exemple, ce modèle d'événement correspond à tous les événements Amazon Elastic Compute Cloud (Amazon EC2) :
{
 "source": [ "aws.ec2" ]
}

Remarque : les caractères génériques et les événements vides ne sont pas autorisés dans le modèle d'événement.

Associez ensuite une cible SNS ou Groupe de journaux CloudWatch à la règle pour capturer les événements entrants. L'option Configure target input (Configurer l’entrée cible) doit être définie sur Matched events (Événements correspondants) pour que le JSON émis par le service soit reçu correctement.

Création d’un modèle d'événement dans le même format JSON que l'événement entrant

Les règles suivantes s'appliquent à la création d'un modèle d'événement correspondant valide :

  • Tous les champs que vous ne spécifiez pas dans votre modèle d'événement sont automatiquement mis en correspondance. Par exemple, si Detail (Détail) n'est pas spécifié dans le modèle d'événement, alors le modèle d'événement correspond à chaque événement avec n'importe quel détail.
  • Pour faire correspondre des champs d'un niveau vers le bas dans la structure JSON, utilisez des accolades { }. Une visionneuse JSON peut être utile si vous examinez des structures d'événements plus grands.
  • La chaîne à mettre en correspondance à partir de l'événement JSON doit être placée entre crochets [ ]. Vous pouvez inclure plusieurs valeurs entre crochets afin que l'événement soit invoqué lorsque l'une des valeurs est présente dans un événement entrant. Par exemple, pour invoquer un événement basé sur chaque événement envoyé par Amazon EC2 ou Amazon DynamoDB, utilisez ce filtre :
{
 "source": [ "aws.ec2", "aws.dynamodb" ]
}

Étape 1 : obtenir un événement entrant à l'aide de la cible SNS/CloudWatch

Cet exemple montre un événement Route 53 émis vers EventBridge. L'appel d'API ChangeResourceRecordSets représente la création d'un enregistrement A dans une zone hébergée Amazon Route 53. Une rubrique Amazon Simple Notification Service (Amazon SNS) ou une cible du groupe de journaux Amazon CloudWatch capture l'événement suivant :

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

Étape 2 : créer un EventPattern correspondant

Cet exemple de modèle d'événement filtre un certain nombre de champs. Par exemple, eventName, hostedZoneld, action et type. Les événements correspondants doivent contenir tous les champs, ainsi que les valeurs correspondantes. Le modèle isole les enregistrements A créés par rapport à une zone hébergée spécifique.

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

Test du modèle d'événement

Test à l'aide de la console EventBridge

Tirez parti de l’environnement de test (sandbox) EventBridge : 

  1. Dans la section Sample event (Exemple d'événement), sélectionnez ou saisissez un exemple d'événement.
  2. Dans la section Event pattern (Modèle d'événement), indiquez un modèle d'événement. Pour ce faire, vous pouvez créer un modèle d'événement à l'aide des menus du formulaire Modèle d'événement ou en saisissant un modèle d'événement personnalisé à l'aide des modèles personnalisés (éditeur JSON).
  3. Une fois les deux sections renseignées, sélectionnez Test pattern (Modèle de test) pour confirmer que le modèle d'événement correspond à l'exemple d'événement donné.

Test à l'aide d'AWS CLI

Dans l'AWS CLI, exécutez la commande test-event-pattern. Pour confirmer que le modèle d'événement correspond, assurez-vous que le résultat est true (vrai). Cela vous permet ainsi d'identifier les événements JSON envoyés par le service AWS et de faciliter la capture des événements spécifiques par votre modèle d'événement personnalisé.