Come posso creare un modello di evento personalizzato per una regola EventBridge?

Ultimo aggiornamento: 27/09/2022

Desidero catturare determinati eventi per i servizi AWS con una regola Amazon EventBridge. Tuttavia, non sono in grado di creare un modello di evento personalizzato che corrisponda all'evento. Come posso creare un modello di evento EventBridge personalizzato?

Risoluzione

Nota: se ricevi un messaggio di errore durante l'esecuzione dei comandi dell'interfaccia della linea di comando AWS (AWS CLI), assicurati di utilizzare la versione più recente dell'AWS CLI.

EventBridge accetta eventi dai servizi AWS, dai partner di EventBridge e da eventi personalizzati. Questo articolo descrive gli eventi JSON provenienti dai servizi AWS. Puoi creare regole EventBridge con modelli di eventi per filtrare gli eventi in arrivo. In questo modo, la regola EventBridge abbina solo gli eventi desiderati e inoltra tali eventi alle destinazioni.

Determinazione del formato JSON dell'evento in arrivo

Esistono tre metodi per determinare il formato JSON per un evento in arrivo:

    1. Apri la Console di EventBridge.
    2. Dal pannello di navigazione, in Risorse per sviluppatori, seleziona Sandbox (ambiente di sperimentazione).
    3. Scorri fino alla sezione Eventi di esempio, quindi seleziona Eventi AWS.
    4. Dal menu Eventi di esempio, seleziona Notifica di cambiamento di stato dell'istanza EC2. In questo modo la finestra verrà popolata con il primo evento di esempio. Potrebbero essere disponibili vari esempi per un determinato tipo di evento.
  • Crea una regola EventBridge con un modello di evento semplice che corrisponda a tutti gli eventi per un servizio AWS specifico. Ad esempio, questo modello di eventi corrisponde a tutti gli eventi di Amazon Elastic Compute Cloud (Amazon EC2):
{
 "source": [ "aws.ec2" ]
}

Nota: i jolly e gli eventi vuoti non sono consentiti nel modello degli eventi.

Quindi, associa alla regola un SNS o un gruppo di log CloudWatch di destinazione per acquisire gli eventi in ingresso. La destinazione deve avere l'opzione Configura l'input di destinazione impostata su Eventi corrispondenti in modo che il JSON emesso dal servizio venga ricevuto correttamente.

Creazione di un modello di evento nello stesso formato JSON dell'evento in arrivo

Le seguenti regole si applicano alla creazione di un modello di evento corrispondente valido:

  • Tutti i campi che non specifichi nel modello di evento vengono abbinati automaticamente. Ad esempio, se nel modello di evento non specifichi Detail, il modello di evento corrisponderà a ogni evento con qualsiasi dettaglio.
  • Per confrontare i campi che si trovano di un livello più in basso nella struttura JSON, utilizza le parentesi graffe { }. Se stai guardando strutture di eventi più grandi potrebbe essere utile un visualizzatore JSON.
  • La stringa da abbinare dall'evento JSON deve essere racchiusa tra parentesi quadre []. È possibile includere più valori tra parentesi quadre in modo che l'evento venga invocato quando uno dei valori è presente in un evento in arrivo. Ad esempio, per invocare un evento basato su ogni evento inviato da Amazon EC2 o Amazon DynamoDB, utilizza questo filtro:
{
 "source": [ "aws.ec2", "aws.dynamodb" ]
}

Fase 1: ottieni l'evento in arrivo utilizzando la destinazione SNS/CloudWatch

Questo esempio mostra un evento Route 53 emesso a EventBridge. La chiamata API ChangeResourceRecordSets rappresenta la creazione di un Record A in una zona ospitata di Amazon Route 53. Un argomento del Servizio di notifica semplice Amazon (Amazon SNS) o una destinazione del gruppo di log di Amazon CloudWatch rileva il seguente 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"
  }
}

Fase 2: crea il modello EventPattern corrispondente

Questo modello di evento di esempio può essere filtrato in base a vari campi. Nello specifico, eventName, HostedZoneld, action e type. Gli eventi corrispondenti devono contenere tutti i campi e i valori corrispondenti. Il modello isola i Record A creati su una zona ospitata specifica.

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

Test del modello di evento

Test mediante la console EventBridge

Sfrutta la sandbox (ambiente di sperimentazione) di EventBridge: 

  1. Dalla sezione Evento di esempio, seleziona o inserisci un evento di esempio.
  2. Nella sezione Modello di evento, fornisci un modello di evento. Puoi farlo creando un modello di evento utilizzando i menu nel modulo Modello di evento o inserendo un modello di evento personalizzato con i modelli personalizzati (editor JSON).
  3. Dopo aver completato entrambe le sezioni, seleziona Testa il modello per confermare che il modello di eventi corrisponda all'evento di esempio specificato.

Test mediante AWS CLI

In AWS CLI, esegui il comando test-event-pattern. Per verificare che il modello di evento corrisponda, assicurati che il risultato sia true. In questo modo, puoi identificare gli eventi JSON inviati dal servizio AWS e aiutare il modello di evento personalizzato a catturare eventi specifici.