defaultのイベントバスに手動でルールを作ってみる。

## はじめに

今回からEventBridgeについても、色々と触ってみます！
早速、左メニューの試したことのないものから触ってみます。

今回はイベントバス（default）についてです。

## イベントバスとは？

AWSサービスやその他サービスからのイベントをイベントバスへ通知すると、事前に定義したルールに従い、複数のターゲットへイベントを通知してくれる仕組みです。

○○されたら、△△するみたいな、イベント駆動型アーキテクチャを構築する為の重要な仕組みです。

イベント通知元は、誰にイベントを通知するかを意識することなく、イベントバスにさえ通知をしておけば良いので、各システムの疎結合か実現できます。

以下、AWS公式の説明です。

> イベントバスは、イベントを受信するルーターであり、ゼロ個以上の送信先やターゲットに配信します。イベントバスは、イベントをさまざまなソースから多数のターゲットにルーティングするのに適しており、オプションでターゲットに配信する前にイベントを変換できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/dbe5ab95-f260-e0a5-f82c-0b8bcb417e7b.png)

https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-what-is-how-it-works-concepts.html

### イベントバスの種類

イベントバスは、以下の３種類があります。

* AWSからのイベントを受信するデフォルトのイベントバス
* 独自アプリケーションからのイベントを受信するカスタムイベントバス
* 他のSaaSからのイベントを受信するパートナーイベントバス

特に何も設定していない状態だと、デフォルトのイベントバスのみがある状態でした。

![スクリーンショット 2025-02-12 4.25.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/2fdc6f7b-8196-6d50-f2ab-12a781992f9a.png)

この記事はまず、デフォルトのイベントバスについて動作確認してみます。

## デフォルトのイベントバスの動作確認をしてみる！

### ルールの定義

今回はEC2が起動・停止などの状態変化があった場合のルールを作ってみます。

![スクリーンショット 2025-02-12 4.34.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/ca622290-4de2-d28d-4eb7-17f5cb5c3258.png)

### イベントパターンの定義

どのイベントを処理対象にするか。という設定をここでします。

作成方法は３つほど用意されていますが、`イベントパターンを利用する`が一番直感的だと思います。

今回はEC2の状態が`running`または、`terminated`になった場合を処理対象とします。

![スクリーンショット 2025-02-12 4.41.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/d727ab03-2365-270f-e8c9-22b485fa139b.png)

なお、以下のサンプルイベントは設定とは関係ないですが、動作確認用のJSONを作ってくれるので、作成しておくと良いかもです。

![スクリーンショット 2025-02-12 4.39.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/0d72f10f-72d2-91e8-e48d-a96d51fd640b.png)

作ったサンプル。
```json
{
  "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"
  }
}
```

大切なのは、ルールは以下の３点で条件一致を判断するので、この３つを控えておく必要があります。

* `source`
    * 今回は`aws.ec2`
* `detail-type`
    * 今回は`EC2 Instance State-change Notification`
* `detail`
    * 今回は`state`が`runnnig`または、`terminated`


### ターゲットを選択

イベントの通知先を選択します。

今回は、Eメールを送信するSNSを選択します。

![スクリーンショット 2025-02-12 4.52.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/4d638764-e1e6-37fd-9196-6db8accdf39a.png)

あとは必要に応じて、タグを設定し、作成完了です！

## 動作確認してみる。

適当なEC2を終了させると、メールが飛んでくることを確認出来ました。

![スクリーンショット 2025-02-13 4.15.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/29bcd132-c70d-4d93-8295-f0458b445bbd.png)

### テストもできる？

先ほど作ったサンプルイベントをデフォルトのイベントバスに送ることで、簡単に動作確認できるかな？と思い試したのですが、`NotAuthorizedForSourceException.Not authorized for the source.`のエラーが出てしまいました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/d256ac0f-b902-4c7e-9d60-a8267fad4ed7.png)

どうやら、イベントソースに`aws.ec2`のようなAWSから通知であることを示すイベントソースはAWS自身じゃないと利用できないみたい。

そこで、テスト用のイベントソースも受け入れるようにし、再度送信してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/cc5ecc64-c933-4aa3-a859-886b64cb2171.png)

無事に送信できたみたい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/ef8d5187-3a22-4c38-9dca-018d38fa9bda.png)

メールも届きました！
![スクリーンショット 2025-02-13 5.10.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/948564a5-811c-44f1-a94f-350f6a746d53.png)

## 入力トランスフォーマーの設定

なお、特に追加設定をしないと、メールの内容はイベントバスに送ったJSONと同じ内容が表示され、可読性が低いので、入力トランスフォーマーを使って、分かり易い本文にしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/49068f6e-eddb-d17b-7554-9599f9a4e29e.png)

`ターゲットを選択`のところの詳細設定で、イベントのテキストをカスタマイズすることができるので、ここで、`入力トランスフォーマー`を選択し、カスタマイズを行います。

![スクリーンショット 2025-02-12 4.56.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/0b6ecc78-1883-866c-0c78-97f320e2a3b5.png)

例を提示してくれるので、設定も簡単にできました！

![スクリーンショット 2025-02-12 5.00.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/614038f1-f453-36b4-7b57-db91c17a4141.png)

#### 入力パス

```json
{
    "instance": "$.detail.instance-id",
    "state": "$.detail.state"
}
```

#### テンプレート

```
"Instance <instance> は <state>　状態になりました。"
```

この状態で再度動作確認すると、分かりやすい本文になっていることを確認できました！

![スクリーンショット 2025-02-13 5.15.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/e31f2067-1d14-47bb-8549-19b966f6b7e2.png)


## 最後に

今までAWSが自動で作ってくれていたイベントバスおよびルールですが、EventBridgeから直接作成・編集することで仕組みをより深く理解することができました！

案外詰まったりして、時間が掛かってしまいましたが楽しかったです！