【2023/10アップデート】Amazon EventBridgeのワイルドカードフィルターについての検証

# はじめに
今回は2023/10/3アップデートの【Amazon EventBridgeがルールでのワイルドカードフィルターのサポートを開始した件】についての検証結果をご紹介いたします。

# 目次
・検証するアップデート内容について
　・prefix・suffixとの違い
　・簡単な図解
・利用サービスと準備するもの
・検証方法
・環境構築
・検証結果
・注意
・おわりに
・参考

# 検証するアップデート内容について
**Amazon EventBridgeのルールにおいて、** アップデート前まではワイルドカードが使用できなかったが、今回のリリースにより**ワイルドカードフィルターがサポートされるようになった**というのがアップデートの内容です。

https://aws.amazon.com/jp/about-aws/whats-new/2023/10/amazon-eventbridge-wildcard-filters-rules/

# prefix・suffixとの違い
今回のアップデートの以前から、EventBridgeのルールでは、「prefix」「suffix」を使用してフィルタリングすることが可能でした。

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-event-patterns-content-based-filtering.html#eb-filtering-prefix-matching

## そもそも、prefix・suffixって？
:::note info
**prefix（接頭辞）**
・**値の頭の文字列**と一致させる機能
  例）「test_○○○」と一致するオブジェクトが格納されたらlambdaを実行
:::

:::note info
**suffix（接尾辞）**
・**値の末尾の文字列**と一致させる機能
  例）「○○○.csv」と一致するオブジェクトが格納されたらlambdaを実行
:::


## prefix・suffixとワイルドカードの違い
prefix・suffixは、「値の頭」「値の末尾」のように**片方しか**指定することが出来ません。
それに対してワイルドカードは、「値の頭と末尾」**どちらも**指定することが出来ます。


## prefix・suffixをワイルドカードのように使えないのか？
例えば **【「値の頭が"test_"かつ、末尾が".csv"」のオブジェクトが格納されたらlambdaを実行】** というルールにしたい場合、**【prefix"test_"　AND　suffix".csv"】** と設定すればワイルドカードのように使えそうです。

しかし、**prefixとsuffixをANDで繋げることは出来ません。**
prefixとsuffixを同時に設定した場合、それらは **「OR条件」** として扱われます。
こちらは後程ワイルドカードの検証と併せて確認を行います。


## 簡単な図解
アップデート前後でどのような変化があったのかを、
【S3バケットに「値の頭が"test_"かつ、末尾が".csv"のオブジェクト」が配置されたら、lambda関数を実行する】というルールをEventBridgeで設定したい場合を例に、ご説明します。

### アップデート前
アップデート前はワイルドカードが使用できなかったため、フォルダを分けるなどして対応する必要がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/a175497a-21d9-c53c-0503-c0373147ce8c.png)



### アップデート後
アップデート後はワイルドカードが使用できるようになったため、希望の挙動をそのまま実行することが可能になりました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/45eabea5-df36-b1ce-3de6-6ef94715f755.png)




# 利用サービスと準備するもの
・Lambda
　Lambda関数×1
 
・S3
　バケット×1
 
・EventBridge
　ルール×4
　　①ワイルドカード："test_*.csv"
　　②prefix："test_"
　　③surfix：".csv"
　　④prefix："test_"、surfix：".csv"

・IAM
　IAMロール×1
　＜ポリシー＞
 　AWSLambda_FullAccess
 　AmazonS3FullAccess
 　AmazonEventBridgeFullAccess
  
・アップロードするファイル×4
　　①test_0001.csv
　　②test_0001.pdf
　　③temp_0001.csv
　　④temp_0001.pdf



# 検証方法
今回は、先ほどアップデート後の図解として載せた内容で検証を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/aa827f1a-fd55-264d-5643-7b786fee712d.png)

検証の流れは下記ステップです。

【環境構築】
　① IAM にてS3・lambda・eventbridgeのフルアクセス権限を付与
　② 検証用のS3バケット作成
　　Amazon EventBridgeへの通知の送信を有効化
　③ lambda関数を作成
　④ eventbridgeでイベントバスを設定
　⑤ eventbridgeでルールを作成

【検証】
　① イベントバスで「イベントの検出を開始」
　② S3バケットにファイルを配置
　③ lambda関数が実行されたかを確認 
　　 ※eventbridgeで対象のルールを選択し、モニタリング「MatchedEvents」で結果を確認

