はじめに
EventBritge を使用して、S3 に対するイベントトリガーにしたい。
だけど対象となるイベントの形式がわからないからルールを作れない。
上記のような経験はありませんか?
本記事は EventBritge のトリガー対象となるイベントの確認方法を記載した記事となります。
結論
- CloudTrail に出力されないイベントを検知したいのであれば、
EventBritge で検知範囲を広く設定し SNS で連携されるイベントの全文を確認する - CloudTrail に出力されるイベントを検知したいのであれば、
CloudTrail でイベント内容を確認しEventBritge の「detail」に挿入
前提
EventBritgeは各種ログをそのまま検知するのではなく、
以下構造に沿うイベントパターンを検知することが可能となる。
{
"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 サービスのアクション、リソース、条件キーから確認可能。
例えば、EC2 の値は「aws.ec2」となる
resources
:イベントにかかわるリソースを識別する ARN が格納されます
ただし、イベントにこの ARN が含まれるかどうかはイベントを生成するサービスによって異なる。
※EC2 インスタンスの状態変更では、Amazon EC2 インスタンス ARN が格納されるが、
AWS CloudTrail での API コールでは、リソース ARN が格納されない
detail
:イベントに関する情報を含む JSON オブジェクト。
このフィールドの内容はイベント発行元によって異なる。
CloudTrail の情報をトリガーとしたいなら、Trail のイベント内容をここに記載すること。
参考先:イベント構造リファレンス
直面した問題
基本的に EventBritge がサポート対象とする AWS リソースが出力するイベントは、
公式ページに記載があります。
例:S3 における EventBridge イベントメッセージの構造
ただ、内容によっては EventBritge の「detail」項目に設定する内容の特定ができないため、
トリガーとしたいアクションに対して EventBritge の設定/検知が困難になる問題がありました。
解消方法
以下流れに沿って発行されるイベントを確認することができる。
CloudTrail に出力されないイベントの場合
S3 のライフサイクル/RDS 自動バックアップなど、AWS サービス機能を用いたイベントであればこちらの確認方法
① 検知対象としたアクションが EventBritge に出力する形式確認
今回は例として、S3「ObjectCreated(オブジェクト作成)」アクションを対象とする。
※S3ライフサイクルでも同じように確認は可能
※ObjectCreated アクションは一部S3の設定変更を実施すれば EventBritge で検出可能だが、今回は CloudTrail に出力されない状況で確認を実施する
検知対象のアクションの形式を調べる方法だが、
最初は近い内容が無いか公式ページから確認する。
基本的には各サービスガイドに EventBritge 関連のページが存在するため、
そこから確認。
S3 の EventBridge イベントメッセージの構造
もし、公式ページにサンプルが存在しない場合は、
AWS コンソールの EventBritge のページからヒントを探す。
見当がつかない場合は、選択肢の中化から「すべてのイベント」を選択する。
②EventBritge を作成し「detail」項目に広く設定
EventBritge イベントパターン作成にて、ルール範囲を大きく設定
{
"source": ["aws.s3"],
"resources": [
"arn:aws:s3:::{S3バケット名}"
]
}
※resources句で対象を絞らないと大量検知が発生するため、
対象は必ず絞ること。
③EventBritge のアクションを SNS として設定
ターゲットタイプとしてSNSを選択し、EventBritgeのルール作成を完了する。
※事前に自身のメールアドレスへ送付するAmazon SNSは作成しておくこと。
④ 受信したメールに記載のイベントを確認
検知対象となるアクション(ObjectCreated)を実施し、
SNSの宛先に送付されたメールを確認。
⑤EventBritge を修正し、特定アクションのみ検出する内容に設定
④で確認したメール本文の情報を元にイベントパターンを修正する。
なお、特定のインスタンスのアクションのみ検知したい場合は、
静的かつインスタンスごとに一意となる値を検出対象とする。
結果として、オブジェクト作成アクションを特定する「detail-type」を受信したメールから特定でき、意図したアクションを検知することが可能なイベントパターンを作成することができた。
{
"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」となる。
{
"source": ["aws.ec2"],
"detail-type": ["AWS API Call via CloudTrail"],
"detail": {
"eventSource": ["ec2.amazonaws.com"],
"eventName": ["StartInstances"],
"sourceIPAddress": ["xxx.xxx.xxx.xxx"]
}
}
終わりに
今回はEventBritgeで検出したいイベントが、
わからないときの調査方法を記載しました。
対象イベントの特定方法に悩んでいた方の助けになれば幸いです。