[Step Functions]Paralellステートで入力パラメータに基づいて分岐する並列処理を実装する

Paralellステートの中にChoiceステートを処理対象と1:1で入れるといい感じに実装できます。
2023.10.24

はじめに

Step Fucntions には Paralell ステートという並列実行を行うためのステートがあります。これを使うことで、複数の処理を同時に行うことができるため、処理時間の短縮が可能です。

Paralell ステートの詳細については以下をご参照ください。

今回はこの Paralell ステートを使って並列実行する際、入力のパラメータから実行する処理を分けたいケースがあったので試してみました。

やってみる

実装

実装自体は本題ではないので CDKv2 を使ってパパッと構築します。

参考までにコードは以下のような感じに記述しました。

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';

export class SfnParalellStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    const choiceStateA = new sfn.Choice(this, 'Choice State A')
      .when(sfn.Condition.booleanEquals('$.isA', true), new sfn.Succeed(this, 'functionA'))
      .otherwise(new sfn.Succeed(this, 'passA'));

    const choiceStateB = new sfn.Choice(this, 'Choice State B')
      .when(sfn.Condition.booleanEquals('$.isB', true), new sfn.Succeed(this, 'functionB'))
      .otherwise(new sfn.Succeed(this, 'passB'));
    
    const choiceStateC = new sfn.Choice(this, 'Choice State C')
      .when(sfn.Condition.booleanEquals('$.isC', true), new sfn.Succeed(this, 'functionC'))
      .otherwise(new sfn.Succeed(this, 'passC'));
    
    const definition = new sfn.Parallel(this, 'Parallel State')
      .branch(choiceStateA)
      .branch(choiceStateB)
      .branch(choiceStateC);

    new sfn.StateMachine(this, 'StateMachine', {
      definitionBody: sfn.DefinitionBody.fromChainable(definition),
    });
  }
}

これをデプロイすると、こんな感じの定義になります。

インプットから処理を分岐させる

Paralell ステート内には 3 つの Choice ステートに分岐しており、それぞれ実行したい処理(function)と pass ステートに分岐させています。

このように Paralell 内でやりたい処理に対して Choice ステートを 1:1 で用意することで、入力のパラメータから実行する処理を分岐させています。

例えば、functionAだけを実行したい場合は、以下の入力で実行します。

{
  "isA": true,
  "isB": false,
  "isC": false
}

Choice State Aでは入力の"isA": trueが評価されるため functionsA が実行、それ以外は false のため、B と C は pass になっていますね。

functionBfunctionCを同時に実行したい場合は、isBisCの値は true にします。

{
  "isA": false,
  "isB": true,
  "isC": true
}

functionA は pass になっており、functionB と C は実行されています。入力を true にするだけなのでシンプルですね。

パラメータがない場合

当たり前ですが入力のパラメータがない場合は、Choice ステップでエラーになります。isCを消した入力で実行してみます。

{
  "isA": false,
  "isB": true
}

Choice State Cの判定で、使用するisCが見つからないためエラーとなりました。この時 Paralell は並列で実行している処理全てが中断されます。

そのためこの実装を行う場合は、Paralell ステートの入力を決めておきましょう。

まとめ

Paralell ステートを使って入力のパラメータから並列処理の対象を分岐してみました。かなりシンプルに実装できるので Paralell ステートを使う時の参考にして頂ければ幸いです。