🗂

[備忘]AWS Step Functions Distributed Map で前処理の値を一緒に渡すときのやり方

2023/05/22に公開

先日、「AWS Step Functions Distributed Map で並列処理」という記事を書きました。
https://zenn.dev/keni_w/articles/b572102b4733d5

並列処理あり、かつインプットに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