AWS Step FunctionsステートマシンでStates.Formatによる文字列テンプレートを使用する(AWS CDK)

2021.11.22

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

以前の下記エントリでは、States.Formatによる文字列テンプレートを使用するステートマシンを、Workflow Studioを使用して作ってみました。

今回は、AWS Step FunctionsステートマシンでStates.Formatによる文字列テンプレートを使用する構成を、AWS CDKで作ってみました。

States.Formatとは

Step FunctionsではIntrinsic functionsという組み込み関数を使用できます。

そのうち文字列リテラル中の特定シーケンス({})の置き換えをするテンプレートのような利用ができるものがStates.Formatです。

例えば下記のような入力がある場合に、

{
 "name": "Arnav",
 "template": "Hello, my name is {}."
}

States.Formatを下記のように使用すれば、

States.Format($.template, $.name)

Hello, my name is Arnav.という出力を得られます。

やってみた

CDKコード

Lambda関数の実行インプットでStates.Format()を使用するタスクを実行するステートマシンを作成しています。

lib/aws-cdk-app-stack.ts

import * as cdk from '@aws-cdk/core';
import * as lambda from '@aws-cdk/aws-lambda';
import * as sfn from '@aws-cdk/aws-stepfunctions';
import * as tasks from '@aws-cdk/aws-stepfunctions-tasks';

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

    const helloFunc = new lambda.Function(this, 'helloFunc', {
      code: lambda.Code.fromInline(`
          exports.handler = (event, context, callback) => {
            callback(null);
          };
      `),
      runtime: lambda.Runtime.NODEJS_14_X,
      handler: 'index.handler',
    });

    const helloTask = new tasks.CallAwsService(this, 'helloTask', {
      service: 'lambda',
      action: 'invoke',
      parameters: {
        FunctionName: helloFunc.functionName,
        Payload: {
          'greet.$': "States.Format('{}, {}!', 'Hello', $.name)",
        },
      },
      iamResources: [helloFunc.functionArn],
      iamAction: 'lambda:InvokeFunction',
    });

    new sfn.StateMachine(this, 'helloStateMachine', {
      definition: helloTask,
    });
  }
}

CDKスタックをcdk deployでデプロイします。

動作

作成されたステートマシンを実行すると、

{
    "name": "Step Functions"
}

実行結果で、テンプレート中の{}が置き換えられて文字列リテラルが作成されています。

//CDk上での記述
{
  'greet.$': "States.Format('Hello, {}!', 'Step Functions')"
}

//実行結果
{
  "greet": "Hello, Step Functions!"
}

おわりに

AWS Step FunctionsステートマシンでStates.Formatによる文字列テンプレートを使用する構成を、AWS CDKで作ってみました。

Intrinsic functionsをAWS CDKで使用する場合も、CDKの組み込み関数など使わずにWorkflow Studioから作成する場合と同じような記述とすれば良いようです。

以上