2021年5月9日日曜日

AWS Step FunctionsのforループでLambdaPythonを実行したい

Mapを使った方が簡単だとその後分かりました。こちら↓

===

StepFunctionsで、Lambdaをforループ的に使います。 

ループ用と、ループの中で2つLambdaを作ります。
 こちらの公式ドキュメントの例に追加していく形です。


 state machineの定義JSONとダイアグラム

{
  "Comment": "Iterator State Machine Example",
  "StartAt": "ConfigureCount",
  "States": {
    "ConfigureCount": {
      "Type": "Pass",
      "Result": {
        "count": 3,
        "index": -1,
        "step": 1
      },
      "ResultPath": "$.iterator",
      "Next": "Iterator"
    },
    "Iterator": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:region:account:function:Iterator",
      "ResultPath": "$.iterator",
      "Next": "IsCountReached"
    },
    "IsCountReached": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.iterator.continue",
          "BooleanEquals": true,
          "Next": "ExampleWork"
        }
      ],
      "Default": "Done"
    },
    "ExampleWork": {
      "Comment": "Your application logic, to run a specific number of times",
      "Type": "Task",
      "Resource": "arn:aws:lambda:region:account:function:IteratorPython",
      "ResultPath": "$.iterator",
      "Next": "Iterator"
    },
    "Done": {
      "Type": "Pass",
      "End": true
    }
  }
}

ここからは、state machine    の各項目の説明です。

ConfigureCount

初期値の設定。 forループの範囲、ステップを決めます。 

 "count": 3, "index": -1, "step": 1 と変更しています。これはPythonでの for index in range(3): と同じループになります。 -1からスタートしているのは、判定前に+1するためです。 

Iterator 

ループ用のNode.js Lambdaを作っておきます(ドキュメント通り。関数名Iterator)。 

IsCountReached

Iteratorが渡す値$.iterator.continueが、trueならExampleWorkに進みます。 (ドキュメント通り)

ExampleWork 

forループで毎回実行するLambdaをここで指定します。boto3 Pythonで書いています。 関数名はIteratorPythonとしています。

例えばevent['iterator']['index']とすると、Iteratorから来たindex値を受け取ることができます。

ややこしいのですが、Lambda Pythonにおけるevent['iterator'] というのは、渡されたeventそのものです。Nodejsではiteratorという変数があるのですが、Pythonでは不要。

Lambda関数IteratorPythonの中身
import json

def lambda_handler(event, context):

    index = event['iterator']['index']
    step = event['iterator']['step']
    count = event['iterator']['count']
    
    # write your code

    response = {
        "index": index,
        "step": step,
        "count": count,
    }
    return response

IAMの設定

StepFunctionsを更新したとき(Lambda追加とか)、自動で作成すると便利です。

このようなIAM policyが追加されます。

        {
            "Effect": "Allow",
            "Action": [
                "lambda:InvokeFunction"
            ],
            "Resource": [
                "arn:aws:lambda:region:account:function:IteratorPython",
                "arn:aws:lambda:region:account:function:Iterator"
             ]
        }

0 件のコメント:

コメントを投稿