概要
EventBridge + ECSを使用したバッチ処理実行を行う時、何らかの理由でECSタスクが起動できないエラーが発生することがあります。この記事では、エラー内容を確認するためのSQSを使用した仕組みを考えてみます。また、SQSに入ったメッセージを検知して、CloudWatchから通知を送信する仕組みも考えてみます。
なお、EventBridgeからECSタスクを起動する方法についてはAWS公式に説明があるため、本記事では省略します。
Amazon EventBridge スケジューラを使用して Amazon ECS タスクをスケジュールする
今回使用する技術
Amazon SQS
キューにメッセージを保存しておくサービス。今回はEventBridgeでイベント実行が失敗した際にメッセージを保管しておく場所として使用します。
Amazon SNS
AWSが提供する通知サービス。EMAILやhttpsなどのプロトコルと通知先を選んで登録しておくことができます。今回はCloudWatchでアラーム状態が検知された時にメール通知を行うために使用します。
CloudWatch
ログ監視システム。SQSへのメッセージ送信を検知し、アラート状態を検知するために使用します。
手順
その1: EventBridgeからのタスク起動が失敗した際にメッセージをデッドレターキュー(DLQ)に入れてみる
まずはEventBridgeでタスク起動が失敗した際にSQSにメッセージが送信されるところを目指して作っていきます。
SQSの作成
- コンソールからAmazon SQSにアクセス。キューを作成を選択。
- 各項目を入力してキューを作成する。EventBridgeのデッドレターキュー(DLQ)として使用できるのは標準タイプのみで、FIFOタイプは使用できないため注意。そのほかは基本的にデフォルト設定で良さそう。
Event Bridgeへの紐付け
なお、規定の回数分の再施行を行ったにも関わらず実行に失敗した場合にのみデッドレターキューにメッセージが送信されます。上の写真だと185回再試行した後にDLQにメッセージが送られます。メッセージが185個送られるわけではないです。
この状態を作ると、EventBridgeからのタスク起動が失敗した場合、作成したキューにメッセージが送信されることを確認できます。ちなみに筆者はEventBridgeのもつポリシーからECS>Run Taskを剥奪することで無理やりタスク起動を失敗させてみました。なお、このように権限不足などでタスクが起動できない時は何回再試行しても無駄なので、再試行は行わずにすぐにキューにメッセージを送信しているらしいです。
メッセージの内容はSQSからキューを選択>メッセージの送受信>メッセージをポーリングすることで確認できます(一部切り取っていますが下記写真参照)。
その2: キューにメッセージが入ったことを検知してメール送信してみる
次に、SQSへのエンキューを検知して通知を送信する仕組みを作っていきます。なお、通知の仕組みにはLambdaを用いたものやEventBridgeを用いたものもありますが、今回は簡単のためにCloudWatchのアラーム機能を使用してみます。
SNSの作成
- コンソールからSNSにアクセス。トピック>トピックの作成をクリック
- トピックの名称を決めて保存する
- 「サブスクリプション」タブをクリック。今回はメール送信を実現したいので、プロトコル選択部分でEMAILを選択して、通知を送りたいメールアドレスを入力
- 登録したメールアドレスに認証メールのようなものが届くのでクリック。これをしないと通知が送信されないため注意。
CloudWatchアラームの設定
- アラーム>アラームの作成をクリック
- メトリクスを選ぶ箇所で「NumberOfMessagesSent」を入力。1.で作成したキューが選択されていることを確認
- アラート状態となる条件を入力する。今回は、1件でもタスク起動に失敗したら通知して欲しいので、5分間での合計が0より大きいとしてみました。
- 次の画面で「アラーム状態」を選択し、通知先に作成したトピックを選択する
- アラーム名とアラームの説明を入力する。アラーム名は後から変更できないため注意!
先ほどと同様にタスク起動をわざと失敗させてみて、メールが飛んできたら成功です。また、ポリシーを触りたくない場合はSQS>メッセージの送受信>メッセージの送信をすることでメールが飛んでくるか確認することもできます。
感想
適切なメトリクスを選ぶところが少し難しかったですが、手軽に通知の仕組みを作成することができました。また、EventBridgeのルールの数が増えた時も同じDLQにメッセージを送信するようにすれば、タスク起動失敗時には同じようにメールが飛んできます。将来的に仕組みを使いまわせるところも魅力的だと思いました。