はじめに
日次バッチの異常発生通知がないと困ること
深夜の日次のバッチ処理をAWSのStepFunctionsなどで実行している場合、手動実行の結果確認と異なりバッチ実行結果の確認が翌日の朝になります。また、毎日実行されているバッチが連日正常に終了していると気が付かぬうちにある日異常が発生し、以降連日気が付かない状態で異常が発生し続けるという困ったことが起こります。
システム運用のあるべき姿として異常が発生したらすぐに通知すべき。その時寝ていて気が付かなくても翌日の業務開始時に異常発生を運用者が知り、すぐに対応できるようにしておきたいところです。
システム運用のチームではSlack等のチャットツールが良く使われていると思うが、そこにメッセージ通知するためのシステム構成を記事にました。
※この記事はアーキテクチャの説明をメインにしています。コンソール画面を使った設定手順等は各サービスのコンソール画面の指示に従ってください(操作手順を説明されているAWS公式サイトのURLをこの記事の最後に記載してあります)
使うAWSサービス
・Amazon CloudWatch
・Amazon SNS
・AWS Chatbot
アーキテクチャ図
アーキテクチャ説明
1.AWS Stepfunctions ステートマシン
・日次バッチ
・このステートマシンで発生したエラーをCloudWatchLogsに登録させる設定をしておく
<設定手順>
①StepFunctionsでエラー発生時にFailStateに状態が遷移するようにフローを設定する
②StepFunctionsの設定でCloudWatchにエラーログが登録されるように設定する
2.Amazon CloudWatch Logs(Cloudwatch アラーム)
・CloudwatchLogsにステートマシンで発生したエラーログが登録される
・エラーログが登録を条件にSNSに通知するCloudWatchAlarm設定しておく
※通知先の設定にSNSトピックの選択が必要になります。事前にSNSトピックの設定が必要です。
3.Amazon SNS
・CloudWatchアラームからの通知を受け取る
・SNSトピックはAWS Chatbotへ送る
4.AWS Chatbot
・Slackチャンネルを指定してChatbotからメッセージを送信する
※Slack通知を行うSlackチャンネルはエラー通知専用のチャンネルを用意しておいたほうがメッセージが他メッセージによって流れないので良いかも
※メッセージの形式はあまり凝らずにとにかく「何が」「いつ」エラーを出したかだけ通知できるようにすることが重要
さいごに
・Slackのメッセージにはエラーの詳細を書く必要はないと思います。とにかく「どの名前のサービスで」「いつ」エラーが発生したかさえ知ることが重要。
・深夜バッチは意外な原因でいつの間にかエラーを投げるようになるので、ChatBotを使っていつでも気が付ける状態は油断せず作っておきましょう
各サービスの詳しい説明(AWS公式ページへのリンク)
・Amazon CloudWatch
(CloudWatch アラームでのモニタリング)
https://docs.aws.amazon.com/ja_jp/autoscaling/application/userguide/cloudwatch-alarm-notifications.html
・Amazon SNS
(SNSトピックを作成する)
https://docs.aws.amazon.com/ja_jp/sns/latest/dg/sns-create-topic.html
・AWS Chatbot
(通知と AWS Chatbot との統合の設定)
https://docs.aws.amazon.com/ja_jp/dtconsole/latest/userguide/notifications-chatbot.html