CDK (7) - らんだむな記憶 を少し拡張して Fibonacci 数列 $\{a_i\}_{i=1}^\infty = \{1, 1, 2, 3, 5, \cdots\}$ に対して
$$
\sum_{i=1}^N a_i^n
$$
を計算する Step Functions を実装した。以下のように Fibonacci 数列の各項についてイテレーションを回す Map State を定義し、それぞれの中で値を $n$ 乗する Lambda を適用し、それらの結果の和をとる Lambda に渡す形にした。
const map = new sfn.Map(this, 'Map State', { itemsPath: sfn.JsonPath.stringAt('$.fibonacci'), parameters: { 'base.$': '$$.Map.Item.Value', 'exponent.$': '$.exponent', }, }).addRetry({ maxAttempts: 1 }); const powJob = new tasks.LambdaInvoke(this, 'Power Job', { lambdaFunction: powLambda, inputPath: '$', outputPath: '$.Payload', }).addRetry({ maxAttempts: 1 }); map.iterator(powJob); const sumJob = new tasks.LambdaInvoke(this, 'Sum Job', { lambdaFunction: sumLambda, inputPath: '$', outputPath: '$.Payload', }).addRetry({ maxAttempts: 1 }); const definition = submitJob .next(fibonacciJob) .next(map) .next(sumJob);
Map State の次の Lambda にどういう形でイベントが来るか少し悩んだが、イベントのリストとして渡ってきた:
# SumLambda def lambda_handler(event, context): # event = [{'base': 1, 'exponent': 2, 'statusCode': 200, 'value': 1}, {'base': 1, 'exponent': 2, 'statusCode': 200, 'value': 1}, ...] total = 0 for eve in event: total += eve['value'] event = {} event['value'] = total event['statusCode'] = 200 return event
boto3 から呼び出しの実験をする時には
client = boto3.client('stepfunctions', endpoint_url='http://localhost:4566/')
とすることに注意すれば後は普通の AWS の場合と同様である。