こんにちは、CX事業本部 IoT事業部の若槻です。
AWS Step FunctionsのWorkflowには、STANDARDとEXPRESSの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と同じレベルの情報をすべてログとして残すとデータ量が増えすぎてしまうことを懸念しているのかも知れませんね。
参考
以上