AWS Step Functions Express WorkflowをAWS CDKで作ってみた

2022.07.02

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

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

AWS Step FunctionsのWorkflowには、STANDARDEXPRESSの2種類があります。

既定のSTANDARDは非同期実行ですが、EXPRESSは同期実行となり、Workflowを同期的に呼び出して出力を取得することができます。

今回は、AWS Step Functions Express WorkflowをAWS CDKで作ってみました。

やってみた

環境構築

AWS CDK v2(TypeScript)で次のようなCDKスタックを作成します。

lib/cdk-app-stack.ts

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

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

    // Express Workflow
    new aws_stepfunctions.StateMachine(this, 'stateMachine', {
      stateMachineName: 'stateMachineExpress',
      stateMachineType: aws_stepfunctions.StateMachineType.EXPRESS,
      definition: new aws_stepfunctions.Pass(this, 'pass', {
        parameters: {
          key1: 'val1',
        },
      }),
    });
  }
}
  • Express Workflowは、aws_stepfunctions.StateMachine()stateMachineTypeプロパティでEXPRESSを指定することにより作成できます。(既定ではSTANDARD

上記をCDK Deployしてスタックをデプロイします。

動作確認

aws . stepfunctions start-sync-executionコマンドで作成したWorkflowを実行してみます。

$ ACCOUNT_ID=<ACCOUNT_ID>
$ STATE_MACHINE_NAME=<STATE_MACHINE_NAME>
$ aws stepfunctions start-sync-execution \
  --state-machine-arn "arn:aws:states:ap-northeast-1:${ACCOUNT_ID}:stateMachine:${STATE_MACHINE_NAME}"

{
    "executionArn": "arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:express:stateMachineExpress:0201148f-e0a9-426e-b631-8608604820fb:eced9f1b-a691-4c39-aef1-232fe5ea9366",
    "stateMachineArn": "arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:stateMachine:stateMachineExpress",
    "name": "0201148f-e0a9-426e-b631-8608604820fb",
    "startDate": "2022-07-02T23:41:20.902000+09:00",
    "stopDate": "2022-07-02T23:41:20.906000+09:00",
    "status": "SUCCEEDED",
    "input": "{}",
    "inputDetails": {
        "included": true
    },
    "output": "{\"key1\":\"val1\"}",
    "outputDetails": {
        "included": true
    },
    "billingDetails": {
        "billedMemoryUsedInMB": 64,
        "billedDurationInMilliseconds": 100
    }
}

Expressは同期実行なのでOutput"{\"key1\":\"val1\"}"も取得できていますね。

ロギングを有効にする

Express Workflowの実行履歴を残したい場合は、Standardとは異なりCloud Watch Logsに記録される必要がありますが、既定ではロギングは無効になります。

StateMachine Constructでlogsプロパティを設定します。

lib/cdk-app-stack.ts

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

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

    // Express Workflow
    new aws_stepfunctions.StateMachine(this, 'stateMachine', {
      stateMachineName: 'stateMachineExpress',
      stateMachineType: aws_stepfunctions.StateMachineType.EXPRESS,
      logs: {
        destination: new aws_logs.LogGroup(this, 'stateMachineExpressLogGroup'),
        level: aws_stepfunctions.LogLevel.ALL,
      },
      definition: new aws_stepfunctions.Pass(this, 'pass', {
        parameters: {
          key1: 'val1',
        },
      }),
    });
  }
}

CDK Deployすると、Workflowのロギングが有効になりました!

Recent LogsでLogの内容を見ることができました。

しかしSTANDARDの場合と異なり、State毎の詳細な入出力は見れないようです。

おわりに

AWS Step Functions Express WorkflowをAWS CDKで作ってみました。

Express WorkflowもStandardと同様にStep Functionsのコンソールで実行のGraph veiwやEvent viewが見られると良いのですが、Express Workflowは頻繁に実行される処理を対象した機能であることを考えるとStandardと同じレベルの情報をすべてログとして残すとデータ量が増えすぎてしまうことを懸念しているのかも知れませんね。

参考

以上