# 環境構築
先程記載した環境構築①～⑤のうち、ポイントとなる②・⑤のみ詳細を記載します。

## Amazon EventBridgeへの通知の送信を有効化
環境構築手順②で検証用のS3バケットを作成した際、バケットのプロパティで**EventBridgeへの通知の送信を有効化**します。
こちらを有効化していないと、バケットにオブジェクトを配置しても、eventbridgeに通知されないため、注意が必要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/01024645-ef45-efa1-5872-4e0df7dbc0fe.png)


## eventbridgeでルールを作成
### ルールタイプ
　「イベントパターンを持つルール」に設定

 
### イベントパターン
**ルール①（ワイルドカード "test_*.csv"）**
：②で作成したS3の「eventbridge-wildcard-test」バケットに「値の頭が"test_"かつ、末尾が".csv"のファイルが「アップロード」

```ruby:qiita.rb
{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["eventbridge-wildcard-test"]
    },
    "object": {
      "key": [{
        "wildcard": "test_*.csv"
      }]
    }
  }
}
```

prefix・surfixのルールも同様に作成します。

**ルール②（prefix "test_"）**
：②で作成したS3の「eventbridge-wildcard-test」バケットに「値の頭が"test_"のファイルが「アップロード」
```ruby:qiita.rb
{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["eventbridge-wildcard-test"]
    },
    "object": {
      "key": [{
        "prefix": "test_"
      }]
    }
  }
}
```

**ルール③（surfix ".csv"）**
：②で作成したS3の「eventbridge-wildcard-test」バケットに「末尾が".csv"のファイルが「アップロード」
```ruby:qiita.rb
{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["eventbridge-wildcard-test"]
    },
    "object": {
      "key": [{
        "suffix": ".csv"
      }]
    }
  }
}
```

**ルール④（prefix "test_"、surfix ".csv"）**
：②で作成したS3の「eventbridge-wildcard-test」バケットに「値の頭が"test_"、または末尾が".csv"」のファイルが「アップロード」
※Event Bridgeは括弧で囲まれた複数の値をOR条件として扱う（AND条件を適用することは出来ない）
```ruby:qiita.rb
{
  "source": ["aws.s3"],
  "detail-type": ["Object Created"],
  "detail": {
    "bucket": {
      "name": ["eventbridge-wildcard-test"]
    },
    "object": {
          "key": [{
            "prefix": "test_"
          }, {
            "suffix": ".csv"
      }]
    }
  }
}
```

  
### ターゲット
ターゲットタイプを「AWSのサービス」にし、③で作成したlambda関数をターゲットに設定



# 検証結果




## 結果の概要
想定通り、**設定した通りのルールでlambda関数が実行されました。**
詳細な結果は下記で記載いたします。

### パターン①：「test_0001.csv」をアップロードした場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/b6225b2e-c8c4-80b9-859e-cf936237cdf5.png)


**ルール①（ワイルドカード："test_*.csv"）**
⇒ **eventが検出される**（値の頭が"test_"かつ、末尾が".csv"のため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/7c44fbec-6efa-5a30-eed2-f7dd6ba9f0da.png)

**ルール②（prefix："test_"）**
⇒ **eventが検出される**（値の頭が"test_"のため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/af2434db-c684-e492-5b44-6150816724cf.png)

**ルール③（surfix：".csv"）**
⇒ **eventが検出される**（値の末尾が".csv"のため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/2e71cc4b-4554-7846-b63f-3cb9a8f4f6fb.png)

**ルール④（prefix："test_"、surfix：".csv"）**
⇒ **eventが検出される**（値の頭が"test_"、末尾が".csv"のため）
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/fd914e7d-ba90-0c90-abd0-7ab5db4b257f.png)



### パターン②：「test_0001.pdf」をアップロードした場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/69f90d5a-f702-d613-967e-6447a3a27346.png)

**ルール①（ワイルドカード："test_*.csv"）**
⇒ **eventが検出されない**（値の頭は"test_"だが、値の末尾が".csv"ではないため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/ecfbe7d2-ce6a-dbe5-4e1d-7342b3ca51e7.png)

**ルール②（prefix："test_"）**
⇒ **eventが検出される**（値の頭が"test_"のため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/45f094ad-5dba-230a-8600-a24cccaa727f.png)


**ルール③（surfix：".csv"）**
⇒ **eventが検出されない**（値の末尾が".csv"ではないため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/1239a709-9341-f745-275e-ab374ff5dec6.png)


