AWS CDK で Cognito ユーザープールの機能プラン(Tier)を設定してみた

AWS CDK で Cognito ユーザープールの機能プラン(Tier)を設定してみた

Clock Icon2024.12.12

こんにちは、製造ビジネステクノロジー部の若槻です。

Amazon Cognito に導入された機能プラン(Tier)Amazon CloudFormation でも設定可能となるアップデートがありました。

https://dev.classmethod.jp/articles/cloudformation-cognito-tier/

そのアップデートに応じて、AWS CDK でも機能プラン(Tier)の設定が可能となるリリースがありました。

https://github.com/aws/aws-cdk/releases/tag/v2.173.0

cognito: user pool feature plans (#32367) (39c22de), closes #32369

今回は、実際に AWS CDK で Cognito ユーザープールの機能プランを設定してみました。

やってみた

CDK パッケージのアップデート

AWS CDK モジュールを v2.173.0 以上にアップデートします。

npm i aws-cdk-lib@latest aws-cdk@latest

CDK 実装

AWS CDK で Cognito ユーザープールを作成する場合は機能プランの既定値は Essentials ですが、今後は UserPool Construct クラスに追加された featurePlan プロパティで機能プランを指定できるようになりました。下記では Plus を指定しています。

lib/main-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as cognito from 'aws-cdk-lib/aws-cognito';
import { Construct } from 'constructs';

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    new cognito.UserPool(this, 'TestUserPool', {
      featurePlan: cognito.FeaturePlan.PLUS, // 機能プランを指定
    });
  }
}

ちなみに機能プランの種類と機能プランごとに利用可能な機能は下記にまとめていますので、参考にしてください。

https://dev.classmethod.jp/articles/amazon-cognito-user-pools-feature-tiers/

上記の CDK 実装をデプロイすると、Plus プランが設定されたユーザープールを作成することができました。

ASF は設定可能だが非推奨

機能プランの導入に伴い、今まであった Advanced Security Mode (ASF) の設定は非推奨となりました。

AWS CDK でも下記のように advancedSecurityMode プロパティの利用が非水推奨となっています。

また機能プラン(featurePlan)と ASF(advancedSecurityMode) プロパティの組み合わせの互換性チェックが CDK で行われるようになりました。互換性対応は下記の通りとなります。

featurePlan advancedSecurityMode 互換性
1 LITE OFF OK
2 LITE AUDIT OK
3 LITE ENFORCED OK
4 ESSENTIALS OFF OK
5 PLUS OFF OK
6 ESSENTIALS AUDIT NG
7 ESSENTIALS ENFORCED NG
8 PLUS AUDIT NG
9 PLUS ENFORCED NG

次のように PLUS および AUDIT という互換性 NG の組み合わせを指定してみます。

lib/main-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as cognito from 'aws-cdk-lib/aws-cognito';
import { Construct } from 'constructs';

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    new cognito.UserPool(this, 'TestUserPool', {
      featurePlan: cognito.FeaturePlan.PLUS,
      advancedSecurityMode: cognito.AdvancedSecurityMode.AUDIT,
    });
  }
}

CDK Synth を実行するとエラーになりました。デプロイ前に互換性チェックのフィードバックがあるのはありがたいですね。

$ npx cdk synth Main
[WARNING] aws-cdk-lib.aws_cognito.UserPoolProps#advancedSecurityMode is deprecated.
  Advanced Security Mode is deprecated in favor of user pool feature plans.
  This API will be removed in the next major release.
[WARNING] aws-cdk-lib.aws_cognito.AdvancedSecurityMode is deprecated.
  Advanced Security Mode is deprecated in favor of user pool feature plans.
  This API will be removed in the next major release.
[WARNING] aws-cdk-lib.aws_cognito.AdvancedSecurityMode#AUDIT is deprecated.

  This API will be removed in the next major release.

(中略)

