しゅがーブログ

技術ネタとか書いていけたらな…

【AWS】バッチ処理をFargateで実現するために

Overview

EC2上のcronで実行しているバッチ処理をECS(Fargate)に切り替えましたが何がベストなんだろうか。

途中で気がついた課題

CloudWatch Eventsの特性

結構色んな人がいっていますが公式リファレンスに記載の通り、特定のトリガーされたルールに対して同じターゲットを複数回起動したりする場合があります
これは1回しか実行したくないバッチ処理であっても複数回実行されてしまう可能性があるという話です。
回避策としては下記の2通りがあるかなと思っています。

Cron on EC2

従来のcronからFargateのタスクを実行する方法です。
AWS CLIにはECS用のrun-taskコマンドがあります。
run-taskコマンドをcron経由で実行することにより必ず1回しか実行されないように回避することができます。

しかしデメリットも存在します。
cron用のEC2を用意するということは1台だけで実行することになるのでSPOFとなってしまいます。
この辺りの可用性はトレードオフになるのでどこを重要視するか検討していく必要があります。

AWS Step Functionsを利用する方法

classmethodさんの記事がわかりやすいです。
EventBridge → Step Functions → ECSタスクのような構成にし、重複実行のチェックをLambdaで実施する方法です。
冪等性以外の観点でもエラーハンドリングを実施することができるのでマネージドのみの構成にする場合は現状一番良いソリューションなのではないでしょうか。
実装例でAWSの人のサンプルもありました。
今回については見送り Cron on EC2で実施しました。

まとめ

AWS Step Functionsはすごい万能そうですが、独自のASL(Amazon States Language)を書く必要があるみたいです。
今回は工数や学習コスト面から見送りましたが、近いうちに切り替えていきたいなと思いました。