**ルール④（prefix："test_"、surfix：".csv"）**
⇒ **eventが検出される**（値の頭が"test_"のため）
　※**prefix・surfixがOR条件になっている**ため、値の末尾が".csv"でなくてもeventが検出されてしまう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/bb88e023-03d7-cb30-738a-79033ad14102.png)




### パターン③：「temp_0001.csv」をアップロードした場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/3c94d1b7-299e-6454-d7cb-e747b62453ea.png)

**ルール①（ワイルドカード："test_*.csv"）**
⇒ **eventが検出されない**（値の末尾は".csv"だが、値の頭が"test_"ではないため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/83d1e29f-27b1-565b-85c7-82e3cd423679.png)

**ルール②（prefix："test_"）**
⇒ **eventが検出されない**（値の頭が"test_"ではないため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/b3318c97-f7e7-ea1e-6cfb-f0ea8e82e941.png)

**ルール③（surfix：".csv"）**
⇒ **eventが検出される**（値の末尾が".csv"のため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/3a51e4b7-6772-8789-a0a2-7a588ff7c5c0.png)

**ルール④（prefix："test_"、surfix：".csv"）**
⇒ **eventが検出される**（値の末尾が".csv"のため）
　※**prefix・surfixがOR条件になっている**ため、値の頭が"test_"でなくてもeventが検出されてしまう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/2b0c89d8-8565-6635-dcd2-a64006cb5997.png)




  



### パターン④：「temp_0001.pdf」をアップロードした場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/4fc5bf88-b7e2-0e60-48ec-66115ef8ab8e.png)


**ルール①（ワイルドカード："test_*.csv"）**
⇒ **eventが検出されない**（値の頭が"test_"ではない、値の末尾が".csv"ではないため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/760be6ae-b6b7-bb3b-7601-6604dbb0676f.png)


**ルール②（prefix："test_"）**
⇒ **eventが検出されない**（値の頭が"test_"ではないため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/3567ac0d-d705-fc45-a9cd-20d2c498625b.png)

**ルール③（surfix：".csv"）**
⇒ **eventが検出されない**（値の末尾が".csv"ではないため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/639c1a9b-817e-df8d-1ebf-676df8f1ab93.png)


**ルール④（prefix："test_"、surfix：".csv"）**
⇒ **eventが検出されない**（値の頭が"test_"ではない、値の末尾が".csv"ではないため）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3074902/b5d6d05c-98c5-0329-6890-7d588894f023.png)




:::note warn
・**prefix・surfixはOR条件になるため、ワイルドカードの代わりにはならない**
・文頭・末尾どちらも条件を入れたい場合は、ワイルドカードを使用
　片方でいい場合はワイルドカード・またはprefix・surfixを使用する
:::








# 注意
ワイルドカードを使用して作成するルールについて、**複雑すぎるものはエラーとなり正しく実行されません。**

具体的な例を下記に記載します。

**①ワイルドカード文字を連続して使用する**
ワイルドカードが連続している場合、エラーが表示されることがあります。
ワイルドカード文字は、本当に複数の文字と照合する必要がある場合にのみ使用する必要があります。
```
{
"EventBusArn": [ { "wildcard": "*:*:*:*:*:event-bus/*" } ]
}
```
※AWS公式サイトから引用
　

**②ワイルドカード使用後に同じ文字列を多用する**
ワイルドカード使用後に同じ文字列を複数回使用するとイベントパターンの処理が複雑になり、エラーが表示されることがあります。
```
{
"FileName": [ { "wildcard": "/Users/*/dir/dir/dir/dir/dir/doc.txt" } ]
}
```
※AWS公式サイトから引用

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

# おわりに
今回はAmazon EventBridgeのワイルドカードフィルターについての検証を実施しました。
一部制限はありますが、ワイルドカード使用で集約可能なルールもあるかと思いますので、既存のルールの見直しをしてみるのも良いかもしれません。

# 参考
https://aws.amazon.com/jp/about-aws/whats-new/2023/10/amazon-eventbridge-wildcard-filters-rules/

https://dev.classmethod.jp/articles/amazon-eventbridge-enhanced-filtering-capabilities/

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-event-patterns-content-based-filtering.html#eb-filtering-prefix-matching

https://dev.classmethod.jp/articles/amazon-eventbridge-wildcard-filters-rules/

https://qiita.com/miriwo/items/86a83b19708895d24391

https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns-content-based-filtering.html

---------------------------------------------------

 株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area