

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon EventBridge イベントパターンの作成
<a name="eb-event-patterns"></a>

特定のイベントバスまたはパイプに配信されるすべてのイベントを処理する必要がない場合があります。むしろ、イベントのソース、イベントタイプ、および/またはそれらのイベントの属性に基づいて、配信されるすべてのイベントのサブセットを選択することをお勧めします。

ターゲットに送信するイベントを指定するには、*イベントパターン*を作成します。イベントパターンは、ターゲットにイベントを送信するかどうかを決定するために が EventBridge 使用するデータを定義します。イベントパターンがイベントと一致する場合、 はイベントをターゲット EventBridge に送信します。イベントパターンは、一致するイベントと同じ構造をしています。イベントパターンは、イベントに一致するか、一致しないかのいずれかになります。

**ヒント**  
EventBridge サンドボックスを使用して、ルールを作成または更新する前に、サンプルイベントに対してイベントパターンをテストできます。詳細については、「[EventBridge サンドボックスを使用したイベントパターンのテスト](eb-event-pattern-sandbox.md)」を参照してください。

例えば、Amazon EC2 からの次のイベントを検討します。

```
{
  "version": "0",
  "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718",
  "detail-type": "EC2 Instance State-change Notification",
  "source": "aws.ec2",
  "account": "111122223333",
  "time": "2017-12-22T18:43:48Z",
  "region": "us-west-1",
  "resources": [
    "arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"
  ],
  "detail": {
    "instance-id": "i-1234567890abcdef0",
    "state": "terminated"
  }
}
```

次のイベントパターンは、Amazon EC2 の `instance-termination` イベントすべてを選択します。イベントパターンは、イベントに一致する 3 つの要件を指定することでこれを行います。

1. イベントソースは Amazon EC2 であること。

1. イベントは Amazon EC2 状態変更通知であること。

1. Amazon EC2 インスタンス の状態が `terminated` であること。

```
{
  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": {
    "state": ["terminated"]
  }
}
```

この例では、イベントパターンには、イベントに*関する*フィールド (`source` および `detail-type`)、およびイベント本文からのフィールド (`state`) が含まれていることに注意してください。

**重要**  
EventBridge では、予想よりも高い料金やスロットリングにつながる可能性のあるルールを作成できます。例えば、ルールが無限に再帰的に実行される無限ループに陥るようなルールを誤って作成してしまうことがあります。Amazon S3 バケットで ACL が変更されたことを検出し、ソフトウェアをトリガーして目的の状態に変更するルールを作成したとします。このルールが慎重に記述されていない場合は、その後 ACL を変更するとルールが再び開始され、無限ループが作成されます。  
このような予期しない結果を最小限に抑えるための正確なルールやイベントパターンを記述する方法に関するガイダンスについては、「[ルールのベストプラクティス](eb-rules-best-practices.md)」および「[ベストプラクティス](eb-patterns-best-practices.md)」を参照してください。

## イベントバスのイベントパターン
<a name="eb-event-patterns-buses"></a>

イベントバスでは、バス用に作成する各ルールにイベントパターンを指定できます。これにより、特定のターゲットに送信するイベントを選択できます。イベントバスのイベントパターンは、イベントソース、イベントメタデータ、および/またはイベント詳細値と照合できます。

