AWS CDKでStep FunctionsステートマシンのRemoval policyを設定できるようになっていました

2023.04.01

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

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

AWS CDKのリリース履歴を見ていたところ、v2.66.0でAWS Step Functionsステートマシンの削除ポリシー(Removal policy)を設定できるようになっていることに気が付きました。

Features - stepfunctions: removal policy for state machines (#24105) (5f33a26)

対応はこちらのPull Requestでなされたようです。

何が嬉しいのか

Step Functionsのステートマシンを削除(物理削除)すると、そのステートマシンの実行履歴(Execution histories)も合わせて削除される挙動となります。

そのため削除ポリシーを設定することにより、、「ステートマシンのリソースをCDK(CloudFormation)スタックの管理外にしたい(論理削除したい)が、実行履歴は保持したい」という場合に、ステートマシンおよびその実行履歴を削除せずに保持することができるようになります。

Set the removalPolicy prop to RemovalPolicy.RETAIN if you want to retain the execution history when CloudFormation deletes your state machine.

注意点:実行履歴の保持期間は最大90日

注意点として、実行履歴の保持期間は最大90日までのため、それ以降も履歴データを保持したい場合はGetExecutionHistoryにより履歴データを取得し、別途保管する必要があります。

90 days after an execution is closed. 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.

試してみた

設定

AWS CDKのライブラリのバージョンはv2.66.0以上にアップグレード済みです。

$ npm ls  aws-cdk
cdk_sample_app@0.1.0 /Users/hoge/cdk_sample_app
└── aws-cdk@2.72.0

removalPolicyプロパティをRemovalPolicy.RETAIN(保持)に設定し、ステートマシンのリソースを作成します。既定ではRemovalPolicy.DESTROY(削除)になっています。

lib/cdk-sample-stack.ts

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

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

    new aws_stepfunctions.StateMachine(this, 'MyStateMachine', {
      definition: new aws_stepfunctions.Pass(this, 'Pass', {}),
      stateMachineName: 'MyStateMachine',
      removalPolicy: RemovalPolicy.RETAIN,
    });
  }
}

CloudFormationのコンソールを見ると、リソース一覧にステートマシンが追加されています。

リソースを削除してみる

ステートマシンのリソースの記述をコメントアウトしてCDKデプロイを行い、リソースを削除してみます。

lib/cdk-sample-stack.ts

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

    // new aws_stepfunctions.StateMachine(this, 'MyStateMachine', {
    //   definition: new aws_stepfunctions.Pass(this, 'Pass', {}),
    //   stateMachineName: 'MyStateMachine',
    //   removalPolicy: RemovalPolicy.RETAIN,
    // });
  }
}

するとCloudFormationスタックからステートマシンのリソースが削除されました。(論理削除された)

一方、ステートマシン一覧を見ると、リソースが物理削除されずに残っています。

スタックからの論理削除後もステートマシンのリソースは物理削除されず、保持されることを確認できました。

スタックごと削除してみる

CDKデストロイでスタックごとステートマシンのリソースを削除します。

$ cdk destroy
Are you sure you want to delete: CdkSampleStack (y/n)? y
CdkSampleStack: destroying... [1/1]

   CdkSampleStack: destroyed

これでCloudFormationごと削除されました。

スタックごと削除後もステートマシンのリソースが保持されています。

スタックごと削除した場合も、ステートマシンのリソースは物理削除されず、保持されることを確認できました。

参考

以上