はじめに
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 になっていますね。
functionB
とfunctionC
を同時に実行したい場合は、isB
とisC
の値は 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 ステートを使う時の参考にして頂ければ幸いです。