AWS Step Functionsで組み込み関数だけで文字列置換ができるようになっていました

2022.09.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部 IoT事業部の若槻です。

最近のStep Functionsのアップデートで新しい組み込み関数が14個追加されましたが、その中には文字列置換を行う組み込み関数はありませんでした。

しかし、それらのうちStates.StringSplitを活用すれば、AWS Step Functionsで組み込み関数だけで文字列置換ができるようになっていたので、今回はその実装(AWS CDK)を紹介します。

やってみた

実装

例えば日付文字列の-/に置換したい場合を考えてみます。よくありそうな置換パターンですね。

  • 置換前:2022-09-02
  • 置換後:2022/09/02

この場合は置換対象の文字列-が特定数(今回は2つ)含まれているので、そのことを前提とし、次のようなCDK Stack定義による実装を行いました。

lib/aws-cdk-app-stack.ts

import { aws_stepfunctions, Stack, StackProps } from 'aws-cdk-lib';
import { Construct } from 'constructs';

export class AwsCdkAppStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    // 文字列分割
    const getSplittedListPass = new aws_stepfunctions.Pass(
      this,
      'getSplittedListPass',
      {
        parameters: {
          'splittedList.$': "States.StringSplit($.inputString, '-')",
        },
      }
    );

    // 文字列置換
    const replacePass = new aws_stepfunctions.Pass(this, 'replacePass', {
      parameters: {
        replaced: aws_stepfunctions.JsonPath.format(
          '{}/{}/{}',
          aws_stepfunctions.JsonPath.stringAt('$.splittedList[0]'),
          aws_stepfunctions.JsonPath.stringAt('$.splittedList[1]'),
          aws_stepfunctions.JsonPath.stringAt('$.splittedList[2]')
        ),
      },
    });

    // State Machine
    new aws_stepfunctions.StateMachine(this, 'myStateMachine', {
      stateMachineName: 'myStateMachine',
      definition: getSplittedListPass.next(replacePass),
    });
  }
}
  • 元の文字列を、States.StringSplitで置換対象文字列(-)をSplitterとして分割し、States.Format/に置き換えて文字列結合しています。

上記をCDK Deployしてスタックをデプロイすると、次の定義のState Machineが作成されます。

Definition

{
  "StartAt": "getSplittedListPass",
  "States": {
    "getSplittedListPass": {
      "Type": "Pass",
      "Parameters": {
        "splittedList.$": "States.StringSplit($.inputString, '-')"
      },
      "Next": "replacePass"
    },
    "replacePass": {
      "Type": "Pass",
      "Parameters": {
        "replaced.$": "States.Format('{}/{}/{}', $.splittedList[0], $.splittedList[1], $.splittedList[2])"
      },
      "End": true
    }
  }
}

動作確認

次のInputを指定してState Machineを実行します。

Input

{
    "inputString": "2022-09-02"
}

getSplittedListPassではInputの文字列が-をSplitterにして配列に分割されています。

そしてreplacePassでは置換結果として2022/09/02が取得できていますね!

置換箇所が不特定多数の場合

今回紹介した実装は、置換箇所が特定数(今回は/が2箇所)の場合にのみ成り立つ文字列置換の方法でした。もし置換箇所が不特定多数の場合はまた異なる実装が必要です。それは次回以降で紹介したいと思います。

おわりに

AWS Step Functionsで組み込み関数だけで文字列置換ができるようになっていたので実装のご紹介でした。

頭の体操でしたね。Step Functionsはアイデア次第で本来の機能以上の処理も出来てしまうので触っていて楽しくて仕方がありません。

参考

以上