[備忘]AWS Step Functions Distributed Map で前処理の値を一緒に渡すときのやり方
先日、「AWS Step Functions Distributed Map で並列処理」という記事を書きました。
並列処理あり、かつインプットにS3のファイルを使えそうな時は、Distributed Mapを使っているんですが、
先日、若干ハマったのですが、いろいろ調べたところ、なんとか上手くいったので、忘れないように書いておきます。
やりたかったこと
前処理のoutputの値を、Distributed Map内の処理で使いたい。
結論
Mapの定義で、ItemSelector
を使う。
設定補足
"ItemSelector": {
"target.$": "$$.Map.Item",
"yyyy.$": "$.yyyy",
"mm.$": "$.mm",
"dd.$": "$.dd"
}
ItemSelector
でこのように定義すると、
$$.Map.Item
には ItemReaderで指定したファイルの中身が入ってきます。
それ以外で指定しているパラメータは、前処理のパラメータになります。
本来、このパラメータって、inputの中身を絞り込む用途な気がするんですけどね。
なので、ItemSelectorで$$.Map.Item
を使わず、それ以外の前処理のパラメータだけにすると、
ファイルの中身は使われず、ItemSelectorで指定した項目のみパラメータとして利用されます。
Lambdaを呼び出した際のeventオブジェクトについて
ItemReaderで上記のような指定をすると、子処理でLambdaを呼び出した際、eventオブジェクトは以下となります。
{
"mm": "04",
"dd": "30",
"yyyy": 2023,
"target": {
"Index": 1,
"Value": {
"accountId": "002583687980",
"bucket": "dev-adminpack-billing",
"prefix": "risp-ai-operation-stg"
}
}
}
Indexはinputのファイルの位置(0,1,2...)、
Valueはファイルの中身になります。
通常だと、Event直下にValueの中身がセットされるので、指定が若干面倒ですね(改善できるかもしれませんが)
経緯
Distributed Mapを使った処理を作っていたんですが、
前処理で、前処理(create date)で日付を生成して、年(yyyy)、月(mm)、日(dd)が配列でoutputで出力し、
その日付をDistributed Map内で使う処理を作る必要がありました。
以下のような感じです。
前処理(create date)で日付を生成して、年(yyyy)、月(mm)、日(dd)が配列でoutputで出力し
その配列分、通常のMap処理で並列処理するために、inputパラメータとして渡ってきます。(ymdの箇所)
Mapの処理 ymd
のinput、定義上は以下になります。
"input": {
"ymds": [
{
"yyyy": "2023",
"mm": "05",
"dd": "03"
},
{
"yyyy": "2023",
"mm": "04",
"dd": "03"
}
]
},
最初、Distributed Mapの子処理で、
日付生成して、さらに並列処理・・・というのも考えたんですが、
同じ処理が無駄に実行されるな・・・と思いましてやめました。
前処理で、S3のファイル読み取るLambda関数を呼び出して、
日付とともにoutputパラメータにして・・・というのも考えましたが、
なんか負けた気がするのでやめました。
できないわけはないだろうと思いまして、
公式ドキュメント等、色々調べた結果、最初に記載した通り設定したところ、うまくいきました。
終わり
無事に解決してよかったと思う反面、
StepFunctionsまだまだ知らないことたくさんあるわーと思いました。ほんと。
Discussion