Amazon EventBridge 事件模式中的內容過濾 - Amazon EventBridge

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

Amazon EventBridge 事件模式中的內容過濾

Amazon EventBridge 支援使用事件模式進行宣告式內容篩選。透過內容篩選功能,您可以撰寫複雜事件模式,並僅在非常特定的情況下符合事件。例如,您可以在下列情況下建立符合事件的事件模式:

  • 事件的欄位位於特定數值範圍內。

  • 該事件來自特定的 IP 地址。

  • 特定欄位不存在於事件 JSON 中。

重要

在中 EventBridge,可以建立可能導致電 higher-than-expected 荷和節流的規則。例如,您可能會不小心建立導致無限迴圈的規則,其中該規則會以遞迴方式觸發而不會結束。假設,您建立的規則可能會偵測到已在 Amazon S3 儲存貯體上變更 ACL,並觸發軟體來將它們變更為所需的狀態。如果未謹慎寫入規則,後續對 ACL 的變更會再次觸發規則,建立無限循環。

如需有關撰寫精確規則和事件模式以將此類非預期結果降到最低的指引,請參閱 定義 Amazon EventBridge 規則的最佳實務定義 Amazon EventBridge 事件模式的最佳實務

前綴相符

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

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

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

忽略大小寫的前綴匹配

您還可以匹配前綴值,而不管值開頭的字符的大小寫,結合使用 equals-ignore-case prefix.

例如,下列事件模式會比對service欄位以字元字串開始的任何事件EventB,但也是EVENTBeventb、或這些字元的任何其他大寫。

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

後綴相符

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

例如,下面的事件模式將符合該 "FileName" 欄位以 .png 檔案副檔名結束的任何事件。

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

忽略大小寫時的後綴匹配

您還可以匹配後綴值,而不管值結尾的字符的大小寫,結合使用 equals-ignore-case suffix.

例如,下列事件模式會比對FileName欄位以字元字串結束的任何事件.png.PNG或是這些字元的任何其他大寫。

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

除外相符

除外相符與規則中提供內容之外的任何項目都相符。

您可以使用與字符串和數字之間的除外相符功能,包括僅包含字串或僅包含數字的清單。

以下事件模式顯示與字符串和數字之間的除外相符。

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

任何事情-但匹配而忽略大小寫

您也可以結合使用 equals-ignore-caseanything-but, 以匹配字符串值,而不考慮字符大小寫。

以下事件模式匹配包含state字符串「初始化」,但也「初始化」,「初始化」或這些字符的任何其他大寫字符的字段。

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

您可以結合使用equals-ignore-caseanything-but以匹配值列表,以及:

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

任何事情-但匹配前綴

以下事件模式顯示了除外相符,其與 "state" 欄位中無前綴 "init" 的事件相符。

注意

除外相符僅適用於單個前綴,而非列表。

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

任何事情,但匹配後綴

您可以結合使用suffix以匹配字符串值,而不管字符大小寫如何。anything-but

注意

任何事情-但匹配只適用於單個後綴,而不是列表。

下列事件模式會比對結尾為之FileName欄位的任何值.txt

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

數值比對

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

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

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

IP 地址比對

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

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

存在相符

存在相符在事件的 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 } } }

電子quals-ignore-case 匹配

無論大小寫如何,E quals-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 } } }

使用萬用字元比對

您可以使用萬用字元 (*) 來比對事件模式中的字串值。

注意

目前,僅在事件匯流排規則中支援萬用字元。

在事件模式中使用萬用字元時的考量事項:

  • 您可以在指定的字串值中指定任意數目的萬用字元,但不支援連續的萬用字元。

  • EventBridge 支援使用反斜線字元 (\) 在萬用字元篩選器中指定常值 * 和\ 字元:

    • 該字符串 \* 表示常值 * 字元

    • 該字符串 \\ 表示常值 \ 字元

    不支援使用反斜線來逸出其他字元。

萬用字元和事件模式複雜性

使用萬用字元規則的複雜程度有限。如果規則太複雜,則在嘗試建立規則InvalidEventPatternException時 EventBridge 傳回。如果您的規則產生此類錯誤,請考慮使用以下指導來降低事件模式的複雜性:

  • 減少使用的萬用字元數

    僅有在您真正需要匹配多個可能值的情況下使用萬用字元。例如,請考慮下列事件模式,在此模式下您想要比對相同區域中的事件匯流排:

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

具有多個相符項目的複雜範例

您可以將多個相符規則合併為更複雜的事件模式。例如,以下事件模式結合了 anything-butnumeric

{ "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 相符項目的複雜範例

您還可以建立複雜的事件模式,以檢查是否有跨多個字段的任何字段值相符。如果多個欄位的任何值相符,則使用 $or 建立相符的事件模式。

請注意,您可以在您的 $or 建構模組中個別欄位的模式比對中包含其他篩選器類型,例如數值比對陣列

如果滿足下列任何條件,則下列事件模式會相符:

  • 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 (例如 PutRuleCreateArchiveUpdateArchiveTestEventPattern) 將擲回一個 InvalidEventPatternException

若要判定事件模式中的規則組合數,請乘以來自事件模式中每個 $or 陣列的引數總數。例如,上述模式包含一個帶有三個引數的單個 $or 陣列,因此規則組合的總數也是三個。如果您新增了具有兩個引數的另一個 $or 陣列,則規則組合總計會是六個。