らんだむな記憶

blogというものを体験してみようか!的なー

CDK (8)

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 に渡す形にした。

f:id:derwind:20220310021039p:plain

    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 の場合と同様である。