Wie kann ich ein benutzerdefiniertes Ereignismuster für eine EventBridge-Regel erstellen?

Lesedauer: 5 Minute
0

Ich möchte bestimmte Ereignisse für AWS-Services mit einer Amazon-EventBridge-Regel erfassen. Ich kann jedoch kein benutzerdefiniertes Ereignismuster erstellen, das dem Ereignis entspricht. Wie kann ich ein benutzerdefiniertes EventBridge-Ereignismuster erstellen?

Auflösung

Hinweis: Wenn Sie beim Ausführen von AWS-Command-Line-Interface-Befehlen (AWS CLI) Fehler erhalten, stellen Sie sicher, dass Sie die neueste AWS-CLI-Version verwenden.

EventBridge akzeptiert Ereignisse von AWS-Services, EventBridge-Partnern und benutzerdefinierte Ereignisse. Dieser Artikel beschreibt JSON-Ereignisse, die aus AWS-Services stammen. Sie können EventBridge-Regeln mit Ereignismustern erstellen, um eingehende Ereignisse zu filtern. Auf diese Weise stimmt die EventBridge-Regel nur mit den gewünschten Ereignissen überein und leitet diese Ereignisse an die Ziele weiter.

Bestimmen Sie das JSON-Format des eingehenden Ereignisses

Es gibt drei Methoden, um das JSON-Format für ein eingehendes Ereignis zu bestimmen:

  1. Öffnen Sie die EventBridge-Konsole.
  2. Wählen Sie im Navigationsbereich unter Entwicklerressourcen die Option Sandbox aus.
  3. Scrollen Sie zum Abschnitt Beispielereignis und wählen Sie dann AWS-Ereignisse aus.
  4. Wählen Sie im Menü Beispielereignisse die Option Benachrichtigung über Änderung des EC2-Instance-Status. Dadurch wird das Fenster mit dem ersten Beispielereignis gefüllt. Für einen bestimmten Ereignistyp sind möglicherweise mehrere Samples verfügbar.
  • Erstellen Sie eine EventBridge-Regel mit einem einfachen Ereignismuster, das allen Ereignissen für einen gegebenen AWS-Service entspricht. Dieses Ereignismuster stimmt beispielsweise mit allen Amazon-Elastic-Compute-Cloud-Ereignissen (AmazonEC2) überein:
{
 "source": [ "aws.ec2" ]
}

Hinweis: Platzhalter und leere Ereignisse sind im Ereignismuster nicht zulässig.

Ordnen Sie als Nächstes ein SNS- oder ein CloudWatch-Protokollgruppenziel der Regel zu, um eingehende Ereignisse zu erfassen. Für das Ziel muss die Eingabeoption Ziel konfigurieren auf Übereinstimmende Ereignisse gesetzt sein, damit der vom Service ausgegebene JSON korrekt empfangen wird.

Erstellen Sie ein Ereignismuster im gleichen JSON-Format wie das eingehende Ereignis

Die folgenden Regeln gelten für das Erstellen eines gültigen übereinstimmenden Ereignismusters:

  • Alle Felder, die Sie nicht in Ihrem Ereignismuster angeben, werden automatisch abgeglichen. Wenn beispielsweise Detail nicht im Ereignismuster angegeben ist, stimmt das Ereignismuster jedem Ereignis mit einem beliebigen Detail überein.
  • Um Felder abzugleichen, die in der JSON-Struktur eine Ebene weiter liegen, verwenden Sie geschweifte Klammern { }. Ein JSON-Viewer kann hilfreich sein, wenn Sie größere Ereignisstrukturen betrachten.
  • Die Zeichenfolge, die vom JSON-Ereignis abgeglichen werden soll, muss in eckigen Klammern [ ] stehen. Sie können mehrere Werte in eckige Klammern aufnehmen, sodass das Ereignis aufgerufen wird, wenn einer der Werte in einem eingehenden Ereignis vorhanden ist. Um beispielsweise basierend auf jedem von Amazon EC2 oder Amazon DynamoDB gesendeten Ereignis ein Ereignis aufzurufen, verwenden Sie diesen Filter:
{
 "source": [ "aws.ec2", "aws.dynamodb" ]
}

Schritt 1: Eingehendes Ereignis mithilfe des SNS-/CloudWatch-Ziels abrufen

Dieses Beispiel zeigt ein Route-53-Ereignis, das an EventBridge gesendet wurde. Der ChangeResourceRecordSets API-Aufruf stellt die Erstellung eines A-Datensatzes in einer von Amazon Route 53 gehosteten Zone dar. Ein Amazon-Simple-Notification-Service-Thema (Amazon SNS) oder ein Amazon CloudWatch-Protokollgruppen-Ziel erfasst das folgende Ereignis:

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

Schritt 2: Erstellen Sie das entsprechende EventPattern

In diesem Beispiel wird ein Ereignismuster für eine Reihe von Feldern gefiltert. Zum Beispiel EventName, HostedZoneId, Altion und Typ. Übereinstimmende Ereignisse müssen alle Felder und die entsprechenden Werte enthalten. Das Muster isoliert die A-Datensätze, die für eine bestimmte Hosting-Zone erstellt wurden.

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

Testen Sie das Ereignismuster

Mit der EventBridge-Konsole testen

Nutzen Sie die EventBridge-Sandbox: 

  1. Wählen Sie im Abschnitt Probenereignis ein Probenereignis aus, oder geben Sie es ein.
  2. Geben Sie im Abschnitt Ereignismuster ein Ereignismuster an. Sie können dies tun, indem Sie entweder ein Ereignismuster mithilfe der Menüs im Ereignismuster-Formular erstellen oder indem Sie ein benutzerdefiniertes Ereignismuster mit den benutzerdefinierten Mustern (JSON-Editor) eingeben.
  3. Nachdem beide Abschnitte ausgefüllt wurden, wählen Sie Testmuster aus, um zu bestätigen, dass das Ereignismuster mit dem angegebenen Beispielereignis übereinstimmt.

Testen mit der AWS CLI

Führen Sie in der AWS CLI den Befehltest-event-pattern aus. Um zu bestätigen, dass das Ereignismuster übereinstimmt, stellen Sie sicher, dass das Ergebnis wahr ist. Auf diese Weise können Sie die vom AWS-Service gesendeten JSON-Ereignisse identifizieren und Ihr benutzerdefiniertes Ereignismuster ermöglichen, um bestimmte Ereignisse zu erfassen.


Relevante Informationen

Amazon EventBridge-Ereignismuster

Erstellen von Amazon-EventBridge-Regeln, die auf Ereignisse reagieren

Tutorial: AWS-API-Aufrufe mit EventBridge protokollieren

Amazon EventBridge — Was ist der Unterschied zwischen CloudWatch Events und EventBridge?(Video)

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren