【AWS】EventBritgeで検知対象としたいイベントの確認方法

## はじめに

EventBritge を使用して、S3 に対するイベントトリガーにしたい。
だけど対象となるイベントの形式がわからないからルールを作れない。
上記のような経験はありませんか？

本記事は EventBritge のトリガー対象となるイベントの確認方法を記載した記事となります。

## 結論
- CloudTrail に出力されないイベントを検知したいのであれば、
  EventBritge で検知範囲を広く設定し SNS で連携されるイベントの全文を確認する
- CloudTrail に出力されるイベントを検知したいのであれば、
CloudTrail でイベント内容を確認しEventBritge の「detail」に挿入

## 前提

EventBritgeは各種ログをそのまま検知するのではなく、
以下構造に沿うイベントパターンを検知することが可能となる。


```json
{
  "version": "0",
  "id": "UUID",
  "detail-type": "event name",
  "source": "event source",
  "account": "ARN",
  "time": "timestamp",
  "region": "region",
  "resources": [
    "ARN"
  ],
  "detail": {
  }
}
```

`detail-type`：source フィールドと併せて利用し、detail フィールド値を識別する
なお、CloudTrail によって送信されたイベントは、「AWS API Call via CloudTrail」が値として detail-type に記載される。

`source`：イベントを発生させたサービスを識別する項目。AWS サービスからのイベントはすべて、「aws」で始まる。
記載内容は[AWS サービスのアクション、リソース、条件キー](https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html#context_keys_table)から確認可能。
例えば、EC2 の値は「aws.ec2」となる

`resources`：イベントにかかわるリソースを識別する ARN が格納されます
ただし、イベントにこの ARN が含まれるかどうかはイベントを生成するサービスによって異なる。
※EC2 インスタンスの状態変更では、Amazon EC2 インスタンス ARN が格納されるが、
　 AWS CloudTrail での API コールでは、リソース ARN が格納されない

`detail`：イベントに関する情報を含む JSON オブジェクト。
このフィールドの内容はイベント発行元によって異なる。
CloudTrail の情報をトリガーとしたいなら、Trail のイベント内容をここに記載すること。

参考先：[イベント構造リファレンス](https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-events-structure.html)

## 直面した問題

基本的に EventBritge がサポート対象とする AWS リソースが出力するイベントは、
公式ページに記載があります。
例：[S3 における EventBridge イベントメッセージの構造](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/ev-events.html)

ただ、内容によっては EventBritge の「detail」項目に設定する内容の特定ができないため、
トリガーとしたいアクションに対して EventBritge の設定/検知が困難になる問題がありました。

## 解消方法

以下流れに沿って発行されるイベントを確認することができる。

### CloudTrail に出力されないイベントの場合

S3 のライフサイクル/RDS 自動バックアップなど、AWS サービス機能を用いたイベントであればこちらの確認方法

##### ① 検知対象としたアクションが EventBritge に出力する形式確認

今回は例として、S3「ObjectCreated(オブジェクト作成)」アクションを対象とする。
※S3ライフサイクルでも同じように確認は可能
※ObjectCreated アクションは一部S3の設定変更を実施すれば EventBritge で検出可能だが、今回は CloudTrail に出力されない状況で確認を実施する

検知対象のアクションの形式を調べる方法だが、
最初は近い内容が無いか公式ページから確認する。
基本的には各サービスガイドに EventBritge 関連のページが存在するため、
そこから確認。
[S3 の EventBridge イベントメッセージの構造](https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/ev-events.html)

もし、公式ページにサンプルが存在しない場合は、
AWS コンソールの EventBritge のページからヒントを探す。
見当がつかない場合は、選択肢の中化から「すべてのイベント」を選択する。
![2023-12-29_11h17_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/a9603ab4-26f8-e017-8c18-97b28207e10d.png)
##### ②EventBritge を作成し「detail」項目に広く設定

EventBritge イベントパターン作成にて、ルール範囲を大きく設定
```json
{
  "source": ["aws.s3"],
  "resources": [
    "arn:aws:s3:::{S3バケット名}"
  ]
}
```
※resources句で対象を絞らないと大量検知が発生するため、
　対象は必ず絞ること。


##### ③EventBritge のアクションを SNS として設定
ターゲットタイプとしてSNSを選択し、EventBritgeのルール作成を完了する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/8188bb65-f5a0-f582-a9e5-9c705868c828.png)

※事前に自身のメールアドレスへ送付するAmazon SNSは作成しておくこと。


##### ④ 受信したメールに記載のイベントを確認
検知対象となるアクション(ObjectCreated)を実施し、
SNSの宛先に送付されたメールを確認。
![2023-12-29_11h46_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1764568/c75ac76e-b5d0-8e9c-2d91-b359106bbc6b.png)

##### ⑤EventBritge を修正し、特定アクションのみ検出する内容に設定
④で確認したメール本文の情報を元にイベントパターンを修正する。
なお、特定のインスタンスのアクションのみ検知したい場合は、
静的かつインスタンスごとに一意となる値を検出対象とする。

結果として、オブジェクト作成アクションを特定する「detail-type」を受信したメールから特定でき、意図したアクションを検知することが可能なイベントパターンを作成することができた。

```json
{
  "source": ["aws.s3"],
  "resources": ["arn:aws:s3:::{バケット名}"],
  "detail-type":["Object Created"],
  "detail": {
    "eventSource": ["ec2.amazonaws.com"],
    "eventName": ["StartInstances"]
  }
}
```


### CloudTrail に出力されるイベントの場合

GUI 操作や AWSCLI から AWSAPI を実行するようなイベントであればこちらの方法
で確認
#### 確認方法

##### ① 検知対象としたアクションを発行

例として、EC2 に対する「StartInstances(EC2 起動)」アクションを対象とする。

##### ②CloudTrail よりアクション内容を確認
CloudTrailから「StartInstances」アクションを選択し、
イベントレコードから検知対象としたい項目を控える
※特定のインスタンスのアクションのみ検知したい場合は、
静的かつインスタンスごとに一意となる値を検出対象とする。

##### ③EventBritge を作成し「detail」項目に設定

CloudTrail から控えたをピックアップして detail に記載
※CloudTrailのイベントを検知する場合は「detail-type:AWS API Call via CloudTrail」となる。
```json
{
  "source": ["aws.ec2"],
  "detail-type": ["AWS API Call via CloudTrail"],
  "detail": {
    "eventSource": ["ec2.amazonaws.com"],
    "eventName": ["StartInstances"],
    "sourceIPAddress": ["xxx.xxx.xxx.xxx"]
  }
}
```

## 終わりに
今回はEventBritgeで検出したいイベントが、
わからないときの調査方法を記載しました。
対象イベントの特定方法に悩んでいた方の助けになれば幸いです。