概要
このリリースでは、Validations クラスに警告・エラー追加とその承認機能が追加され、CDK Nag などのバリデーションツールとの統一的な API が提供されます。また、デバッグ時にプロパティの変更箇所を正確に追跡できる Box API が導入されました。バグ修正として、マルチバケットスタックで S3 通知を削除する際のレースコンディションが解消されています。
リリース: v2.252.0
新機能
Validations クラスの addWarning、addError、acknowledge メソッド追加 (#37668)
この機能でできること:
Validationsクラスを通じて、警告やエラーを統一された API で追加できるようになりました。また、acknowledgeメソッドで特定のバリデーションルールを承認(抑制)できます。
使用例:
import { Stack, StackProps, Validations } from 'aws-cdk-lib';
import { Construct } from 'constructs';
class MyConstruct extends Construct {
constructor(scope: Construct, id: string) {
super(scope, id);
// バリデーションの取得
const validations = Validations.of(this);
// 警告の追加(ID は annotation:: プレフィックスが自動付与される)
validations.addWarning('DeprecatedProperty', 'This property is deprecated and will be removed in v3');
// エラーの追加
validations.addError('MissingRequiredConfig', 'You must specify either "vpcId" or "vpc"');
// 特定のバリデーションルールの承認(抑制)
// CDK Nag などのツールで検出されたルールを明示的に承認する場合
validations.acknowledge({
id: 'cdknag::AwsSolutions-IAM4',
reason: 'Using managed policies is acceptable for this demo application',
});
// 複数のルールを一度に承認
validations.acknowledge(
{ id: 'cdknag::AwsSolutions-S1', reason: 'Access logging not required for temp bucket' },
{ id: 'annotation::DeprecatedProperty', reason: 'Migration planned for Q3' },
);
}
}
ポイント:
- ID は
::区切りでプレフィックスとルール名を指定します(例:cdknag::RuleName) - プレフィックスなしの ID には自動的に
annotation::が付与されます - 承認情報はコンストラクトのメタデータに記録され、監査証跡として利用できます
- CDK Nag との統合により、バリデーションの抑制を一元管理できます
デバッグ用 Box API の追加 (#37604)
この機能でできること:
CDK_DEBUG環境変数を有効にすると、CloudFormation プロパティの値がどのユーザーコードで設定されたかを正確に追跡できるようになりました。Lazyの代わりにBoxAPI を使用することで、スタックトレースが L2 コンストラクト内部ではなく、実際の設定コードを指すようになります。
使用例:
// CDK_DEBUG=true で実行すると、aws:cdk:propertyAssignment メタデータに
// プロパティがどの行で設定されたかが記録されます
import { Stack, App } from 'aws-cdk-lib';
import { Bucket } from 'aws-cdk-lib/aws-s3';
const app = new App();
const stack = new Stack(app, 'MyStack');
const bucket = new Bucket(stack, 'MyBucket', {
versioned: true, // この行がスタックトレースに記録される
});
// 後から設定を追加した場合も追跡可能
bucket.addLifecycleRule({ // この行も記録される
expiration: Duration.days(30),
});
ポイント:
CDK_DEBUG=true cdk synthで実行するとメタデータが生成されます- 22 のサービスモジュールにわたる 41 の L2 コンストラクトが
BoxAPI に移行されました - 内部実装の変更のため、通常の使用方法に変更はありません
- デバッグ時に「このプロパティはどこで設定された?」という疑問を解決できます
バグ修正
aws-cdk-lib を bundledDependency として使用できない問題の修正 (#37726)
- NPM のバグにより、依存関係ツリー内で同じパッケージが複数回バンドルされている場合、そのパッケージ自体を bundledDependency として使用できない問題がありました
aws-cdk-libがjsonschemaとsemverを直接バンドルし、さらに@aws-cdk/cloud-assembly-api経由でも同じパッケージをバンドルしていたことが原因でした- ネストされた bundledDependency を削除することで、
aws-cdk-libを bundledDependency として使用できるようになりました
S3 通知削除時のレースコンディションの解消 (#37708)
- マルチバケットスタックでバケット通知を削除する際、IAM ポリシーの更新がカスタムリソースのクリーンアップより先に実行され、
AccessDeniedエラーが発生する問題がありました - 原因は
DependsOnが作成・削除の順序のみを制御し、更新の順序は制御しないことでした - 共有の
DefaultPolicyではなく、バケットごとに専用の IAM ポリシーを作成することで、削除時の順序が正しく制御されるようになりました
修正後の動作:
// 以前は複数のバケット通知が1つの DefaultPolicy を共有していたため、
// 1つのバケットを削除すると残りのバケットの通知設定も影響を受ける可能性がありました。
// 修正後は各バケット通知に専用のポリシーが作成され、
// 個別の削除が他のバケットに影響しなくなりました。
import { Bucket } from 'aws-cdk-lib/aws-s3';
import { LambdaDestination } from 'aws-cdk-lib/aws-s3-notifications';
const bucket1 = new Bucket(stack, 'Bucket1');
const bucket2 = new Bucket(stack, 'Bucket2');
// 各バケットに通知を設定
bucket1.addEventNotification(EventType.OBJECT_CREATED, new LambdaDestination(fn));
bucket2.addEventNotification(EventType.OBJECT_CREATED, new LambdaDestination(fn));
// bucket1 の通知を削除しても bucket2 には影響しない
まとめ
このリリースでは、Validations クラスの機能強化による CDK バリデーションの統一 API 提供と、デバッグ時のプロパティ追跡を改善する Box API が追加されました。また、S3 通知のレースコンディション修正により、マルチバケット環境での安定性が向上しています。