【 Step Functions 】 分散マップ ( Distributed Map ) State を使ってみた ~ JSONL & LOAD_AND_FLATTEN を添えて ~

はじめに

みなさん、Step Functions 使っていますか?

2025 年には今日までに 2 回の機能リリースが入っている Step Functions。
この記事では、それらの機能を利用しつつ、分散マップ(Distributed Map)State を使ってみたいと思います。

具体的には以下の機能リリースに着目していきます。



概要

AWS Step Functions とは

AWS Step Functions とは、サーバーレスで、ローコードにワークフローを構築・実行できるサービスです。
220 以上の AWS サービスと統合されており、処理の流れを組み合わせることでステートマシンを作成していきます。

全体のプロセスはワークフローという形式で可視化され、複雑なビジネスロジックを簡単に表現したり、ビジュアルで実行履歴などのログを確認したりすることが可能です。

また、AWS Step Functions コンソールでは、保存したワークフローを AWS CloudFormation または AWS SAM テンプレートとしてエクスポートおよびダウンロードできます。
インフラ構築の自動化が重要視される現在において、IaC(Infrastructure as Code)を実現できるのは有り難いですね。

分散マップ(Distributed Map)State とは

Step Functions には、大規模な入力配列を要素ごとに繰り返し処理・実行できる Map というステートがあります。
この Map ステートには「インライン」と「分散」という二つの処理モードが存在し、それぞれの違いは以下のようになっています。

インラインモード 分散モード
概要 制限付き同時実行モード
デフォルトでは、インラインモードで実行される
高い並列性を持つモード
インプット可能なデータソース ワークフローの前のステップから渡された JSON 配列を入力として受け取る 入力として次のデータソースを受け取る
最大同時実行数 最大 40 回の反復を可能な限り同時に実行できる 子ワークフローを最大 10,000 回並列で実行して、数百万件のデータ項目を一度に処理できる
ペイロードの最大サイズ 256KB Amazon S3 データソースから直接入力を読み取ることができるため、ペイロードサイズの制限を解決できる
実行履歴の最大サイズ ステートマシン全体で 25,000 エントリ 子ワークフローの実行が、親ワークフローの実行履歴とは別の独自の実行履歴を保持するため、実行履歴の制限を解決できる

参考:Map workflow state (内容がちょっと古いです)

表に示したように、分散マップ(Distributed Map)はクォータ制限を解消し、加えて大容量データの高速かつ効率的な処理を実現できます。

ちなみに、AWS 公式では、Map ステートの分散モードのことを「分散マップ(Distributed Map)」と呼んでいます。
このモードは 2022 年の AWS re:Invent で発表されました。

実際に使ってみる

それでは、実際に分散マップ(Distributed Map)State を使ってステートマシンを作成していきましょう。

まず、フロータブから「マップ」ステートをドラッグし、「最初の状態をここにドラッグ」とラベル付けされた空の状態にドロップします。

そして、処理モードに「分散」を選択します。

これで分散マップを使用できるようになりました!

次に、項目ソースの設定です。
今回は LOAD_AND_FLATTEN の機能を試したいので、以下のように設定します。

  • オプション: Amazon S3
  • S3 項目ソース: S3 オブジェクトリスト
  • 変換: LOAD_AND_FLATTEN

また、Amazon S3 バケット内の JSONL ファイルを取得したいので、オブジェクトデータ形式に「S3 内の JSONL ファイル」を選択します。
(LOAD_AND_FLATTEN の機能は、CSVJSON、JSONL、Parquet の 4 つのオブジェクトデータ形式をサポートしています)

あとは、該当の JSONL ファイルが格納されている S3 バケットの情報を設定し、ステートマシンを作成(保存)すれば完了です!

今回使用した JSONL ファイルの中身は以下のようになっています。

{"client_no": "0001", "user": "Alice", "date": "2025-10-21"}
{"client_no": "0002", "user": "Bob", "date": "2025-10-22"}
{"client_no": "0003", "user": "Catherine", "date": "2025-10-23"}
{"client_no": "0004", "user": "David", "date": "2025-10-24"}
{"client_no": "0005", "user": "Emma", "date": "2025-10-25"}

そして、ステートマシンを実行し出力されたものがこちら。

LOAD_AND_FLATTEN 設定あり

ちなみに、LOAD_AND_FLATTEN を設定しないとこうなります。

LOAD_AND_FLATTEN 設定なし

このように、LOAD_AND_FLATTEN を設定しないとオブジェクトメタデータを返すのに対し、設定するとファイルの中身が展開され実際のデータオブジェクトを返します。

また、デフォルトでは JSON で出力されますが、ライター設定というオプションを有効にし、出力タイプを「JSONL」に、変換を「コンパクト」または「フラット化」に設定すると、以下のように JSONL で出力することができます(これは 2025/02/07 の機能リリースでできるようになりました!)。

ライター設定を設定

JSONL で出力される

ちなみに、ライター設定のオプションは、分散マップであればどの項目ソースにおいても(JSON か JSONL を)設定することができます。

料金体系

AWS Step Functions は、使用した分のみ料金が発生する従量課金です。
AWS Step Functions には、標準(Standard)ワークフローと Express ワークフローの 2 種類のワークフローがあり、それぞれで費用が異なります。
以下は、2025 年 10 月時点での東京リージョンの場合の価格です。

標準(Standard)ワークフロー Express ワークフロー
料金体系 状態(ステート)遷移の回数に基づいた課金 ワークフローのリクエスト数と実行時間、メモリ消費量に基づいて課金
価格 0.025USD/状態遷移1,000回ごと
(4,000回の状態遷移/月 の無料利用枠あり)
0.000001USD/1リクエス
最大実行時間 最大 1 年 最大 5 分
実行の保証 Exactly-once(確実に 1 回)の実行 非同期呼び出し:At-least-once(少なくとも 1 回)の実行
同期呼び出し:At-most-once(最大 1 回)の実行
ユースケース 長期の大規模バッチ処理や業務プロセスに適している 高頻度・短時間の処理においてコスト効率に優れ、連続データの取り込みや、ストリーミングデータの変換など、リアルタイム処理に適している

参考:AWS Step Functions の料金

これは重要なことですが、Express ワークフローでは分散マップ(Distributed Map)がサポートされていません!

そのため、分散マップを使用する場合、親ワークフローは標準ワークフローを選択し、子ワークフローは要件に応じて標準ワークフローと Express ワークフローを使い分けることで、コストの削減に繋げることができます。

おわりに

本記事では、AWS Step Functions について、JSONL での入出力や LOAD_AND_FLATTEN の機能を利用しつつ分散マップ(Distributed Map)State を使ってみました。

AWS では JSONL の処理が必要になることが少なからずあるため、活用できる機会も多いのではないでしょうか。
AWS Blogs では、ユースケースとして、Amazon Bedrock のバッチ推論アーキテクチャで入出力される JSONL ファイルの処理が紹介されています。

また、LOAD_AND_FLATTEN の機能を活用することで、カスタムの前処理が不要になったり、並行処理によるスケーラビリティの向上が見込めたりします。
つまり、大規模データ処理ワークフローの構築をよりシンプルに行うことが可能です。

本記事が、Step Functions へのより深い理解を助け、みなさんがシステム構築する際の選択肢のひとつになればと思います。