概要
- Amazon ECS の Fargate タスクを cron のようにスケジュール実行したい場合、候補として挙がるのが EventBridge (CloudWatch Events)
- ただし EventBridge には考慮しなければいけない 2 つの問題点がある
- メリット・デメリットを理解して、それ以外の選択肢も考えてみる
EventBridge
利点
- サーバレスでフルマネージド
- 実装不要
欠点
1. 少なくとも 1 回の起動が保証される
よく知られている特徴で、稀に 2 回以上イベントが実行されることがある。
対策
同時実行耐性や冪等性が保証されるようにアプリケーションを実装する必要がある。
2. Fargate タスクの起動は保証しない
ポイントは以下。
- EventBridge はタスクの RunTask の実行を保証する
- ただし RunTask によってタスクが起動したかどうかは保証しない
筆者も経験があるが、稀に AWS 側の不具合で Fargate が起動に失敗することがあった。
なお、この事象は EventBridge からの呼び出しに限らず、AWS CLI や SDK など RunTask API を利用するもの全般にいえる。
対策
Step Functions を間に挟み、もし Fargate の起動に失敗した場合はリトライするようにステートマシンを組む方法がある。
EventBridge --> Step Functions --> Fargate
議論
EventBridge を利用する場合、欠点で挙げた 1. (稀に 2 回以上起動) と 2. (Fargate の起動保証はしない) を考慮しなければいけない。
一方で、EventBridge を使わずにあえて crontab を動かすためのサーバーを別で用意するという原始的な手もある。この場合、欠点で挙げた 1. は考慮しなくてもよい。ただし依然として 2. は cron 側の実装でなんとかしなければいけないし、新たに cron の可用性を考慮しなければいけない。
このあたりはトレードオフにはなるが、同時実行耐性や冪等性を保証するアプリケーションの実装が困難な場合は検討してもよいのではないだろうか。