Cloudwatch alertを使って、EC2のオートリカバリや、SNS -> lambdaを介してSlack通知など、便利に使っていたのですが、連携できるサービスが限られているため、EventBridgeを使ってみます。
EventBridgeとは
EventBridgeは、AWS外のSaaSやAWSサービスで発生した様々なEventを受け取って、LambdaやStep Functions などの指定したターゲットにEventを連携することができるサーバレスのマネージドサービスです。EventBridgeという名称そのままな感じですが、Eventソースとターゲットの自由度がかなり高いので、アイデア次第で色々できそうな感があります。
EventBridgeの設定方法
「Cloudwatch alertのイベントを受け取って、lambdaに連携する」というEventBridgeを作成してみます。まずは、Amazon EventBridge > ルール > ルールを作成、でEventBridgeのルールを作ります。EventソースにするCloudwatch alertと、ターゲットにするlambdaは作成済みとします。
EventソースとなるCloudwatch alertのアラーム設定には、トリガーが設定されている必要はない。あくまでAWS Eventの発生を契機にするため。
ルールタイプの設定
ルールタイプで、イベントパターンとスケジュールが選択できます。スケジュールの方は、cron的に一定間隔や指定日時でイベント駆動させるときに使えます。今回は、イベントパターンを選択します。
起動契機には、イベント起動とスケジュール(cron)起動が選択可能
イベントソースとイベントパターンの設定
次にイベントソースを選択します。Cloudwatch alertにしたいので、AWSイベントを選択します。
次にイベントパターンをjsonで記述します。alarmNameには、任意のCloudWatch alarmのアラーム名を指定します。stateを指定することで、ALARM時のみイベント発行されるようにします。なお、stateを指定しなかった場合は、全てのstate changeでイベント発行されます。このjsonは拾いたいイベントのフィルタのようなイメージですね。
{
"source": ["aws.cloudwatch"],
"detail-type": ["CloudWatch Alarm State Change"],
"detail": {
"alarmName": ["Event_Test"],
"state": {
"value": ["ALARM"]
}
}
}
このイベントパターンを書くためには、AWSサービスの各種イベントが、どんなjsonデータ構造なのかという話になります。ここを参照すると各種イベントのjsonサンプルがあるので参考にしながら記述すれば良いです。または、下記のサンプルイベントから、参照することができます。
公開されているサンプルイベントを参考に、イベントパターン(拾いたいイベントのフィルタ)を記述する
ターゲットの設定
最後にターゲットを選択します。事前に作成しておいた、lambdaに連携しています。ターゲットは複数選択できるので、lambdaとSNSを両方指定するなども出来ます。
また、ターゲットに設定したlambdaで、連携されたjson形式のEvent情報を参照することも可能です。
作成完了
「ルールの作成」で完了。
かなり簡単に出来ますね。ルール作成した時点で、EventBridgeは有効になっています。
イベント駆動型なので、無限ループ(再帰呼び出し)にならないように注意
動作確認
発行されたイベントは、Cloudwatchでメトリクス化されています。
ターゲットがlambdaの場合は、lambdaのログでも確認可能ですね。
まとめ
Event Bridgeは、イベントソース、ターゲットの選択肢が多く、Cloudwatch alertより容易に出来ることのカバー範囲が広いです。単純なalert(SNS連携)ならばCloudwatchで十分、自動復旧等のためにSystem managerやStep functions、lambda等に連携するならEvent Bridgeを使う、と適材適所ですね。