Mapを使った方が簡単だとその後分かりました。こちら↓
===
ループ用と、ループの中で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"
]
}