Step Functionsで実現するロングランニングジョブのイベント駆動化: SQS×Pipes×Fargate構成

ハコベル株式会社 / no7wataru
EM / テックリード / 従業員規模: 101名〜300名 / エンジニア組織: 11名〜50名
| ツールの利用開始時期 | 事業形態 |
|---|---|
| 2025年7月 | B to B |
| ツールの利用開始時期 | 2025年7月 |
|---|---|
| 事業形態 | B to B |
アーキテクチャ

アーキテクチャの意図・工夫
私の所属する配車計画チームは「最適化計算を高い並列性で実行できる仕組み」を目指し、SQS → EventBridge Pipes → Step Functions → Fargate という構成を採用しました。実際の構成を少しシンプルにしたものが上記の図です。
- バックエンドアプリケーション(BE Application 1)がSQSキューにジョブをエンキュー
- メタデータにバージョン情報(v1/v2)を含める
- EventBridge PipesがSQSキューからメッセージをデキュー
- EventBridge Pipesが後続のStep Functionsステートマシンを起動
- 採用しているStandardワークフローは非同期呼び出しが前提なので、Pipes側もこの前提で設定している
- また、Pipes→Step Functionsは入力が「配列」で渡ってくる点に注意が必要(バッチサイズが1でも配列)。必要に応じて
Mapステートで展開する
- ステートマシンは受け取ったメタデータをもとに実行するタスクを動的に判断し、適切なバージョンの最適化計算ワーカーをFargateタスクとしてオンデマンドで実行
- Fargate上で実行されたワーカーは計算を行い、完了後に結果をバックエンドアプリケーション(BE Application 2)に送信
- バックエンドアプリケーションは受け取った結果をデータベース(DB)に保存して一連の処理が完了
特に工夫した点は、Step Functionsに単にジョブを流すだけでなく、SQSメッセージ内のメタデータを読み取り、Choice ステートで処理を適切なコンテナへ振り分ける構成にした点です。これにより、アプリケーションコード側で複雑な分岐を書く必要がなくなり、ロジックの見通しが良くなりました。
また、最適化計算(以下ジョブ)は長いものだと処理時間が1時間近くかかるため、ワークフロータイプはStandardワークフローを採用しています。
更に、導入前のPoCフェーズにおけるインフラ構築にはAWS CDKを採用しました。これにより、アプリエンジニア主体でも迅速に検証環境を立ち上げ、実現性の確認と技術選定をスムーズに行うことができました。
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
当時のアーキテクチャは、ECS上のコンテナが常時起動してSQSをポーリングする「ワーカー型」でした。 しかし、これには以下のような構造的な限界がありました。
- 同時実行数が固定のため、ジョブが集中すると処理待ちが発生
- 配車業務の根幹に関わる計算結果を想定時間内に返せず、遅延リスクが高まっていた
- 処理待ちを防ぐための手動スケール
- ユーザー増を見越したECSタスク数の調整など、運用でカバーしていたが、限界に近づいていた
- 最適化エンジンのバージョン(v1/v2)使い分け
- 旧構成ではバージョンごとに専用ワーカー群の常時起動が必要で、バージョン増加に比例して管理対象リソースとコストが増える構造だった
これらを解決するために、SQSの滞留数に応じたオートスケーリングも検討しました。 ただ、最大約1時間かかる計算処理中にスケールインが走ると、実行中ジョブが強制終了されてしまうリスクがあります。 安全側に倒してタスク数を多めに維持すれば、アイドルリソースの無駄なコストが発生する、というジレンマもありました。
どのような状態を目指していたか
常時リソースを確保し続ける方式から、必要な時に必要なだけリソースを利用する「イベント駆動型」のアーキテクチャへ移行する必要がありました。
この方針で、次の状態を実現したいと考えました。
- スケーラビリティ:ジョブごとにオンデマンドでFargateタスクを起動し、待ち時間なく処理を開始できる
- 安全なロングランニング処理:スケールインに依存せずジョブ単位で完了まで稼働し、長時間ジョブでも安定運用できるようにする
- 従量課金に近い運用:常時起動リソースを持たず、処理がない時間の待機コストをほぼゼロにできる
比較検討したサービス
- 常時起動ECS(旧構成のスケールアウト案):単純にタスク数を増やす案。根本的な課題解決にならずコスト増になりやすい
- AWS Lambda:イベント駆動だが、計算処理が最大1時間近くかかるため15分のタイムアウト制限を受ける
- AWS Batch:バッチ処理基盤として強力だが、ジョブごとの細かい条件分岐(バージョンの動的振り分け)をやろうとすると別のオーケストレーターが必要になり、構成が複雑化しやすい
比較した軸
- スケーラビリティ:ジョブ数に応じて、待ち時間なく即座にリソースを確保できること
- フロー制御の柔軟性:ジョブに含まれるメタデータに基づいて、実行するコンテナを動的に切り替えられること
- 保守性:分岐ロジックやリトライ処理をコードではなく、視認性の高いワークフローとして管理できること
- コスト効率:計算していない時間の待機コストが小さい(= 常時起動リソースを持たない)こと
選定理由
- SQS→EventBridge Pipes→Step Functionsの連携により、ポーリングやグルーコードを書くことなくイベント駆動のフローを組める
Choiceステートで、バージョンに応じたFargateタスクをオンデマンドで起動できる- ECS統合(RunTask)を使うと、
.syncを利用して「起動」だけでなく「完了」まで含めてワークフローに落とし込みやすい Retry/Catchで指数バックオフなど高度なエラーハンドリングをワークフロー側で定義できる
導入の成果
改善したかった課題はどれくらい解決されたか
課題だった「ジョブの待ち時間」は解消されました。 ジョブごとにFargateタスクをオンデマンドで起動できるため、(各サービスのクォータの範囲で)必要な分だけ並列実行ができるようになりました。
どのような成果が得られたか
- 安全なデプロイ:旧構成では長時間実行中のジョブがデプロイ時のタスク停止に巻き込まれるリスクがあったが、新構成では影響を受けにくくなった
- 可視化による運用改善:どのバージョンがどれくらい動いたか、エラー原因は何かなどがStep Functionsのコンソールで視覚的に把握できるようになり、運用負荷が下がった
- コスト約80%削減:常時起動リソースを廃止し、必要な時だけ動く構成にしたことでコストを大きく削減できた。また、旧構成でワーカーが常時キューをポーリングしていたことで発生していたSQSへのAPIリクエストコストも、Pipesが効率的にメッセージを取得するようになったことで合わせて削減できた
導入時の苦労・悩み
- ASL(Amazon States Language)の学習コスト:定義ファイルが独特で、最初は少し取っつきにくい(現在はWorkflow StudioやCDKのサポートでかなり改善されている)
- デバッグ:分散システム特有の難しさがあり、処理がどこで詰まっているかの追跡にはX-Rayなどを活用する必要がある
- ローカルテスト:Step Functions Localはあるものの、サービス統合まで含めた“完全な再現・テスト”は難しく、最終的にはデプロイして確認というサイクルになりがち
- 補足:StandardワークフローはASYNC呼び出しのため、Pipes側で「ステートマシン内部ロジックの失敗」を検知してリトライすることができない(失敗時の扱いはステートマシン側で設計が必要)
導入に向けた社内への説明
上長・チームへの説明
定性的なメリットと定量的なメリットの両面から説明しました。
(定性的)
- 最大の課題である「ユーザーの待ち時間」を構造的に解消できる点
- ジョブが集中しても即座にリソースが割り当てられ、ユーザーの配車業務を止めるリスクが下がる点
- デプロイが実行中の長時間ジョブに影響を与えにくくなり、日中でも安全にリリース作業が可能になる点
(定量的)
- 常時起動のリソースを廃止し、必要な時だけ課金される従量課金に近いモデルに移行することで、現状比で約80%のコスト削減が見込める試算を提示
活用方法
基本的にはバッチ処理のオーケストレーターとしてバックグラウンドで稼働しています。 処理が失敗した際は、通知をトリガーにStep Functionsの実行履歴(グラフビュー)から「どのステップで、どの入力でエラーになったか」を確認し、トラブルシューティングを行っています。
よく使う機能
- データに基づくタスクの選択(
Choiceステート):入力メタデータ(バージョン情報など)に応じて実行するFargateタスクを動的に切り替え - ECS/Fargateタスクの実行(ECS RunTask / サービス統合):ステートマシンからFargateタスクを起動・制御(必要に応じて
.syncで完了待ち) - 自動エラー処理(
Retry/Catch):指数バックオフなどのリトライや例外処理をワークフローで定義 - Workflow Studio:GUI上で視覚的にワークフローを設計・構築できるツール
ツールの良い点
- デバッグ体験の良さ:CloudWatch Logsをgrepする前に、Step Functionsのコンソールを見るだけで「どのステップで、どんなデータで落ちたか」がすぐ分かる
- 疎結合な構成:各ステップ(今回はFargate上のコンテナ)が独立しており、コンポーネントの入れ替えが容易
- AWSサービスとの親和性:EventBridgeやECSとの連携が設定中心で完結するため、グルーコードを書く必要がない
ツールの課題点
- ペイロード制限:ステート間で受け渡しできるデータのサイズに上限(256 KiB)があるため、大きなデータはS3を経由させるなどの工夫が必要
- ローカルテスト:Step Functions Localはあるものの、サービス統合まで含めた“完全な再現・テスト”は難しい
- コールドスタート:Fargateと組み合わせる場合、コンテナの起動時間が数分かかる場合があり、ミリ秒単位の即応性が求められる処理には向かない
ツールを検討されている方へ
「複数のAWSサービスを組み合わせる処理」や「条件分岐が必要なバッチ処理」があるなら、自前でコードを書く前にStep Functionsを検討すべきです。 特にエラーハンドリングやリトライ処理をアプリケーションコードから追い出せるだけで、システム全体の見通しが良くなります。
最初はWorkflow Studioを使ってGUIでフローを描いてみると、イメージが湧きやすいのでおすすめです。
今後の展望
今回の刷新により、「SQS → EventBridge Pipes → Step Functions → Fargate」という構成が、長時間実行されるジョブにおいて有効であるという成功事例を作ることができました。 この知見を活かし、今後新たなバッチ処理や非同期処理が必要になった際には、このアーキテクチャを第一候補として積極的に採用していきたいと考えています。

ハコベル株式会社 / no7wataru
EM / テックリード / 従業員規模: 101名〜300名 / エンジニア組織: 11名〜50名
ラクスル株式会社 → ハコベル株式会社
よく見られているレビュー

ハコベル株式会社 / no7wataru
EM / テックリード / 従業員規模: 101名〜300名 / エンジニア組織: 11名〜50名
ラクスル株式会社 → ハコベル株式会社
レビューしているツール
目次
- アーキテクチャ
- 導入の背景・解決したかった問題
- 活用方法


