[アップデート] AWS Step Functions の Map で分散モード & S3 データソース時の入出力が JSONL をサポートしました
いわさです。
先日、AWS Step Functions にて次のようなアップデートアナウンスがありました。
最初よくわからずスルーしていたのですが、使ってみてなるほどとよくわかったのでどういうアップデートなのか解説したいと思います。
まず Step Functions には入力値を繰り返し実行する Map というフローコンポーネントがあります。foreach
的な使い方が出来ます。
この Map ですが、まずインラインと分散というふたつの処理モードがあります。
さらに分散モードの場合は項目ソースとして Amazon S3 のオブジェクトを使うことが出来ます。
この分散 Map で Amazon S3 を指定した時、S3 項目ソースで色々な形式を指定することが出来ます。
例えばオブジェクトリストや、JSON ファイル、CSV ファイルなどを指定できます。
まず、先日のアップデートでこの S3 項目ソースに次の「JSONL ファイル」(JSON Lines)が追加されました。(サポートされてなかったのか)
単一 JSON オブジェクト内のリストではなく、JSON オブジェクトが複数行出力されているファイルです。
AWS でもあちこちで使われていて、例えば AWS WAF のログなんかも次のように JSONL で出力されています。ちょうど Step Functions で処理したいことがあり非常に今回のアップデートは助かります。
また、従来はCSV ファイルについてはカンマ区切りのみだったのですが、今回のアップデートに併せて区切り文字を指定するオプションが追加されています。
アップデート内容は以上です。
このあとは今回追加されたオプションを使ってみたのでその様子を紹介しますので興味のある方だけ見てください。
項目ソースに「JSONL」を指定
前述の AWS WAF のログを指定して JSONL オプションを使って分散 Map で処理させてみます。
ちなみに前述の AWS WAF ログのフォーマットですが、ひとつの JSON オブジェクトあたりは次のような構造となっています。
今回はこの中なかクライアント IP アドレスを抽出してみます。ステートマシンクエリ言語は JSONata でして、次のように Map 内の Pass コンポーネントで出力要素を抽出しています。
{
"hoge_client_ip": "{% $states.input.httpRequest.clientIp %}"
}
実行してみると次のように JSONL が正しく繰り返し処理され期待された出力を作成することが出来ました。
ライター設定オプションの出力タイプで「JSONL」を指定
さらに、今回のアップデートはインプットだけでなくアウトプットにも JSONL を指定できるようになっています。
Map にはライター設定というオプションがあり、マップ全体の出力形式を指定することが出来まして、JSON に加えて JSONL が指定できるようになっています。
こちらを指定したところ、先程の出力は次のように変化しました。
ひとつの JSON オブジェクト内で配列出力されていたものが、JSONL で個別のオブジェクトに分かれて出力されるようになりました。
CSV 区切り文字を指定
こちらはオマケみたいなアップデートですけども、前述のとおり CSV ファイルの区切り文字が指定できるようになりました。
デフォルトはカンマ区切りなのですが、ここではタブ区切りを指定してみます。
そして次のような TSV ファイルをあらかじめ S3 バケットに出力しておきます。
こちらも Pass コンポーネントでcol2
だけを抽出するようにして実行してみたのですが、期待どおり区切りが解釈されていそうですね。
Pass ごとの実行結果も確認してみると、タブ区切りにしたがってオブジェクトが読み込みされていることも確認できます。
さいご
本日は AWS Step Functions の Map で分散モード & S3 データソース時の入出力が JSONL をサポートしたので使ってみました。
AWS でも JSONL の前処理が必要になること結構多いので地味に嬉しいアップデートだと思います。
今回のアップデートにあわせて公開された AWS ブログによると Amazon Bedrock のバッチ推論アーキテクチャの入出力が JSONL なのでユースケースとして紹介されています。なるほど。
Introducing JSONL support with Step Functions Distributed Map | AWS Compute Blogより