

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 用於 Amazon EventBridge 中事件模式的比較運算子
<a name="eb-create-pattern-operators"></a>

EventBridge 所提供的所有比較運算子摘要如下。

比較運算子僅能在分葉節點上運作，除了 `$or` 和 `anything-but`。


| **Comparison** (比較) | **範例** | **Rule syntax** (規則語法) | **事件匯流排支援** | **管道支援** | 
| --- | --- | --- | --- | --- | 
|  及  |  位置為「紐約」，日期是「週一」  |  `"Location": [ "New York" ], "Day": ["Monday"]`  |  是  |  是  | 
| [任何項目 - 但](#eb-filtering-anything-but) | 狀態是「初始化」以外的任何值。 | `"state": [ { "anything-but": "initializing" } ]` |  是  |  是  | 
| [Anything-but （開頭為 )](#eb-filtering-anything-but-prefix) | 區域不在美國。 |  `"Region": [ { "anything-but": {"prefix": "us-" } } ]`  |  是  |  否  | 
| [Anything-but （結尾為 )](#eb-filtering-anything-but-suffix) | FileName 結尾不是 .png 副檔名。 |  `"FileName": [ { "anything-but": { "suffix": ".png" } } ]`  |  是  |  否  | 
| [Anything-but （忽略大小寫）](#eb-filtering-anything-but-ignore-case) | 狀態是除了「初始化」或任何其他大小寫變化以外的任何值，例如「初始化」。 | `"state": : [{ "anything-but": { "equals-ignore-case": "initializing" }}]}` |  是  |  否  | 
| [使用萬用字元的任何項目](#eb-filtering-anything-but-wildcard) | FileName 不是包含 的檔案路徑`/lib/`。 |  `"FilePath" : [{ "anything-but": { "wildcard": "*/lib/*" }}]`  |  是  |  否  | 
|  [開頭為](#eb-filtering-prefix-matching)  |  區域位於美國。  |  `"Region": [ {"prefix": "us-" } ]`  |  是  |  是  | 
| 開頭為 （忽略大小寫） | 服務名稱以字母 "eventb" 開頭，無論大小寫為何。 | `{"service" : [{ "prefix": { "equals-ignore-case": "eventb" }}]}` |  是  |  是  | 
|  [空白](eb-event-patterns-null-values.md)  |  LastName 為空。  |  `"LastName": [""]`  |  是  |  是  | 
|  Equals  |  名稱為「Alice」  |  `"Name": [ "Alice" ]`  |  是  |  是  | 
|  [等於 (忽略大小寫)](#eb-filtering-equals-ignore-case-matching)  |  名稱為「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 } ]`  |  是  |  是  | 
|  [Not](#eb-filtering-anything-but)  |  天氣是「下雨」以外的任何天氣  |  `"Weather": [ { "anything-but": [ "Raining" ] } ]`  |  是  |  是  | 
|  [Null](eb-event-patterns-null-values.md)  |  UserID 為 Null 值  |  `"UserID": [ null ]`  |  是  |  是  | 
|  [數字 (等於)](#filtering-numeric-matching)  |  價格為 100  |  `"Price": [ { "numeric": [ "=", 100 ] } ]`  |  是  |  是  | 
|  [數字 (範圍)](#filtering-numeric-matching)  |  價格大於 10，且小於或等於 20  |  `"Price": [ { "numeric": [ ">", 10, "<=", 20 ] } ]`  |  是  |  是  | 
|  或  |  PaymentType 為「信用卡」或「轉帳卡」  |  `"PaymentType": [ "Credit", "Debit"]`  |  是  |  是  | 
|  [或 (多個欄位)](#eb-filtering-complex-example-or)  |  位置為「紐約」，或日期是「週一」。  |  `"$or": [ { "Location": [ "New York" ] }, { "Day": [ "Monday" ] } ]`  |  是  |  是  | 
|  [萬用字元](#eb-filtering-wildcard-matching)  |  任何副檔名為 .png 的檔案，位於“dir”資料夾內  |  `"FileName": [ { "wildcard": "dir/*.png" } ] `  |  是  |  否  | 

## 前綴相符
<a name="eb-filtering-prefix-matching"></a>

您可以根據事件來源中某個值的前綴來比對事件。您可以使用前綴匹配字符串值。

例如，下面的事件模式將符合該 `"time"` 欄位以 `"2017-10-02"` 開始的任何事件，如 `"time": "2017-10-02T18:43:48Z"`。

```
{
  "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` 來比對開頭不是指定值的字串值。這包括單一值或值清單。

下列事件模式會顯示與 `"init"` `"state"` 欄位中沒有字首的任何事件相符的任何項目。

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

下列事件模式顯示與字首值清單搭配使用的任何相符項目。此事件模式符合任何沒有字首`"init"`或 `"stop"` `"state"` 欄位中的事件。

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

### 尾碼上任何項目但相符項目
<a name="eb-filtering-anything-but-suffix"></a>

您可以使用 `suffix`搭配 `anything-but` 來比對結尾不是指定值的字串值。這包括單一值或值清單。

下列事件模式符合欄位結尾`FileName`不是 的任何值`.txt`。

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

下列事件模式顯示與尾碼值清單搭配使用的任何相符項目。此事件模式會比對欄位結尾`FileName`不是 `.txt`或 的任何值`.rtf`。

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

### 使用萬用字元進行實物比對
<a name="eb-filtering-anything-but-wildcard"></a>

您可以在您為任何項目指定的值中使用萬用字元 (\$1)，但相符。這包括單一值或值清單。

下列事件模式符合不包含 之`FileName`欄位的任何值`/lib/`。

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

下列事件模式顯示與包含萬用字元之值清單搭配使用的任何相符項目。此事件模式會比對不包含 `/lib/`或 之`FileName`欄位的任何值`/bin/`。

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

如需詳細資訊，請參閱[使用萬用字元比對](#eb-filtering-wildcard-matching)。

## 數值比對
<a name="filtering-numeric-matching"></a>

數值比對適用於 JSON 數字的值。數值比對僅限於 -5.0e9 和 \$15.0e9 之間的值，具有 15 位數的精確度，或小數點後六位數。

以下顯示事件模式的數值比對，該模式僅符合所有欄位皆為 True 的事件。

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

## IP 地址比對
<a name="eb-filtering-ip-matching"></a>

您可以針對 IPv4 和 IPv6 地址使用 IP 地址比對。下列事件模式顯示針對 IP 地址的比對，這些 IP 地址以 10.0.0 開始，並以 0 到 255 之間的數字結尾。

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

## 等於忽略大小寫相符
<a name="eb-filtering-equals-ignore-case-matching"></a>

*等於忽略大小寫*相符適用於字符串值，無論大小寫如何。

下列事件模式符合具有與指定字串相符之 `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) 來比對事件模式中的字串值。

**注意**  
目前，僅在事件匯流排規則中支援萬用字元。

在事件模式中使用萬用字元時的考量事項：
+ 您可以在指定的字串值中指定任意數目的萬用字元，但不支援連續的萬用字元。
+ 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" } ]
  }
}
```
僅有在評估 `location` 時才會將 `{ "anything-but": "us-east" }` 考慮進去。

## 具有 `$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 ] } ] }
    ]
  }
}
```

**注意**  
如果使用 `$or` 導致產生超過 1000 個規則組合，則接受事件模式的 API (例如 `PutRule`、`CreateArchive`、`UpdateArchive` 和 `TestEventPattern`) 將擲回一個 `InvalidEventPatternException`。  
若要判定事件模式中的規則組合數，請乘以來自事件模式中每個 `$or` 陣列的引數總數。例如，上述模式包含一個帶有三個引數的單個 `$or` 陣列，因此規則組合的總數也是三個。如果您新增了具有兩個引數的另一個 `$or` 陣列，則規則組合總計會是六個。