AWS Step Functionsで実行履歴をCloudWatch Logsに記録してみた(AWS CDK v2)
こんにちは、CX事業本部 IoT事業部の若槻です。
AWS Step Functionsでは、State Machineの実行履歴で各State TransitionのEventを確認することができます。
しかしこのState Machineの実行履歴は、保持期間は最大90日間となります。(Standard Workflowの場合)
90 days. After this time, you can no longer retrieve or view the execution history. There is no further quota for the number of closed executions that Step Functions retains.
また当然ながらこの実行履歴はState Machineリソースが削除されると、合わせて削除されてしまいます。
しかし組織などのビジネス上のポリシーにより、実行履歴を一定期間は削除せずに保持しておきたい場合もあるかと思います。
そこで今回は、AWS CDKで作成したAWS Step Functionsで、実行履歴をCloudWatch Logsに記録する方法を確認してみました。
やってみた
State Machineのログを設定する
AWS CDK v2(TypeScript)で次のようなCDKスタックを作成します。
import { Construct } from 'constructs'; import { aws_logs, aws_stepfunctions, RemovalPolicy, Stack, StackProps, } from 'aws-cdk-lib'; export class AwsAppStack extends Stack { constructor(scope: Construct, id: string, props: StackProps) { super(scope, id, props); // StateMachine new aws_stepfunctions.StateMachine(this, 'stateMachine', { stateMachineName: 'stateMachine', definition: new aws_stepfunctions.Pass(this, 'pass'), logs: { destination: new aws_logs.LogGroup(this, 'stateMachineLogGroup', { logGroupName: 'stateMachineLogGroup', removalPolicy: RemovalPolicy.RETAIN, retention: aws_logs.RetentionDays.ONE_YEAR, //保持期間1年間 }), level: aws_stepfunctions.LogLevel.ALL, }, }); } }
- State Machineのlogsプロパティを指定することによりLoggingが設定され、実行履歴をCloudWatch Logsに記録することができるようになります。(ハイライト部分)
destination
ではLog Groupを指定します。ここでRemoval PolicyをRETAIN
とすることにより、Log GroupがStackから論理削除された場合でも実際のリソースは削除されないようにしています。level
は既定ではERROR
となるため、すべての実行の履歴を残したい場合はALL
を指定します。
ここで比較として、Loggingが未設定の場合はState Machineに対するLog Groupはもちろん作成されていません。
aws cloudformation list-stack-resources --stack-name AwsAppStack { "StackResourceSummaries": [ { "LogicalResourceId": "CDKMetadata", "PhysicalResourceId": "cced2150-01e3-11ed-a925-0ed955f95f17", "ResourceType": "AWS::CDK::Metadata", "LastUpdatedTimestamp": "2022-07-16T15:46:48.080000+00:00", "ResourceStatus": "UPDATE_COMPLETE", "DriftInformation": { "StackResourceDriftStatus": "NOT_CHECKED" } }, { "LogicalResourceId": "stateMachineE926C166", "PhysicalResourceId": "arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:stateMachine:stateMachine", "ResourceType": "AWS::StepFunctions::StateMachine", "LastUpdatedTimestamp": "2022-07-16T15:46:49.934000+00:00", "ResourceStatus": "UPDATE_COMPLETE", "DriftInformation": { "StackResourceDriftStatus": "NOT_CHECKED" } }, { "LogicalResourceId": "stateMachineRole64DF9B42", "PhysicalResourceId": "AwsAppStack-stateMachineRole64DF9B42-I5E0RS8MRIN1", "ResourceType": "AWS::IAM::Role", "LastUpdatedTimestamp": "2022-07-12T13:09:45.525000+00:00", "ResourceStatus": "CREATE_COMPLETE", "DriftInformation": { "StackResourceDriftStatus": "NOT_CHECKED" } } ] }
上記をCDK Deployしてスタックをデプロイします。
するとState MachineにLoggingが設定されてStackにLog Groupのリソースが追加されました。
aws cloudformation list-stack-resources --stack-name AwsAppStack { "StackResourceSummaries": [ { "LogicalResourceId": "CDKMetadata", "PhysicalResourceId": "cced2150-01e3-11ed-a925-0ed955f95f17", "ResourceType": "AWS::CDK::Metadata", "LastUpdatedTimestamp": "2022-07-16T16:21:45.847000+00:00", "ResourceStatus": "UPDATE_COMPLETE", "DriftInformation": { "StackResourceDriftStatus": "NOT_CHECKED" } }, { "LogicalResourceId": "stateMachineE926C166", "PhysicalResourceId": "arn:aws:states:ap-northeast-1:XXXXXXXXXXXX:stateMachine:stateMachine", "ResourceType": "AWS::StepFunctions::StateMachine", "LastUpdatedTimestamp": "2022-07-16T16:36:03.091000+00:00", "ResourceStatus": "UPDATE_COMPLETE", "DriftInformation": { "StackResourceDriftStatus": "NOT_CHECKED" } }, { "LogicalResourceId": "stateMachineLogGroupE6C5AE73", "PhysicalResourceId": "stateMachineLogGroup", "ResourceType": "AWS::Logs::LogGroup", "LastUpdatedTimestamp": "2022-07-16T16:21:45.505000+00:00", "ResourceStatus": "CREATE_COMPLETE", "DriftInformation": { "StackResourceDriftStatus": "NOT_CHECKED" } }, { "LogicalResourceId": "stateMachineRole64DF9B42", "PhysicalResourceId": "AwsAppStack-stateMachineRole64DF9B42-I5E0RS8MRIN1", "ResourceType": "AWS::IAM::Role", "LastUpdatedTimestamp": "2022-07-12T13:09:45.525000+00:00", "ResourceStatus": "CREATE_COMPLETE", "DriftInformation": { "StackResourceDriftStatus": "NOT_CHECKED" } }, { "LogicalResourceId": "stateMachineRoleDefaultPolicy9579E9AD", "PhysicalResourceId": "AwsAp-stat-KCLN3FGY01B7", "ResourceType": "AWS::IAM::Policy", "LastUpdatedTimestamp": "2022-07-16T16:22:08.835000+00:00", "ResourceStatus": "CREATE_COMPLETE", "DriftInformation": { "StackResourceDriftStatus": "NOT_CHECKED" } } ] }
State Machineを実行します。
すると実行結果のDetailsで、Execution Logsのリンクが表示されるので開いてみます。
CloudWatch LogsのLog Groupが開きました。Log streamが記録されているので開いてみます。
実行履歴がちゃんとデータ含めて記録されていますね!
ちなみに記録されているログは、実行結果のEvent viewで確認できるEventsに対応したものとなります。
State Machineを削除してみる
その後State Machineを利用しなくなったとします。そこでState Machineリソースを削除します。(ここではStack毎State MachineおよびLog Groupのリソースを削除します。)
$ cdk destroy AwsAppStack Are you sure you want to delete: AwsAppStack (y/n)? y AwsAppStack: destroying... ✅ AwsAppStack: destroyed
Log Groupは削除されずに残るので、Logデータを引き続き確認可能となっていますね!
おわりに
AWS Step Functionsで実行履歴をCloudWatch Logsに記録してみました。
サーバーレス構成におけるロギング戦略は、Lambda関数の実行内でのロギングが主であり、Step Functionsについては検討の俎上にすら上がらないというイメージがあるので、検討をされてみてはいかがでしょうか。
以上