AWS Step Functions の長時間実行を検知したい!
こんにちは!
株式会社Finatextで証券事業のバックエンドエンジニアをしている @warashi です。
今日は、私が先日社内で取り組んだ AWS Step Functions の長時間実行の検知についてお話します。
この記事は、Finatext Advent Calendar 2025 の4日目の記事です。
抱えていた課題
AWS Step Functionsを用いてバッチ処理を行っている箇所で、起動している ECS Task が正常に処理を継続していないものの終了もしていない、という事態が起きました。
異常終了の検知は仕組みが作られていたのですがこのような途中で止まってしまうケースを検知できる仕組みはなく、サービスやシステムの規模を拡大していく中で課題となっていました。
実現したかったこと
課題をもうちょっと分解して、以下のことを満たすような解決策を模索しました。
- バッチの実行が想定より長時間になった時に通知を飛ばしてエンジニアが気付けること
- 通知を飛ばすのはバッチの終了時ではなく、想定時間を越えたら即時であること
- 想定時間を越えてもバッチの実行を継続したままとすること
- 想定時間より短い時間でバッチが終了した際に不要なリソース消費が少ないこと。つまり、想定実行時間いっぱいまでAWS Step Functionsが終了せずに実行状態で待機したりしないこと
1はそもそもの要求で、2と3がもうちょっと細かい要件です。
4はコスト面での非機能要件という感じでしょうか。
実現方法
基本的には DevelopersIO さんのこちらの記事 を参考にしました。
簡単に解説すると、バッチが完了していてほしい時刻に AWS Lambda Function を起動し、以下の処理を実行します。
- AWS Step Functions の ListExecutions API を実行して最新の Execution を取得する
- 取得した Execution が現在も実行中かどうかを
statusフィールドを見て判断する - 現在も実行中であれば、アラートを上げる
Finatext においては AWS Organizations によって全ての AWS Account を管理していたため、それを踏まえて以下のような構成を取りました。
- Lambda Function によって起動するコンテナイメージを特定の単一アカウントに存在する Amazon ECR Repository に配置する
- その ECR Repository に対して同じ Organization の Lambda Function から Image を取得できるポリシーを設定する
- Lambda Function はこの機能を利用するそれぞれの AWS Account に作成し、上記 ECR Repository に配置された Image を共通で利用する
この構成については、AWS Blog のこちらの記事やZenn のこちらの記事が参考になりました
他に考えられる手法として、共通アカウントに配置した Lambda Function を AWS Account をまたいで利用する方法もありました。
ただ、 ListExecutions API を呼ぶ都合上でクロスアカウントでは権限の管理が難しく、Lambda Function については各アカウントに配置する方式を採用しました。
また、多数のバッチに対して同様の設定を入れていくにあたっては、既存のバッチが terraform module によって管理されていたことが良い方向に働きました。
terraform module に対して変更を加えることで、統一した設定方法で長時間実行検知を追加していくことができました。
この terraform module はバッチ実行開始時間を cron で受け取る作りをしていたのですが、それに加えて実行検知の Lambda Function を実行するタイミングを追加で指定する形の改修をしました。
可能ならば実行時間そのもの、つまり「1時間」などのような指定ができるようにしたかったのですが、この指定方法を採用した場合には Lambda Function の起動時刻を指定する cron の表記を terraform 内で生成する必要があり断念しました。
また、このスケジュール指定を null にしてやることで長時間実行検知をオフにする機構も用意しました。
というのも、 terraform module が開発環境でも本番環境でも同じものを利用していたため、まずは開発環境のみ導入するためにそういった機能が必要だったためです。
さいごに
こうして、Finatextでは一部のバッチから順に長時間実行検知の仕組みを入れていっています。
つい先日、この検知の仕組みが実際に動いて意図しない長時間実行に気付けました。
バッチのパフォーマンスが意図していたよりも悪くなっていることを把握でき、パフォーマンス改善の動きをとることができるようになりました。
また、この改修を機に terraform module の整理・整備にも取り組んでいます。
たとえば、とあるリポジトリ内で便利に使っていた module を共有用のリポジトリに切り出して他のリポジトリからも使う、といったことをしています。
また、株式会社Finatextでは、一緒に働く仲間を募集中です!
カジュアル面談も絶賛募集中です!
ここまで読んでくださり、ありがとうございました!
Discussion