Error: you cannot enable Advanced Security Mode when feature plan is Essentials or higher.
    at new UserPool (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/node_modules/aws-cdk-lib/aws-cognito/lib/user-pool.js:1:8121)
    at new MainStack (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/lib/main-stack.ts:9:5)
    at Object.<anonymous> (/Users/wakatsuki.ryuta/projects/cm-rwakatsuki/cdk_sample_app/bin/cdk_sample_app.ts:7:1)
    at Module._compile (node:internal/modules/cjs/loader:1241:14)
    at Module.m._compile (/Users/wakatsuki.ryuta/.npm/_npx/1bf7c3c15bf47d04/node_modules/ts-node/src/index.ts:1618:23)
    at Module._extensions..js (node:internal/modules/cjs/loader:1295:10)
    at Object.require.extensions.<computed> [as .ts] (/Users/wakatsuki.ryuta/.npm/_npx/1bf7c3c15bf47d04/node_modules/ts-node/src/index.ts:1621:12)
    at Module.load (node:internal/modules/cjs/loader:1091:32)
    at Function.Module._load (node:internal/modules/cjs/loader:938:12)
    at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:83:12)
Subprocess exited with error 1

既存のユーザープール

ちなみに CDK で既存のユーザープールが実装された状態で AWS CDK モジュールを v2.173.0 以上にアップデートした場合はどうなるでしょうか。

次のようなユーザープールが元々作成されていたとします。

lib/main-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as cognito from 'aws-cdk-lib/aws-cognito';
import { Construct } from 'constructs';

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    new cognito.UserPool(this, 'UserPool', {
      signInAliases: {
        email: true,
      },
    });
  }
}

機能プラン導入以降に作成されたユーザープールであるため、機能プランは既定の Essentials プランとなっています。

CDK モジュールのアップデート後に CDK Diff を取ってみると、差分はありませんでした。勝手に変わるということはないようです。

$ npx cdk diff Main
start: Building c7b0979f671072304df5ac7dde1882bf0c9bb4df6de1a959f4eb52f7aa41299b:current_account-current_region
success: Built c7b0979f671072304df5ac7dde1882bf0c9bb4df6de1a959f4eb52f7aa41299b:current_account-current_region
start: Publishing c7b0979f671072304df5ac7dde1882bf0c9bb4df6de1a959f4eb52f7aa41299b:current_account-current_region
success: Published c7b0979f671072304df5ac7dde1882bf0c9bb4df6de1a959f4eb52f7aa41299b:current_account-current_region
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Stack Main
There were no differences

✨  Number of stacks with differences: 0

機能プランを Lite に変更してみます。

lib/main-stack.ts
import * as cdk from 'aws-cdk-lib';
import * as cognito from 'aws-cdk-lib/aws-cognito';
import { Construct } from 'constructs';

export class MainStack extends cdk.Stack {
  constructor(scope: Construct, id: string) {
    super(scope, id);

    new cognito.UserPool(this, 'UserPool', {
      signInAliases: {
        email: true,
      },
      featurePlan: cognito.FeaturePlan.LITE, // 機能プランを既定の Essentials から変更
    });
  }
}

この場合は機能プランの差分が検出されました。

$ npx cdk diff Main
start: Building ef6a19532e27cca75df0ce382f2520b6bd909f362495631432ff1759a3f64934:current_account-current_region
success: Built ef6a19532e27cca75df0ce382f2520b6bd909f362495631432ff1759a3f64934:current_account-current_region
start: Publishing ef6a19532e27cca75df0ce382f2520b6bd909f362495631432ff1759a3f64934:current_account-current_region
success: Published ef6a19532e27cca75df0ce382f2520b6bd909f362495631432ff1759a3f64934:current_account-current_region
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Stack Main
Resources
[~] AWS::Cognito::UserPool UserPool UserPool6BA7E5F2
 └─ [+] UserPoolTier
     └─ LITE


✨  Number of stacks with differences: 1

実際にデプロイするとちゃんと機能プランが Lite に変更されました。

機能プラン導入以降、CDK モジュールアップデート以前のに作成されたユーザープールであっても特に機能プランの設定のされ方は変わらないようです。

おわりに

AWS CDK で Cognito ユーザープールの機能プラン(Tier)が設定可能になったので試してみました。

今後 Amazon Cognito ユーザープールを扱う上で機能プランの検討はほぼ必須となるので、それが早くも CDK で設定可能になったのはありがたいですね。

以上

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.