ある検算処理を行って異常がないか確認し、その結果をSlackに通知するLambdaを作成しました。
LambdaのトリガーはEventBridge (CloudWatch Events) を使用して、1時間毎と24時間毎に定期実行を行いました。
1時間毎と24時間毎で処理内容を変える方法について記載します。
開発言語はPythonです。
EventBridgeでルールの作成
EventBridgeで下記のルールを2つ作成しました。
rule-every-hour
1時間毎の定期実行 rate(1 hour)
このイベントをLambdaが受けた場合、異常があれば通知する(異常がなければ通知しない)。
rule-every-day
24時間毎の定期実行 cron(0 10 * * ? *)
毎日午前 10:00
このイベントをLambdaが受けた場合、異常がなくても結果を通知する。
判定方法
Lambda関数に渡ってくるイベントJSONで判定します。
イベントJSON
EventBridgeから渡ってくるJSONデータ
{
"version": "0",
"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"detail-type": "Scheduled Event",
"source": "aws.events",
"account": "xxxxxxxxxxxxx",
"time": "2022-05-10T09:48:31Z",
"region": "us-west-2",
"resources": [
"arn:aws:events:us-west-2:xxxxxxxxxxxxx:rule/rule-every-day"
],
"detail": {}
}
イベントJSONの中のresourcesキーの値がEventBridgeで作成したルール名になっていますので、
その値をLambdaのソースコードの中で取得して、if文で判定しました。
ソースコード
今回はルール名に"every-hour"が含まれているかどうかで判定しています。
1時間毎と24時間毎の処理内容はほとんど共通化していて、通知するかどうかの処理だけ変えています。
1時間毎の定期実行ではエラーがあれば通知し、24時間毎の定期実行ではエラーがなくても実行結果を通知します。
def main(event, context):
for resource in event["resources"]:
if 'every-hour' in resource:
# 1時間分検査 -> エラーがある場合は結果通知
result = check(range_hours=1)
if result.has_error:
notify_slack(result)
else:
# 24時間分検査 -> 必ず結果通知
result = check(range_hours=24)
notify_slack(result)