EventBridge ルール用のカスタムイベントパターンを作成するにはどうすればよいですか?

最終更新日: 2022 年 9 月 27 日

Amazon EventBridge ルールを使用して、AWS のサービスの特定のイベントをキャプチャしたいと考えています。しかし、イベントに一致するカスタムイベントパターンを作成できません。カスタム EventBridge イベントパターンを作成するにはどうすればいいですか?

解決方法

注意: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください

EventBridge は、AWS サービス、EventBridge パートナーからのイベント、およびカスタムイベントを受け付けています。この記事では、AWS のサービスから発信される JSON イベントについて説明します。イベントパターンを使った EventBridge ルールを作成して、受信イベントをフィルタリングできます。これにより、EventBridge ルールは必要なイベントのみを照合し、それらのイベントをターゲットに転送します。

受信イベントの JSON 形式を確認する

受信イベントの JSON 形式の確認方法は 3 つあります。

    1. [EventBridge コンソール] を開きます。
    2. ナビゲーションペインの [開発者リソース] で、[サンドボックス] を選択します。
    3. [サンプルイベント] セクションまでスクロールし、[AWS のイベント] を選択します。
    4. [サンプルイベント] メニューから、[EC2 インスタンス状態変更通知] を選択します。これにより、ウィンドウに最初のサンプルイベントが表示されます。特定のイベントタイプでは、複数のサンプルが利用できる場合があります。
  • 指定された AWS サービスのすべてのイベントに一致するシンプルなイベントパターンで EventBridge ルールを作成します。例えば、このイベントパターンはすべての Amazon Elastic Compute Cloud (Amazon EC2) イベントと一致します。
{
 "source": [ "aws.ec2" ]
}

注: ワイルドカードや空のイベントはイベントパターンでは使用できません。

次に、SNS または CloudWatch ロググループターゲットをルールに関連付けて、インバウンドイベントをキャプチャします。サービスから送信された JSON が正しく受信されるように、ターゲットの [ターゲット入力の設定] オプションが [一致したイベント] に設定されている必要があります。

受信イベントと同じ JSON 形式でイベントパターンを作成する

有効な一致するイベントパターンの作成には、以下のルールが適用されます。

  • イベントパターンで指定しないフィールドは自動的にマッチングされます。例えば、イベントパターンで [Detail] (詳細) が指定されていない場合、イベントパターンは詳細を持つすべてのイベントに一致します。
  • JSON 構造のレベルが 1 つ下のフィールドを一致させるには、中括弧 { } を使用します。JSON ビューワーは、より大きなイベント構造を見ている場合に役立つことがあります。
  • JSON イベントから一致する文字列は、角括弧 []で囲む必要があります。角括弧内に複数の値を含めることで、いずれかの値が受信イベントに存在する場合にイベントが起動するようにすることができます。例えば、Amazon EC2 または Amazon DynamoDB によって送信されるすべてのイベントに基づいてイベントを起動するには、次のフィルタを使用します。
{
 "source": [ "aws.ec2", "aws.dynamodb" ]
}

ステップ 1: SNS /CloudWatch ターゲットを使用して受信イベントを取得する

この例は、EventBridge に送信された Route 53 イベントを示しています。ChangeResourceRecordSets API 呼び出しは、Amazon Route 53 ホストゾーンの A レコードの作成を表します。Amazon Simple Notification Service (Amazon SNS) トピックまたは Amazon CloudWatch ロググループターゲットは、次のイベントをキャプチャします。

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

ステップ 2: 対応するイベントパターンを作成する

この例のイベントパターンは、いくつかのフィールドをフィルタリングします。例えば、eventNamehostedZoneldactiontypeなどです。マッチングイベントには、すべてのフィールドと対応する値が含まれている必要があります。このパターンでは、特定のホストゾーンに対して作成された A レコードを分離します。

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

イベントパターンをテストする

EventBridge コンソールを使用してテストする

イベントブリッジのサンドボックスを活用: 

  1. [サンプルイベント] セクションから、サンプルイベントを選択または入力します。
  2. [イベントパターン] セクションで、イベントパターンを入力します。これは、イベントパターンフォームのメニューを使用してイベントパターンを作成するか、カスタムパターン (JSON エディター) を使用してカスタムイベントパターンを入力することで実行できます。
  3. 両方のセクションを入力したら、[テストパターン] を選択して、イベントパターンが指定されたサンプルイベントと一致することを確認します。

AWS CLI を使用してテストする

AWS CLI で、test-event-pattern コマンドを実行します。イベントパターンが一致することを確認するには、結果が true であることを確認します。こうすることで、AWS のサービスによって送信される JSON イベントを識別し、特定のイベントを捕捉するためのカスタムイベントパターンをサポートすることができます。