![\[イベントは、各バスルールのイベントパターンと比較され、一致するとターゲットに送信されます。\]](http://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/images/event-pattern-bus_eventbridge_architecture.svg)


 次のビデオでは、イベントバスのイベントパターンの基本について説明します。




## EventBridge Pipes のイベントパターン
<a name="eb-event-patterns-pipes"></a>

 EventBridge Pipes では、イベントパターンを指定して、パイプターゲットに配信するパイプソースからのイベントをフィルタリングできます。各パイプには 1 つのイベントソースがあるため、パイプのイベントパターンはイベントメタデータや詳細値と照合できます。

![\[イベントはパイプのイベントパターンと比較され、一致するとターゲットに送信されます。\]](http://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/images/event-pattern-pipes_eventbridge_architecture.svg)


すべてのイベントフィールドを使用してパイプイベントパターンを構築できるわけではありません。詳細については、「[フィルタリング](eb-pipes-event-filtering.md)」を参照してください。

# イベントパターン構文
<a name="eb-create-pattern"></a>

イベントパターンを作成するには、イベントパターンにマッチングするイベントのフィールドを指定します。照合に使用するフィールドのみを指定します。

例えば、次のイベントパターンの例では、3 つのフィールドの値しか指定していません。最上位のフィールド `"source"` および `"detail-type"` と、`"detail"` オブジェクトフィールド内部の `"state"` フィールドです。ルールを適用するとき、EventBridge はイベント内の他のフィールドはすべて無視します。

```
{
  "source": ["aws.ec2"],
  "detail-type": ["EC2 Instance State-change Notification"],
  "detail": {
    "state": ["terminated"]
  }
}
```

イベントパターンがイベントに一致するには、イベントパターンに指定されているすべてのフィールド名がイベントに含まれている必要があります。フィールド名は、同じネスト構造になったイベントにも含まれていなければなりません。

イベントと一致するパターンを記述するときは、`TestEventPattern` API または `test-event-pattern` CLI コマンドを使用して、パターンが正しいイベントと一致することをテストできます。詳細については、「[TestEventPattern](https://docs.aws.amazon.com/AmazonCloudWatchEvents/latest/APIReference/API_TestEventPattern.html)」を参照してください。

## イベント値の照合
<a name="eb-filtering-match-values"></a>

イベントパターンでマッチングする値は JSON 配列形式で、角かっこ ([ と ]) で囲むと複数の値を指定できます。例えば、Amazon EC2 または のイベントを一致させるには AWS Fargate、次のパターンを使用できます。このパターンは、 `"source"`フィールドの値が `"aws.ec2"`または のイベントと一致します`"aws.fargate"`。

```
{
    "source": ["aws.ec2", "aws.fargate"]
}
```

詳細については、「[複数のフィールド値での一致](eb-event-patterns-arrays.md)」を参照してください。

## Amazon EventBridge イベントパターンでの比較演算子の使用
<a name="eb-event-patterns-content-based-filtering"></a>

Amazon EventBridge は、イベントパターンを使用した宣言型のコンテンツフィルタリングをサポートしています。コンテンツのフィルタリングを使用すると、非常に限定的な条件下でのみイベントに一致する複雑なイベントパターンを作成できます。例えば、次の場合にイベントと一致するイベントパターンを作成できます。
+ イベントのフィールドが特定の数値範囲内にある場合。
+ イベントは特定の IP アドレスから発生する場合。
+ イベント JSON に特定のフィールドが存在しない場合。

詳細については、「[比較演算子](eb-create-pattern-operators.md)」を参照してください。

## イベントパターンを作成する際の考慮事項
<a name="eb-create-pattern-considerations"></a>

イベントパターンを作成する際に考慮すべき点は次のとおりです。
+ EventBridge は、イベントパターンに含まれていないフィールドをイベント内で無視します。実際には、`"*": "*"` とワイルドカードを指定すると、イベントパターンに含まれないフィールドにも一致します。
+ イベントパターンが一致する値は、JSON のルールに従います。二重引用符 (") で囲んだ文字列、数値、およびキーワード `true`、`false`、および `null` を含めることができます。
+ 文字列の場合、Eventbridge は文字単位の厳密な一致を使用し、大文字の小文字化など文字列の正規化は行われません。
+ 数値の場合、EventBridge は文字列表現を使用します。たとえば、300、300.0、3.0e2 は等しいとはみなされません。
+ 同じ JSON フィールドに複数のパターンが指定されている場合、EventBridge では最後のパターンのみを使用します。
+ EventBridge がイベントパターンをコンパイルして使用する場合、結合文字としてドット (.) が使用されることに注意してください。

  つまり、EventBridge は以下のイベントパターンを同一として扱います。

  ```
  ## has no dots in keys
  { "detail" : { "state": { "status": [ "running" ] } } }
  
  ## has dots in keys
  { "detail" : { "state.status": [ "running" ] } }
  ```

  また、どちらのイベントパターンも次の 2 つのイベントと一致することになります。

  ```
  ## has no dots in keys
  { "detail" : { "state": { "status": "running" } } }
  
  ## has dots in keys
  { "detail" : { "state.status": "running"  } }
  ```
**注記**  
これは現在の EventBridge の動作を説明するものであり、これを変更しない根拠にすべきではありません。
+ 重複するフィールドを含むイベントパターンは無効です。パターンに重複するフィールドが含まれている場合、EventBridge は最終的なフィールド値のみを考慮します。

  例えば、以下のイベントパターンは同じイベントと一致します。

  ```
  ## has duplicate keys
  {
    "source": ["aws.s3"],
    "source": ["aws.sns"],
    "detail-type": ["AWS API Call via CloudTrail"],
    "detail":  {
        "eventSource": ["s3.amazonaws.com"],
        "eventSource": ["sns.amazonaws.com"]
    }
  }
  
  ## has unique keys
  {
    "source": ["aws.sns"],
    "detail-type": ["AWS API Call via CloudTrail"],
    "detail": { "eventSource": ["sns.amazonaws.com"] }
  }
  ```

  また、EventBridge は次の 2 つのイベントを同一イベントとして扱います。

  ```
  ## has duplicate keys
  {
    "source": ["aws.s3"],
    "source": ["aws.sns"],
    "detail-type": ["AWS API Call via CloudTrail"],
    "detail":  [
      {
        "eventSource": ["s3.amazonaws.com"],
        "eventSource": ["sns.amazonaws.com"]
      }
    ]
  }
  
  ## has unique keys
  {
    "source": ["aws.sns"],
    "detail-type": ["AWS API Call via CloudTrail"],
    "detail": [
      { "eventSource": ["sns.amazonaws.com"] }
    ]
  }
  ```
**注記**  
これは現在の EventBridge の動作を説明するものであり、これを変更しない根拠にすべきではありません。

# イベントフィールド値でのイベントのマッチング
<a name="eb-filtering-data-types"></a>

イベントのマッチングには、JSON のデータ型と値をすべて使用できます。以下の例は、イベントとそれに一致するイベントパターンを示しています。

## フィールドのマッチング
<a name="eb-filtering-example"></a>

フィールドの値でマッチングすることができます。次の Amazon EC2 Auto Scaling イベントについて考えてみましょう。

```
{
  "version": "0",
  "id": "3e3c153a-8339-4e30-8c35-687ebef853fe",
  "detail-type": "EC2 Instance Launch Successful",
  "source": "aws.autoscaling",
  "account": "123456789012",
  "time": "2015-11-11T21:31:47Z",
  "region": "us-east-1",
  "resources": [],
  "detail": {
    "eventVersion": "",
    "responseElements": null
  }
}
```

上のイベントでは、マッチングに `"responseElements"` フィールドを使用できます。

```
{
  "source": ["aws.autoscaling"],
  "detail-type": ["EC2 Instance Launch Successful"],
  "detail": {
   "responseElements": [null]
  }
}
```

## 値の一致
<a name="eb-filtering-value-example"></a>

以下は、Amazon Macie イベントの一部です。これについて考えてみましょう。

```
{
  "version": "0",
  "id": "0948ba87-d3b8-c6d4-f2da-732a1example",
  "detail-type": "Macie Finding",
  "source": "aws.macie",
  "account": "123456789012",
  "time": "2021-04-29T23:12:15Z",
  "region":"us-east-1",
  "resources": [

  ],
  "detail": {
    "schemaVersion": "1.0",
    "id": "64b917aa-3843-014c-91d8-937ffexample",
    "accountId": "123456789012",
    "partition": "aws",
    "region": "us-east-1",
    "type": "Policy:IAMUser/S3BucketEncryptionDisabled",
    "title": "Encryption is disabled for the S3 bucket",
    "description": "Encryption is disabled for the Amazon S3 bucket. The data in the bucket isn’t encrypted 
        using server-side encryption.",
    "severity": {
        "score": 1,
        "description": "Low"
    },
    "createdAt": "2021-04-29T15:46:02Z",
    "updatedAt": "2021-04-29T23:12:15Z",
    "count": 2,
.
.
.
```

次のイベントパターンは、重要度スコアが 1 で、カウントが 2 のイベントと一致します。

```
{
  "source": ["aws.macie"],
  "detail-type": ["Macie Finding"],
  "detail": {
    "severity": {
      "score": [1]
    },
    "count":[2]
  }
}
```

# Amazon EventBridge イベントパターンでの Null 値や空の文字列とのマッチング
<a name="eb-event-patterns-null-values"></a>

**重要**  
EventBridge では、予想よりも高い料金やスロットリングにつながる可能性のあるルールを作成できます。例えば、ルールが無限に再帰的に実行される無限ループに陥るようなルールを誤って作成してしまうことがあります。Amazon S3 バケットで ACL が変更されたことを検出し、ソフトウェアをトリガーして目的の状態に変更するルールを作成したとします。このルールが慎重に記述されていない場合は、その後 ACL を変更するとルールが再び開始され、無限ループが作成されます。  
このような予期しない結果を最小限に抑えるための正確なルールやイベントパターンを記述する方法に関するガイダンスについては、「[ルールのベストプラクティス](eb-rules-best-practices.md)」および「[ベストプラクティス](eb-patterns-best-practices.md)」を参照してください。

[イベント](eb-events.md)のうち、Null 値や空の文字列を持つイベントフィールドと一致する[イベントパターン](eb-event-patterns.md)を作成できます。次のイベントの例を考えます。

予想よりも高い料金やスロットリングを避けるためのベストプラクティスをご覧ください

```
{
  "version": "0",
  "id": "3e3c153a-8339-4e30-8c35-687ebef853fe",
  "detail-type": "EC2 Instance Launch Successful",
  "source": "aws.autoscaling",
  "account": "123456789012",
  "time": "2015-11-11T21:31:47Z",
  "region": "us-east-1",
  "resources": [
   ],
  "detail": {
    "eventVersion": "",
    "responseElements": null
   }
}
```

`eventVersion` の値が空の文字列であるイベントとマッチングするには、上のイベント例と一致する次のイベントパターンを使用します。

```
{
  "detail": {
     "eventVersion": [""]
  }
}
```

`responseElements` の値が Null であるイベントとマッチングするには、上のイベント例と一致する次のイベントパターンを使用します。

```
{
  "detail": {
     "responseElements": [null]
  }
}
```

**注記**  
Null 値と空の文字列は、パターンマッチングで交換可能ではありません。空の文字列に一致するイベントパターンは、`null` の値に一致しません。

## AWS CloudFormation テンプレートでの null 値の使用
<a name="eb-event-patterns-null-values-cfn"></a>

AWS CloudFormation はテンプレート`null`の値を許可しません。YAML または JSON オブジェクト構文を使用して null 値を持つイベントパターンを定義すると、テンプレートの検証は失敗し、エラー が発生します`'null' values are not allowed in templates`。

この制限を回避するには、YAML または JSON オブジェクトの代わりに `EventPattern`プロパティを JSON 文字列として指定します。次の例は、 AWS CloudFormation テンプレートの null 値で を照合する方法を示しています。

```
MyRule:
  Type: AWS::Events::Rule
  Properties:
    EventPattern: '{"detail":{"responseElements":[null]}}'
```

# Amazon EventBridge のイベントフィールドの複数の値での一致
<a name="eb-event-patterns-arrays"></a>

[イベントパターン](eb-event-patterns.md)の各フィールドの値は、1 つ以上の値を含む配列です。イベントパターンは、配列の値のいずれかがイベントの値と一致すれば、[イベント](eb-events.md)に一致します。イベントの値が配列の場合、イベントパターン配列とイベント配列の交差部分が空でなければイベントパターンが一致したとみなされます。

**重要**  
EventBridge では、予想よりも高い料金やスロットリングにつながる可能性のあるルールを作成できます。例えば、ルールが無限に再帰的に実行される無限ループに陥るようなルールを誤って作成してしまうことがあります。Amazon S3 バケットで ACL が変更されたことを検出し、ソフトウェアをトリガーして目的の状態に変更するルールを作成したとします。このルールが慎重に記述されていない場合は、その後 ACL を変更するとルールが再び開始され、無限ループが作成されます。  
このような予期しない結果を最小限に抑えるための正確なルールやイベントパターンを記述する方法に関するガイダンスについては、「[ルールのベストプラクティス](eb-rules-best-practices.md)」および「[ベストプラクティス](eb-patterns-best-practices.md)」を参照してください。

例えば、次のフィールドを含むイベントパターンを考えてみましょう

```
"resources": [
   "arn:aws:ec2:us-east-1:123456789012:instance/i-b188560f",
   "arn:aws:ec2:us-east-1:111122223333:instance/i-b188560f",
   "arn:aws:ec2:us-east-1:444455556666:instance/i-b188560f",
]
```

上のイベントパターンの例は、次のフィールドが含まれているイベントに一致します。イベントパターン配列の最初の項目が、イベント配列の 2 番目の項目と一致するからです。

```
"resources": [
   "arn:aws:autoscaling:us-east-1:123456789012:autoScalingGroup:eb56d16b-bbf0-401d-b893-d5978ed4a025:autoScalingGroupName/ASGTerminate",
   "arn:aws:ec2:us-east-1:123456789012:instance/i-b188560f" 
]
```

# Amazon EventBridge のイベントパターンで使用する比較演算子
<a name="eb-create-pattern-operators"></a>

EventBridge で使用できるすべての比較演算子は以下のとおりです。

比較オペレーションは、`$or` と `anything-but` を除いてリーフノードでのみ機能します。


| **比較** | **例** | **ルール構文** | **イベントバスのサポート** | **パイプのサポート** | 
| --- | --- | --- | --- | --- | 
|  And  |  Location が「New York」、および Day が「Monday」  |  `"Location": [ "New York" ], "Day": ["Monday"]`  |  はい   |  はい  | 
| [指定したもの以外](#eb-filtering-anything-but) | 状態は「初期化」以外のすべての値。 | `"state": [ { "anything-but": "initializing" } ]` |  はい   |  はい  | 
| [指定の値で始まるもの以外](#eb-filtering-anything-but-prefix) | リージョンが US 以外 |  `"Region": [ { "anything-but": {"prefix": "us-" } } ]`  |  はい  |  なし  | 
| [指定の値で終わるもの以外](#eb-filtering-anything-but-suffix) | FileName の拡張子が .png 以外。 |  `"FileName": [ { "anything-but": { "suffix": ".png" } } ]`  |  はい  |  なし  | 
| [以外 (大文字と小文字を区別しない)](#eb-filtering-anything-but-ignore-case) | 状態は「initializing」(「INITIALIZING」など大文字と小文字が異なる変化形を含む) 以外の値。 | `"state": : [{ "anything-but": { "equals-ignore-case": "initializing" }}]}` |  はい  |  なし  | 
| [以外 (ワイルドカードを使用)](#eb-filtering-anything-but-wildcard) | FileName は、`/lib/` を含むファイルパスではない。 |  `"FilePath" : [{ "anything-but": { "wildcard": "*/lib/*" }}]`  |  はい  |  なし  | 
|  [指定の値で始まる](#eb-filtering-prefix-matching)  |  リージョンは US にある。  |  `"Region": [ {"prefix": "us-" } ]`  |  はい   |  はい  | 
| 指定の値で始まる (大文字と小文字を区別しない) | サービス名は、大文字と小文字に関係なく「eventb」で始まる。 | `{"service" : [{ "prefix": { "equals-ignore-case": "eventb" }}]}` |  はい   |  はい  | 
|  [空](eb-event-patterns-null-values.md)  |  LastName が空白。  |  `"LastName": [""]`  |  はい   |  はい  | 
|  等しい  |  Name が「Alice」  |  `"Name": [ "Alice" ]`  |  はい   |  はい  | 
|  [等しい (大文字と小文字を区別しない)](#eb-filtering-equals-ignore-case-matching)  |  Name が「Alice」  |  `"Name": [ { "equals-ignore-case": "alice" } ]`  |  はい   |  はい  | 
|  [で終わる](#eb-filtering-suffix-matching)  |  FileName は.png 拡張子で終わる  |  `"FileName": [ { "suffix": ".png" } ]`  |  はい   |  はい  | 
| 指定の値で終わる (大文字と小文字を区別しない) | サービス名は、「tbridge」という文字、または「TBRIDGE」などの大文字と小文字が異なる変化形で終わる。 | `{"service" : [{ "suffix": { "equals-ignore-case": "tBridge" }}]}` |  はい   |  はい  | 
|  [存在する](#eb-filtering-exists-matching)  |  ProductName が存在  |  `"ProductName": [ { "exists": true } ]`  |  はい   |  はい  | 
|  [存在しない](#eb-filtering-exists-matching)  |  ProductName が存在しない  |  `"ProductName": [ { "exists": false } ]`  |  はい   |  はい  | 
|  [以外](#eb-filtering-anything-but)  |  Weather が「Raining」以外  |  `"Weather": [ { "anything-but": [ "Raining" ] } ]`  |  はい   |  はい  | 
|  [Null](eb-event-patterns-null-values.md)  |  UserId が Null  |  `"UserID": [ null ]`  |  はい   |  はい  | 
|  [数値 (等しい)](#filtering-numeric-matching)  |  Price が 100  |  `"Price": [ { "numeric": [ "=", 100 ] } ]`  |  はい   |  はい  | 
|  [数値 (範囲)](#filtering-numeric-matching)  |  Price が 10 より大きく 20 以下  |  `"Price": [ { "numeric": [ ">", 10, "<=", 20 ] } ]`  |  はい   |  はい  | 
|  または  |  PaymentType が「Credit」または「Debit」  |  `"PaymentType": [ "Credit", "Debit"]`  |  はい   |  はい  | 
|  [Or (複数フィールド)](#eb-filtering-complex-example-or)  |  Location が「New York」、または Day が「Monday」  |  `"$or": [ { "Location": [ "New York" ] }, { "Day": [ "Monday" ] } ]`  |  はい   |  はい  | 
|  [ワイルドカード](#eb-filtering-wildcard-matching)  |  「dir」フォルダ内の .png 拡張子の付いたすべてのファイル  |  `"FileName": [ { "wildcard": "dir/*.png" } ] `  |  はい  |  なし  | 

## プレフィックスマッチング
<a name="eb-filtering-prefix-matching"></a>

イベントソース内の値のプレフィックスに応じてイベントをマッチングすることができます。文字列値にはプレフィックスマッチングを使用できます。

例えば、次のイベントパターンは、`"time": "2017-10-02T18:43:48Z"` のように `"time"` フィールドが `"2017-10-02"` で始まるすべてのイベントに一致します。

```
{
  "time": [ { "prefix": "2017-10-02" } ]
}
```

### 大文字と小文字を無視する際のプレフィックスマッチング
<a name="eb-filtering-prefix-matching-ignore-case"></a>

また、`equals-ignore-case` と `prefix.` を組み合わせて、値が始まる文字の大文字と小文字に関係なく、プレフィックス値を一致させることもできます。

例えば、次のイベントパターンは、`service` フィールドが文字列 `EventB` で始まるイベントだけでなく、`EVENTB`、`eventb`、またはそれらの文字の大文字と小文字も一致させます。

```
{
  "detail": {"service" : [{ "prefix": { "equals-ignore-case": "EventB" }}]}
}
```

## サフィックスマッチング
<a name="eb-filtering-suffix-matching"></a>

イベントソース内の値のサフィックスに応じてイベントをマッチングすることができます。文字列値にはサフィックスマッチングを使用できます。

例えば、次のイベントパターンは、`"FileName"` フィールドが `.png` ファイル拡張子で終わるすべてのイベントに一致します。

```
{
  "FileName": [ { "suffix": ".png" } ]
}
```

### 大文字と小文字を区別しないサフィックスマッチング
<a name="eb-filtering-suffix-matching-ignore-case"></a>

また、`equals-ignore-case` と `suffix.` を組み合わせて、値の末尾の文字の大文字と小文字に関係なく、サフィックス値を一致させることもできます。

例えば、次のイベントパターンは、`FileName` フィールドが文字列 `.png` で終わるイベントだけでなく、`.PNG` またはそれらの文字の大文字と小文字も一致させます。

```
{
  "detail": {"FileName" : [{ "suffix": { "equals-ignore-case": ".png" }}]}
}
```

## 「以外」のマッチング
<a name="eb-filtering-anything-but"></a>

*指定したもの以外*のマッチングは、ルールで指定されているもの以外のすべてに一致します。

文字列のみを含むリスト、または数字のみを含むリストを含む、文字列および数値で「以外」のマッチングを使用できます。

次のイベントパターンは、文字列と数字を使った「以外」のマッチングを示しています。

```
{
  "detail": {
    "state": [ { "anything-but": "initializing" } ]
  }
}

{
  "detail": {
    "x-limit": [ { "anything-but": 123 } ]
  }
}
```

次のイベントパターンは、文字列のリストを使った「以外」のマッチングを示しています。

```
{
  "detail": {
    "state": [ { "anything-but": [ "stopped", "overloaded" ] } ]
  }
}
```

次のイベントパターンは、数値のリストを使った「以外」のマッチングを示しています。

```
{
  "detail": {
    "x-limit": [ { "anything-but": [ 100, 200, 300 ] } ]
  }
}
```

### 大文字と小文字を区別せずに一致するもの
<a name="eb-filtering-anything-but-ignore-case"></a>

`equals-ignore-case` を `anything-but` と組み合わせて使用して、大文字と小文字に関係なく文字列値を一致させることもできます。

次のイベントパターンは、文字列「initializing」、「INITIALIZING」、「Initializing」、またはそれらの文字の他の大文字と小文字が含まれていない `state` フィールドと一致します。

```
{
  "detail": {"state" : [{ "anything-but": { "equals-ignore-case": "initializing" }}]}
}
```

以下のように `equals-ignore-case` を `anything-but` と組み合わせて使用して、値のリストと照合することもできます。

```
{
  "detail": {"state" : [{ "anything-but": { "equals-ignore-case": ["initializing", "stopped"] }}]}
}
```

### 「以外」マッチング (プレフィックス)
<a name="eb-filtering-anything-but-prefix"></a>

`prefix` と `anything-but` を組み合わせて、指定された値で始まらない文字列値に一致させることができます。これには、単一の値、または値のリストが含まれます。

次のイベントパターンは、`"state"` フィールドに `"init"` というプレフィックスを持たないすべてのイベントにマッチする、「以外」のマッチングを示しています。

```
{
  "detail": {
    "state": [ { "anything-but": { "prefix": "init" } } ]
  }
}
```

次のイベントパターンは、プレフィックスの値のリストを使った「以外」のマッチングを示しています。このイベントパターンは、`"state"` フィールドにプレフィックス `"init"` または `"stop"` のいずれも持たないイベントと一致します。

```
{
"detail": {
  "state" : [{ "anything-but": { "prefix": ["init", "stop"] } } ] }
  }
}
```

### 「以外」マッチング (サフィックス)
<a name="eb-filtering-anything-but-suffix"></a>

`suffix` と `anything-but` を組み合わせて、指定した値で終了しない文字列値に一致させることができます。これには、単一の値、または値のリストが含まれます。

次のイベントパターンは、`.txt` で終わらない `FileName` フィールドの値と一致します。

```
{
  "detail": {
    "FileName": [ { "anything-but": { "suffix": ".txt" } } ]
  }
}
```

次のイベントパターンは、サフィックスの値のリストを使った「以外」のマッチングを示しています。このイベントパターンは、`.txt` または `.rtf` で終わらない `FileName` フィールドの値と一致します。

```
{
  "detail": {
    "FileName": [ { "anything-but": { "suffix": [".txt", ".rtf"] } } ]
  }
}
```

### 「以外」マッチング (ワイルドカードを使用)
<a name="eb-filtering-anything-but-wildcard"></a>

ワイルドカード文字 (\$1) は、「以外」マッチングで指定した値の中で使用できます。これには、単一の値、または値のリストが含まれます。

次のイベントパターンは、`/lib/` を含まない `FileName` フィールドの値と一致します。

```
{
"detail": {
  "FilePath" : [{ "anything-but": { "wildcard": "*/lib/*" }}]
  }
}
```

次のイベントパターンは、ワイルドカードを含む値のリストを使った「以外」のマッチングを示しています。このイベントパターンは、`/lib/` または `/bin/` を含まない `FileName` フィールドの値と一致します。

```
{
"detail": {
  "FilePath" : [{ "anything-but": { "wildcard": ["*/lib/*", "*/bin/*"] }}]
  }
}
```

詳細については、「[ワイルドカードを使用したマッチング](#eb-filtering-wildcard-matching)」を参照してください。

## 数値マッチング
<a name="filtering-numeric-matching"></a>

数値マッチングは、JSON 数値である値で動作します。精度が 15 桁 (小数点の右に 6 桁) の -5.0e9 から \$15.0e9 までの値に制限されています。

以下は、すべてのフィールドが真であるイベントにのみ一致するイベントパターンの数値マッチングを示しています。

```
{
  "detail": {
    "c-count": [ { "numeric": [ ">", 0, "<=", 5 ] } ],
    "d-count": [ { "numeric": [ "<", 10 ] } ],
    "x-limit": [ { "numeric": [ "=", 3.018e2 ] } ]
  }
}
```

## IP アドレスマッチング
<a name="eb-filtering-ip-matching"></a>

IP アドレスマッチングは、IPv4 アドレスと IPv6 アドレスに使用できます。次のイベントパターンは、10.0.0 で始まり、0 ～ 255 の数値で終わる IP アドレスに一致する IP アドレスを示しています。

```
{
  "detail": {
    "sourceIPAddress": [ { "cidr": "10.0.0.0/24" } ]
  }
}
```

## 存在マッチング
<a name="eb-filtering-exists-matching"></a>

*存在マッチング*は、イベントの JSON 内のフィールドの有無に対して機能します。

存在マッチングは、リーフノードでのみ機能します。中間ノードでは機能しません。

次のイベントパターンは、`detail.state` フィールドを持つイベントと一致します。

```
{
  "detail": {
    "state": [ { "exists": true  } ]
  }
}
```

前のイベントパターンは、次のイベントと一致します。

```
{
  "version": "0",
  "id": "7bf73129-1428-4cd3-a780-95db273d1602",
  "detail-type": "EC2 Instance State-change Notification",
  "source": "aws.ec2",
  "account": "123456789012",
  "time": "2015-11-11T21:29:54Z",
  "region": "us-east-1",
  "resources": ["arn:aws:ec2:us-east-1:123456789012:instance/i-abcd1111"],
  "detail": {
    "instance-id": "i-abcd1111",
    "state": "pending"
  }
}
```

前のイベントパターンは、次のイベントとは一致しません。`detail.state` フィールドがないからです。

```
{
  "detail-type": [ "EC2 Instance State-change Notification" ],
  "resources": [ "arn:aws:ec2:us-east-1:123456789012:instance/i-02ebd4584a2ebd341" ],
  "detail": {
    "c-count" : {
       "c1" : 100
    }
  }
}
```

## Equals-ignore-case マッチング
<a name="eb-filtering-equals-ignore-case-matching"></a>

*Equals-ignore-case* は、大文字と小文字に関係なく文字列値に適用されます。

次のイベントパターンは、大文字小文字に関係なく、指定された文字列と一致する `detail-type` フィールドを持つイベントと一致します。

```
{
  "detail-type": [ { "equals-ignore-case": "ec2 instance state-change notification" } ]
}
```

前のイベントパターンは、次のイベントと一致します。

```
{
  "detail-type": [ "EC2 Instance State-change Notification" ],
  "resources": [ "arn:aws:ec2:us-east-1:123456789012:instance/i-02ebd4584a2ebd341" ],
  "detail": {
    "c-count" : {
       "c1" : 100
    }
  }
}
```

## ワイルドカードを使用したマッチング
<a name="eb-filtering-wildcard-matching"></a>

ワイルドカード文字 (\$1) を使用してイベントパターン内の文字列値と一致させることができます。

**注記**  
現在、ワイルドカード文字はイベントバスルールでのみサポートされています。

イベントパターンでワイルドカードを使用する場合の考慮事項:
+ 1 つの文字列値にはワイルドカード文字をいくつでも指定できますが、ワイルドカード文字を連続して使用することはサポートされていません。
+ EventBridge では、バックスラッシュ文字 (\$1) を使用してワイルドカードフィルターのリテラル \$1 および \$1 を指定できます。
  + 文字列 `\*` はリテラル \$1 文字を表します。
  + 文字列 `\\` はリテラル \$1 文字を表します。

  バックスラッシュを使用して他の文字をエスケープすることはサポートされていません。

### ワイルドカードとイベントパターンの複雑さ
<a name="eb-filtering-wildcard-matching-complexity"></a>

ワイルドカードを使用するルールの複雑さには制限があります。ルールが複雑すぎる場合、EventBridge はルールを作成しようとしたときに `InvalidEventPatternException` を返します。ルールでこのようなエラーが発生した場合は、以下のガイダンスを参考にしてイベントパターンの複雑さを軽減することを検討してください。
+ **使用するワイルドカード文字の数を減らす**

  ワイルドカード文字は、複数の可能な値と一致させることが本当に必要な場合にのみ使用します。例えば、次のイベントパターンで、同じリージョン内のイベントバスと一致させる場合を考えてみます。

  ```
  {
  "EventBusArn": [ { "wildcard": "*:*:*:*:*:event-bus/*" } ]
  }
  ```

  上記の場合、ARN のセクションの多くは、イベントバスが存在するリージョンに直接基づいています。したがって、`us-east-1` リージョンを使用している場合は、次の例のように、複雑さを減らしたパターンでも必要な値と一致します。

  ```
  {
  "EventBusArn": [ { "wildcard": "arn:aws:events:us-east-1:*:event-bus/*" } ]
  }
  ```
+ **ワイルドカード文字の後に繰り返される文字シーケンスを減らす**

  ワイルドカードを使用した後に同じ文字シーケンスが複数回出現すると、イベントパターンの処理が複雑になります。イベントパターンを再キャストして、繰り返されるシーケンスを最小限に抑えます。次の例で、任意のユーザーのファイルのファイル名 `doc.txt` と一致させる場合を考えてみます。

  ```
  {
  "FileName": [ { "wildcard": "/Users/*/dir/dir/dir/dir/dir/doc.txt" } ]
  }
  ```

  `doc.txt` ファイルが、指定したパスにのみ存在することがわかっている場合は、繰り返される文字シーケンスを次の方法で減らすことができます。

  ```
  {
  "FileName": [ { "wildcard": "/Users/*/doc.txt" } ]
  }
  ```

## 複数のマッチングを含む複雑な例
<a name="eb-filtering-complex-example"></a>

複数のマッチングルールを組み合わせて、より複雑なイベントパターンにすることができます。例えば、次のイベントパターンでは、`anything-but` と `numeric` を組み合わせています。

```
{
  "time": [ { "prefix": "2017-10-02" } ],
  "detail": {
    "state": [ { "anything-but": "initializing" } ],
    "c-count": [ { "numeric": [ ">", 0, "<=", 5 ] } ],
    "d-count": [ { "numeric": [ "<", 10 ] } ],
    "x-limit": [ { "anything-but": [ 100, 200, 300 ] } ]
  }
}
```

**注記**  
イベントパターンを構築するときに、キーを複数回含めると、最後のリファレンスがイベントの評価に使用されるものになります。たとえば、次のパターンの場合：  

```
{
  "detail": {
    "location": [ { "prefix": "us-" } ],
    "location": [ { "anything-but": "us-east" } ]
  }
}
```
`{ "anything-but": "us-east" }` のみが `location` を評価する際に考慮されます。

## 複数の `$or` マッチングを含む複雑な例
<a name="eb-filtering-complex-example-or"></a>

また、複数のフィールドにわたって*任意の*フィールド値が一致するかどうかを確認する複雑なイベントパターンを作成することもできます。`$or` を使用して、複数のフィールドの値のいずれかが一致した場合に一致するイベントパターンを作成します。

`$or` コンストラクト内の個々のフィールドのパターンマッチングには、[数値マッチング](#filtering-numeric-matching)や[配列など](eb-event-patterns-arrays.md)、他のフィルタータイプを含めることができますので注意してください。

次のいずれかの条件が満たされる場合、次のイベントパターンと一致します。
+ `c-count` フィールドが 0 より大きい、または 5 以下。
+ `d-count` フィールドが 10 未満。
+ `x-limit` フィールドが 3.018e2 に等しい。

```
{
  "detail": {
    "$or": [
      { "c-count": [ { "numeric": [ ">", 0, "<=", 5 ] } ] },
      { "d-count": [ { "numeric": [ "<", 10 ] } ] },
      { "x-limit": [ { "numeric": [ "=", 3.018e2 ] } ] }
    ]
  }
}
```

**注記**  
イベントパターン (`PutRule`、`CreateArchive`、`UpdateArchive`、および `TestEventPattern`) を受け入れる API では、`$or` を使用した結果、1000 を超えるルールの組み合わせが生成された場合、`InvalidEventPatternException` をスローします。  
イベントパターン内のルールの組み合わせの数を決定するには、イベントパターン内の各 `$or` 配列の引数の合計数を掛けます。たとえば、上記のパターンには 3 つの引数を持つ単一の `$or` 配列が含まれているため、ルールの組み合わせの総数も 3 つになります。2 つの引数を持つ別の `$or` 配列を追加した場合、ルールの組み合わせの合計は 6 つになります。

# Amazon EventBridge のイベントパターンのベストプラクティス
<a name="eb-patterns-best-practices"></a>

イベントバスルールでイベントパターンを定義する際に考慮すべきいくつかのベストプラクティスを以下に示します。

## 無限ループを記述することは避ける
<a name="eb-patterns-best-practices-loops"></a>

EventBridge では、ルールが繰り返し開始される無限ループにつながるルールが作成される可能性があります。たとえば、S3 バケットで ACL が変更されたことを検出し、ソフトウェアをトリガーして ACL を目的の状態に変更するルールがあるとします。このルールが慎重に記述されていない場合は、その後 ACL を変更するとルールが再び開始され、無限ループが作成されます。

このような問題を防ぐには、ルールのイベントパターンをできるだけ正確に記述して、実際にターゲットに送信したいイベントのみと一致するようにします。上の例では、トリガーされたアクションが同じルールを再実行しないように、イベントと一致するイベントパターンを作成します。例えば、何らかの変更の後ではなく、ACL が不良状態であることが判明した場合にのみイベントと一致するイベントパターンをルールに作成します。詳細については、「[イベントパターンをできるだけ正確にする](#eb-patterns-best-practices-precision)」および「[イベントソースの更新を考慮してイベントパターンの範囲を設定する](#eb-patterns-best-practices-future-proof)」を参照してください。

無限ループにより、予想よりも高い料金がすぐに発生する可能性があります。また、スロットリングやイベント配信の遅延にもつながる可能性があります。呼び出し率の上限を監視して、予期しないボリュームの急上昇について警告を受けることができます。

予算の設定を使用すると、料金が指定の限度を超えたときにアラートが通知されます。詳細については、「[予算によるコストの管理](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/budgets-managing-costs.html)」を参照してください。

## イベントパターンをできるだけ正確にする
<a name="eb-patterns-best-practices-precision"></a>

イベントパターンが正確であればあるほど、実際に望むイベントのみに一致する可能性が高くなり、新しいイベントがイベントソースに追加されたり、既存のイベントが更新されて新しいプロパティを含むようになったりしても、予期せぬ一致が回避されます。

イベントパターンには、次の条件に一致するフィルターを含めることができます。
+ イベントに関するイベントメタデータ (例: `source`、`detail-type`。`account`、または `region`)。
+ これはイベントデータで、`detail` オブジェクト内のフィールドです。
+ イベントの内容、または `detail` オブジェクト内のフィールドの実際の値。

ほとんどのパターンは、`source` や `detail-type` フィルターのみの指定など、単純です。ただし、EventBridge のパターンには、イベントの任意のキーまたは値でフィルタリングできる柔軟性があります。さらに、`prefix` などのコンテンツフィルターや `suffix` フィルターを適用して、パターンの精度を向上させることができます。詳細については、「[Amazon EventBridge イベントパターンでの比較演算子の使用](eb-create-pattern.md#eb-event-patterns-content-based-filtering)」を参照してください。

### イベントソースと詳細タイプをフィルターとして指定する
<a name="eb-patterns-best-practices-source"></a>

`source` および `detail-type` メタデータフィールドを使用してイベントパターンをより正確にすることで、無限ループの生成や望ましくないイベントの一致を減らすことができます。

2 つ以上のフィールド内の特定の値を一致させる必要がある場合は、値の 1 つの配列に考えられるすべての値を一覧表示するのではなく、`$or` 比較演算子を使用してください。

経由で配信されるイベントの場合は AWS CloudTrail、 `eventName`フィールドをフィルターとして使用することをお勧めします。

次のイベントパターンの例では、Amazon Simple Queue Service サービス`SetQueueAttributes`からの `CreateQueue`または 、`CreateKey`または AWS Key Management Service サービスからの `DisableKeyRotation` イベントに一致します。

```
{
  "detail-type": ["AWS API Call via CloudTrail"],
  "$or": [{
      "source": [
        "aws.sqs"
        ],
      "detail": {
        "eventName": [
          "CreateQueue",
          "SetQueueAttributes"
        ]
      }
    },
    {
      "source": [
        "aws.kms"
        ],
      "detail": {
        "eventName": [
          "CreateKey",
          "DisableKeyRotation"
        ]
      }
    }
  ]
}
```

### アカウントと地域をフィルターとして指定する
<a name="eb-patterns-best-practices-accounts-regions"></a>

イベントパターンに `account` と `region` フィールドを含めると、クロスアカウントまたはクロスリージョンのイベント照合を制限できます。

### コンテンツフィルターを指定する
<a name="eb-patterns-best-practices-content"></a>

コンテンツベースのフィルタリングは、イベントパターンの長さを最小限に抑えながら、イベントパターンの精度を向上させるのに役立ちます。例えば、考えられるすべての数値を一覧表示する代わりに、数値範囲に基づく照合が役立つ場合があります。

詳細については、「[Amazon EventBridge イベントパターンでの比較演算子の使用](eb-create-pattern.md#eb-event-patterns-content-based-filtering)」を参照してください。

## イベントソースの更新を考慮してイベントパターンの範囲を設定する
<a name="eb-patterns-best-practices-future-proof"></a>

イベントパターンを作成するときは、イベントスキーマとイベントドメインが時間の経過とともに進化し拡大する可能性があることを考慮する必要があります。繰り返しになりますが、イベントパターンをできるだけ正確にすることで、イベントソースが変更または拡大された場合に予期しない一致が発生するのを防ぐのに役立ちます。

例えば、支払い関連のイベントを公開する新しいマイクロサービスのイベントと照合するとします。最初に、サービスはドメイン `acme.payments` を使用し、1 つのイベント `Payment accepted` を公開します。

```
{
  "detail-type": "Payment accepted",
  "source": "acme.payments",
  "detail": {
    "type": "credit",
    "amount": "100",
    "date": "2023-06-10",
    "currency": "USD"
    }
  }
}
```

この時点で、支払い承認イベントと一致する簡単なイベントパターンを作成できます。

```
{ “source” : “acme.payments” }
```

ただし、支払い拒否に対して後でサービスが次の新しいイベントを導入したとします。

```
{
  "detail-type": "Payment rejected",
  "source": "acme.payments",
  "detail": {
  }
}
```

この場合、作成した単純なイベントパターンが、`Payment accepted` と `Payment rejected` 両方のイベントと一致するようになります。EventBridge は、どちらのタイプのイベントも指定されたターゲットにルーティングして処理するため、処理が失敗し、追加の処理コストが発生する可能性があります。

`Payment accepted` イベントのみにイベントパターンの範囲を限定するには、`source` と `detail-type` の両方を最小に指定する必要があります。

```
{
  "detail-type": "Payment accepted",
  "source": "acme.payments"
  }
}
```

イベントパターンにアカウントとリージョンを指定して、クロスアカウントまたはクロスリージョンのイベントがこのルールに一致するタイミングをさらに制限することもできます。

```
{
  "account": "012345678910",
  "source": "acme.payments",
  "region": "AWS-Region",
  "detail-type": "Payment accepted"
}
```

## イベントパターンを検証する
<a name="eb-patterns-best-practices-validate"></a>

ルールが目的のイベントと一致することを確認するために、イベントパターンを検証することを強くお勧めします。EventBridge コンソールまたは API を使用してイベントパターンを検証できます。
+ EventBridge コンソールでは、[ルール作成の一環として](eb-create-rule-visual.md)、または[サンドボックスを使用して](eb-event-pattern-sandbox.md)個別にイベントパターンを作成およびテストできます。
+ test[test-event-pattern](https://docs.aws.amazon.com/cli/latest/reference/events/test-event-pattern.html) コマンド AWS CLI を使用して、 でイベントパターンをテストできます。