AWS CDKでCognito User Poolsの削除保護が設定できるようになっていました

2022.11.25

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

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

Amazon Cognito User Poolの削除保護(Deletion protection)機能は、その名の通りUser Poolをオペミスなどの不用意な削除から保護できる機能で、今年10月のアップデートで利用可能となっていましたが、その際にはまだAWS CDKからは設定できませんでした。

しかし本日CDKのドキュメントを見ていると、なんとCDKからも設定ができるようになっていたので、今回実際に試してみました。

やってみた

CDK Construct Libraryのアップグレード

リリース履歴を追ってみると、CDK Construct Libraryで削除保護の設定がサポートされたのは7日前にリリースされたv2.51.0からでした。

cognito: deletion protection for user pools (#22765) (9bde9f3)

私の環境は現状では2.50.0でしたのでアップグレードを実施します。

$ npm ls aws-cdk-lib aws-cdk           
aws-cdk-app@0.1.0 /Users/wakatsuki.ryuta/projects/cm-rwakatsuki/aws-cdk-app
├── aws-cdk-lib@2.50.0
└── aws-cdk@2.50.0
npm i aws-cdk-lib@latest aws-cdk@latest constructs@latest

CDKで削除保護を設定

CDK Stackで、deletionProtectiontrueに指定したUser Poolを新規作成します。

lib/aws-cdk-app-stack.ts

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

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

    new aws_cognito.UserPool(this, 'UserPool', {
      userPoolName: 'UserPool',
      deletionProtection: true,
    });
  }
}

StackをCDK DeployしてUser Poolを作成します。

作成されたUser Poolをマネジメントコンソールから見てみると、削除保護が有効になっていますね。

User Poolの削除を試みると、削除保護を無効化するように求められます。ちゃんと削除保護が働いていますね。

CDKで削除してみる

削除保護を有効化したままCDKでUser Poolの削除を試みた際の動作を確認してみます。

  • Stackごと削除する場合

CDK DestroyによりStackごとUser Poolの削除を試みた場合、エラーとなり削除はできませんでした。

$ npx cdk destroy "*"
Are you sure you want to delete: AwsCdkAppStack (y/n)? y
AwsCdkAppStack: destroying...

   AwsCdkAppStack: destroy failed Error: Stack [AwsCdkAppStack] cannot be deleted while TerminationProtection is enabled
    at destroyStack (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/aws-cdk-app/node_modules/aws-cdk/lib/api/deploy-stack.ts:669:11)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
    at CdkToolkit.destroy (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/aws-cdk-app/node_modules/aws-cdk/lib/cdk-toolkit.ts:533:9)
    at initCommandLine (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/aws-cdk-app/node_modules/aws-cdk/lib/cli.ts:364:12)

Stack [AwsCdkAppStack] cannot be deleted while TerminationProtection is enabled
  • StackからConstruct(Resource)を削除した場合

次のようにStackからConstructの記述を消してCDK Deployを行い削除を試みた場合、削除できました。

lib/aws-cdk-app-stack.ts

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

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

    /*
    new aws_cognito.UserPool(this, 'UserPool', {
      userPoolName: 'UserPool',
      deletionProtection: true,
    });
    */
  }
}

Stackから誤って記述を削除してしまった場合は削除保護が効かないので注意が必要そうです。

おわりに

AWS CDKでCognito User Poolsの削除保護が設定できるようになっていたので試してみました。

是非にも使いたい機能だったにも関わらず、CDKでは設定できないためしばし様子見していましたが、1ヶ月遅れでCDKでもサポートされるようになり歓喜しました。

以上