[アップデート] AWS Step Functions の Map で分散モード & S3 データソース時の入出力が JSONL をサポートしました

[アップデート] AWS Step Functions の Map で分散モード & S3 データソース時の入出力が JSONL をサポートしました

Clock Icon2025.02.11

いわさです。

先日、AWS Step Functions にて次のようなアップデートアナウンスがありました。

https://aws.amazon.com/about-aws/whats-new/2025/02/aws-step-functions-data-source-output-option-distributed-map/

最初よくわからずスルーしていたのですが、使ってみてなるほどとよくわかったのでどういうアップデートなのか解説したいと思います。
まず Step Functions には入力値を繰り返し実行する Map というフローコンポーネントがあります。foreach的な使い方が出来ます。

この Map ですが、まずインラインと分散というふたつの処理モードがあります。
さらに分散モードの場合は項目ソースとして Amazon S3 のオブジェクトを使うことが出来ます。

D4E2C95F-9ED5-423B-9EA0-6CECAFA905A8.png

この分散 Map で Amazon S3 を指定した時、S3 項目ソースで色々な形式を指定することが出来ます。
例えばオブジェクトリストや、JSON ファイル、CSV ファイルなどを指定できます。

まず、先日のアップデートでこの S3 項目ソースに次の「JSONL ファイル」(JSON Lines)が追加されました。(サポートされてなかったのか)

79D39479-7FC1-49C3-B8BE-DED872935BB5.png

単一 JSON オブジェクト内のリストではなく、JSON オブジェクトが複数行出力されているファイルです。
AWS でもあちこちで使われていて、例えば AWS WAF のログなんかも次のように JSONL で出力されています。ちょうど Step Functions で処理したいことがあり非常に今回のアップデートは助かります。

39176BD8-3B7D-47BF-A668-97A383095835_4_5005_c.jpeg

また、従来はCSV ファイルについてはカンマ区切りのみだったのですが、今回のアップデートに併せて区切り文字を指定するオプションが追加されています。

27489A12-B07B-4350-92F8-F9657BA9F863.png

アップデート内容は以上です。
このあとは今回追加されたオプションを使ってみたのでその様子を紹介しますので興味のある方だけ見てください。

項目ソースに「JSONL」を指定

前述の AWS WAF のログを指定して JSONL オプションを使って分散 Map で処理させてみます。

45AB1037-4F42-450E-B196-BD1B4F92D01D.png

ちなみに前述の AWS WAF ログのフォーマットですが、ひとつの JSON オブジェクトあたりは次のような構造となっています。

B91E6A74-4257-4C81-BB90-98A44FA38E4B.png

今回はこの中なかクライアント IP アドレスを抽出してみます。ステートマシンクエリ言語は JSONata でして、次のように Map 内の Pass コンポーネントで出力要素を抽出しています。

{
  "hoge_client_ip": "{% $states.input.httpRequest.clientIp %}"
}

実行してみると次のように JSONL が正しく繰り返し処理され期待された出力を作成することが出来ました。

3926B8A6-EE3F-4D61-977C-11F0F53C9FB0.png

ライター設定オプションの出力タイプで「JSONL」を指定

さらに、今回のアップデートはインプットだけでなくアウトプットにも JSONL を指定できるようになっています。
Map にはライター設定というオプションがあり、マップ全体の出力形式を指定することが出来まして、JSON に加えて JSONL が指定できるようになっています。

C2D2347D-F984-4AD3-9836-2280DD5C408B.png

こちらを指定したところ、先程の出力は次のように変化しました。

152BBFBC-F92C-4383-ACEF-209181973B9F.png

ひとつの JSON オブジェクト内で配列出力されていたものが、JSONL で個別のオブジェクトに分かれて出力されるようになりました。

CSV 区切り文字を指定

こちらはオマケみたいなアップデートですけども、前述のとおり CSV ファイルの区切り文字が指定できるようになりました。
デフォルトはカンマ区切りなのですが、ここではタブ区切りを指定してみます。

DEEC5606-CF18-4DAC-8DFD-273101FD3E40.png

そして次のような TSV ファイルをあらかじめ S3 バケットに出力しておきます。

91D0113C-95FB-4C56-8F42-ABA735A0DE0B_4_5005_c.jpeg

こちらも Pass コンポーネントでcol2だけを抽出するようにして実行してみたのですが、期待どおり区切りが解釈されていそうですね。

32AF74E2-7B3E-441E-9117-DE3DF24D3051.png

Pass ごとの実行結果も確認してみると、タブ区切りにしたがってオブジェクトが読み込みされていることも確認できます。

0FC79A9B-EBCD-4382-A4B5-35247186DAC8.png

さいご

本日は AWS Step Functions の Map で分散モード & S3 データソース時の入出力が JSONL をサポートしたので使ってみました。

AWS でも JSONL の前処理が必要になること結構多いので地味に嬉しいアップデートだと思います。
今回のアップデートにあわせて公開された AWS ブログによると Amazon Bedrock のバッチ推論アーキテクチャの入出力が JSONL なのでユースケースとして紹介されています。なるほど。

image-2.png
Introducing JSONL support with Step Functions Distributed Map | AWS Compute Blogより

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.