2021年12月28日火曜日

AWS Step FunctionsのMapでループをイテレートする

Step functionsでループを回すとき、Lambdaを使っていたのですが、Mapを使う方が簡単なのではないかということでメモ。


WorkFlow Studioで描く

2021年に出た機能です。絵を書くのは簡単ですが、途中で保存できないのが少し困ります。そのうち改良されるでしょうが・・・。



コード全体

WorkFlow Studioで絵を書いてからコードに変換できます(逆はできない。。)

"MaxConcurrency": 1 としないとループしないで同時に実行してしまうので注意が必要です(デフォルト無設定)。エラー処理の部分はデフォルトです。

{
  "Comment": "A description of my state machine",
  "StartAt": "Map",
  "States": {
    "Map": {
      "Type": "Map",
      "Iterator": {
        "StartAt": "Lambda Invoke",
        "States": {
          "Lambda Invoke": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:<lambda-name>",
            "OutputPath": "$.Payload",
            "Parameters": {
              "FunctionName": "map_step_function:$LATEST"
            },
            "Retry": [
              {
                "ErrorEquals": [
                  "Lambda.ServiceException",
                  "Lambda.AWSLambdaException",
                  "Lambda.SdkClientException"
                ],
                "IntervalSeconds": 2,
                "MaxAttempts": 6,
                "BackoffRate": 2
              }
            ],
            "End": true
          }
        }
      },
      "End": true,
      "MaxConcurrency": 1
    }
  }
}

Lambda関数はこちらのを使っています。 
arn:aws:states:::lambda:<lambda-name> という名前になるようにしてnode.js  で作成します。

exports.handler = (event, context, callback) => {
    callback(null, "Hello, " + event.who + "!");
};

StepFunctionsに入力するデータ
[
  {
    "who": "bob"
  },
  {
    "who": "meg"
  },
  {
    "who": "joe"
  }
]
実行すると、イテレートしていることが分かります。


もう少し入力を変えたいときはこちらを参考に。

0 件のコメント:

コメントを投稿