概要
AWS CDK v2.245.0では、複数のL2コンストラクトに実用的な新機能が追加されました。AutoScalingGroupにinstanceLifecyclePolicy、S3 BucketにblockedEncryptionTypes、ECR AssetsにDocker buildContexts、CloudFront Functionsの2.0ランタイムデフォルト化(フィーチャーフラグ)が注目の変更です。また、構築エラーの表示改善や、L1プロパティの変更追跡機能も追加されています。
新機能
autoscaling: AutoScalingGroupにInstance Lifecycle Policy対応 (#36434)
AWS Auto Scalingグループで、インスタンスのライフサイクルイベント時の挙動を細かく制御できるInstance Lifecycle Policyがサポートされました。終了ライフサイクルフックが失敗・タイムアウト・明示的に放棄された場合に、インスタンスを終了せずに「Retained」状態として保持し、手動調査を可能にします。
新しいインターフェース:
| インターフェース / enum | 説明 |
|---|---|
InstanceLifecyclePolicy | retentionTriggersを保持するトップレベル設定 |
RetentionTriggers | 終了ライフサイクルフック放棄時の挙動を定義 |
TerminateHookAbandonAction | RETAIN(保持) / TERMINATE(通常終了) |
使用例:
import * as autoscaling from 'aws-cdk-lib/aws-autoscaling';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
const asg = new autoscaling.AutoScalingGroup(this, 'ASG', {
vpc,
instanceType: ec2.InstanceType.of(ec2.InstanceClass.M4, ec2.InstanceSize.MICRO),
machineImage: new ec2.AmazonLinuxImage(),
// 新機能: Instance Lifecycle Policyの設定
instanceLifecyclePolicy: {
retentionTriggers: {
// 終了ライフサイクルフック放棄時の動作を指定
// RETAIN: インスタンスを「Retained」状態にして保持(手動調査が可能)
// TERMINATE: デフォルトの終了動作(指定なしと同じ)
terminateHookAbandon: autoscaling.TerminateHookAbandonAction.RETAIN,
},
},
});
Retained状態の特徴:
- Retainedインスタンスは
desired capacity(希望容量)にカウントされません TerminateInstanceInAutoScalingGroupAPIを手動で呼び出すまで保持されます- ライフサイクルフックの失敗原因を後から調査できます
cloudfront: CloudFront Functions JavaScriptランタイム2.0がデフォルトに(フィーチャーフラグ) (#35941)
CloudFront Functionsは1.0と2.0の2つのJavaScriptランタイムをサポートしていますが、2.0は1.0と後方互換性があり、一般的に2.0の使用が推奨されています。新しいフィーチャーフラグ@aws-cdk/aws-cloudfront:defaultFunctionRuntimeV2_0を有効化することで、2.0をデフォルトで使うようになります。
フィーチャーフラグの設定:
{
"context": {
"@aws-cdk/aws-cloudfront:defaultFunctionRuntimeV2_0": true
}
}
動作:
| フィーチャーフラグ | runtime指定なしの挙動 |
|---|---|
true(推奨) | cloudfront-js-2.0 がデフォルト |
false(未設定時) | cloudfront-js-1.0 がデフォルト(後方互換性のため) |
※ Key Value Storeに紐付いたFunctionは、フラグに関係なく常に2.0が使用されます(Key Value Storeが2.0必須のため)。
使用例:
import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
// フィーチャーフラグ有効時: デフォルトで JS_2_0 が使われる
new cloudfront.Function(this, 'Function', {
code: cloudfront.FunctionCode.fromInline('function handler(event) { return event.request }'),
// runtime 指定省略可(フラグ有効なら JS_2_0)
});
// 明示的に 2.0 を指定する場合
new cloudfront.Function(this, 'FunctionV2', {
code: cloudfront.FunctionCode.fromInline('function handler(event) { return event.request }'),
runtime: cloudfront.FunctionRuntime.JS_2_0,
});
// レガシー互換性のため 1.0 を明示する場合
new cloudfront.Function(this, 'FunctionV1', {
code: cloudfront.FunctionCode.fromInline('function handler(event) { return event.request }'),
runtime: cloudfront.FunctionRuntime.JS_1_0,
});
core: L1コンストラクトのプロパティ変更をソーストラッキング (#37285)
CDK_DEBUG=1環境変数を設定してsynthを実行することで、L1コンストラクトのプロパティがどこで変更されたかを追跡できるようになりました。Aspectsやescape hatchでL1プロパティを上書きしている箇所のデバッグが容易になります。
仕組み:
spec2cdkのコード生成で、L1のmutableプロパティをgetter/setterに変更- setterが呼ばれるたびに
tracePropertyユーティリティがスタックトレースをメタデータとして記録 CDK_DEBUG=1のときだけ有効化されるため、本番synthには影響なし
使用例:
# デバッグモードで synth を実行
CDK_DEBUG=1 npx cdk synth
import * as s3 from 'aws-cdk-lib/aws-s3';
const bucket = new s3.Bucket(this, 'Bucket');
const cfnBucket = bucket.node.defaultChild as s3.CfnBucket;
// このような後からの上書き操作が、CDK_DEBUG=1 時に
// スタックトレース付きでメタデータに記録される
cfnBucket.versioningConfiguration = { status: 'Enabled' };
ecr-assets: Docker --build-context対応 (#36930)
DockerImageAssetで、Dockerの--build-contextフラグを利用できるようになりました。ビルドディレクトリの外のファイルをCOPY --from=<name>で参照できるようになり、共通ライブラリの共有や特定のイメージバージョンをビルドコンテキストとして利用するユースケースに対応します。
追加されたプロパティ:
| プロパティ | 型 | デフォルト | 説明 |
|---|---|---|---|
buildContexts | { [key: string]: string } | なし | 名前付きビルドコンテキストと参照先 |
invalidation.buildContexts | boolean | true | アセットハッシュ計算時に含めるか |
コンテキストの値には、ディレクトリパス、URL、docker-image://<image>形式のイメージ参照を指定できます。
使用例:
import * as path from 'path';
import { DockerImageAsset } from 'aws-cdk-lib/aws-ecr-assets';
const asset = new DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image'),
// 新機能: 追加のビルドコンテキストを指定
buildContexts: {
mycontext: path.join(__dirname, 'path/to/context'), // 外部ディレクトリ
alpine: 'docker-image://alpine:latest', // 特定のイメージ
},
invalidation: {
buildContexts: true, // ハッシュ計算にbuildContextsを含める(デフォルト: true)
},
});
Dockerfile側での利用:
FROM node:20
COPY --from=mycontext . /shared
COPY --from=alpine /etc/os-release /tmp/
注意事項: buildContextsの値の変更は自動的にアセットハッシュを更新しますが、参照先ディレクトリ内のファイルの変更は追跡されません。変更を検知するにはextraHashにFileSystem.fingerprint()の結果を渡す必要があります。
import { FileSystem } from 'aws-cdk-lib';
const contextDir = path.join(__dirname, 'path/to/context');
const asset = new DockerImageAsset(this, 'MyBuildImage', {
directory: path.join(__dirname, 'my-image'),
buildContexts: { mycontext: contextDir },
extraHash: FileSystem.fingerprint(contextDir), // ディレクトリ内の変更を追跡
});
s3: blockedEncryptionTypesプロパティの追加 (#37047)
s3.BucketにblockedEncryptionTypesプロパティが追加され、バケットで特定の暗号化方式を明示的にブロックできるようになりました。特に、2026年4月からAmazon S3が全ての新規バケットおよび既存の一部バケットでSSE-Cをデフォルトでブロックする予定であり、それに向けた対応として重要な機能です。
追加されたプロパティと型:
| プロパティ / 型 | 説明 |
|---|---|
blockedEncryptionTypes?: BlockedEncryptionType[] | ブロックする暗号化タイプの配列(デフォルト: S3の既定に従う) |
BlockedEncryptionType.NONE | すべての暗号化タイプを許可(他の値と併用不可) |
BlockedEncryptionType.SSE_C | SSE-C(顧客提供キー暗号化)をブロック |
BlockedEncryptionType.custom(name) | CDK未対応の新しい値を指定するエスケープハッチ |
使用例:
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as cdk from 'aws-cdk-lib';
// SSE-Cをブロックする(KMS暗号化のバケット)
new s3.Bucket(this, 'KmsBucket', {
encryption: s3.BucketEncryption.KMS,
blockedEncryptionTypes: [s3.BlockedEncryptionType.SSE_C], // SSE-Cを明示的にブロック
removalPolicy: cdk.RemovalPolicy.DESTROY,
});
// デフォルト暗号化なしでSSE-Cだけをブロック
new s3.Bucket(this, 'SsecBlockedBucket', {
blockedEncryptionTypes: [s3.BlockedEncryptionType.SSE_C],
});
// すべての暗号化を許可(NONEは単独でのみ指定可能)
new s3.Bucket(this, 'AllowAllBucket', {
blockedEncryptionTypes: [s3.BlockedEncryptionType.NONE],
});
バリデーションルール:
- 空配列
[]はエラー(EmptyBlockedEncryptionTypes) NONEを他の値と併用するとエラー(ConflictingBlockedEncryptionTypes)
synthetics: CloudWatch Synthetics Canary NodeJS 3.1ランタイムのenum追加 (#37282)
CloudWatch Syntheticsの新ランタイムsyn-nodejs-3.1のenum値が追加されました。
| enum値 | ランタイム | 変更点 |
|---|---|---|
Runtime.SYNTHETICS_NODEJS_3_1 | syn-nodejs-3.1 | Canary ランタイムの namespace が @amzn/synthetics-core から @aws/synthetics-core に移行。型定義がnpmで公開 |
使用例:
import * as synthetics from 'aws-cdk-lib/aws-synthetics';
new synthetics.Canary(this, 'MyCanary', {
runtime: synthetics.Runtime.SYNTHETICS_NODEJS_3_1, // 最新のランタイム
test: synthetics.Test.custom({
code: synthetics.Code.fromInline('exports.handler = async () => {};'),
handler: 'index.handler',
}),
});
L1 CloudFormationリソース定義の更新 (#37332)
最新のAWS CloudFormationリソース仕様に基づき、L1コンストラクトが更新されました。
バグ修正
aws-cdk-lib: ToolkitがCDKアプリのエラーを認識 (#37294)
CLIがCDKアプリで発生したエラーコードを収集できるようになりました。エラーは«ErrorCode»のように特殊なマーカー(guillemets)で囲まれて出力され、CDK_ERROR_FILE環境変数で指定されたファイルに記録された正規のエラーコードのみがスキャン対象となります(顧客コンテンツを誤って収集しないための安全策)。
構築エラーの表示を改善 (#37290)
ValidationError、UnscopedValidationError、AssumptionErrorの表示が大幅に改善されました。
改善点:
- 構築パスがない場合の
at path [undefined]表示の除去 - 複数行エラーメッセージの重複表示を修正
- ミニファイされたCDKライブラリコードの行内容を非表示(「Just My Code」スタイル)
- 構築パスをツリー形式で視覚的に表示
- S3バケット名バリデーションエラーをスコープ付きエラーに変更
改善後の表示例:
InvalidBucketNameValue: Invalid S3 bucket name (value: &*&*$)
Bucket name must only contain lowercase characters and the symbols, period (.) and dash (-) (offset: 0)
at validateBucketName (/.../aws-s3/lib/bucket.ts:1003)
at new Bucket (/.../aws-s3/lib/bucket.ts:1046)
at <anonymous> (/.../integ.error.ts:10)
...node internals...
Relates to construct:
<.> (constructs.Construct)
└─ SomeStack (constructs.Construct)
└─ TargetBucket (constructs.Construct)
eks: 分離サブネットでkubectl Lambdaが配置される問題を修正 (#37217)
PRIVATE_ISOLATEDサブネットのみを持つVPCにeks.FargateCluster(またはcoreDnsComputeType: FARGATE)を作成し、プライベートエンドポイントアクセスを有効化した場合、kubectl LambdaがEKS API・STS等のAWSサービスに到達できず、15分のタイムアウト後にCloudFormationデプロイが失敗していました。
これがsynth時のハードエラーに変更され、すぐに原因がわかるようになりました。
修正後の正しい使い方:
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as eks from 'aws-cdk-lib/aws-eks';
// オプション1: PRIVATE_WITH_EGRESS サブネット(NAT Gateway経由でエグレス可能)
const vpc = new ec2.Vpc(this, 'Vpc', {
subnetConfiguration: [
{ name: 'Public', subnetType: ec2.SubnetType.PUBLIC },
{ name: 'PrivateEgress', subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS },
],
});
new eks.FargateCluster(this, 'Cluster', {
version: eks.KubernetesVersion.V1_30,
vpc,
// kubectl Lambda を PRIVATE_WITH_EGRESS に配置(デフォルト動作)
});
// オプション2: VPCエンドポイントを使用すればPRIVATE_ISOLATEDでも可能
// STS / EKS / ECR 等のVPCエンドポイントが必要
synth時のエラー例(修正後):
Error: The kubectl Lambda cannot be placed in PRIVATE_ISOLATED subnets.
Use PRIVATE_WITH_EGRESS subnets with a NAT Gateway, or configure VPC endpoints
for STS, EKS, and ECR.
lambda: addPermission()警告メッセージのタイポ修正 (#37365)
Lambda関数のaddPermission()で出力される警告メッセージのタイポが修正されました。
lambda-nodejs: ローカルバンドリングで直接spawnを使用 (#37292)
aws-lambda-nodejsのローカルバンドリングで、シェル経由のspawnSync("bash", ["-c", command])ではなく、配列引数による直接spawnSync呼び出しに変更されました。シェル文字列のエスケープ問題を避け、ユーザー入力のサニタイゼーション不足による問題を回避します。
PackageManager.runBinCommand()の返り値がstringからstring[]に変更BundlingStep判別ユニオン型の導入(shell/spawn/fs)commandHooksは従来通りシェル経由(ユーザー提供契約のため)
mixin: Stackでmixinメタデータが子コンストラクトに伝搬しない問題を修正 (#37269)
Stackにwithでmixinを適用した際、子コンストラクトにmixinメタデータが設定されない問題が修正されました。Stackが内部的にapplyToを直接使用していたところを、メタデータを正しく追加するwithMixinsを使うように変更されました。
rds: enablePerformanceInsights: falseが他のPI関連プロパティ指定時に無視される問題を修正 (#37287)
DatabaseInstanceFromSnapshot(および他のDatabaseInstanceNewサブクラス)で、enablePerformanceInsights: falseを明示指定しても、他のPerformance Insightsプロパティ(performanceInsightRetention等)が設定されていると無視される問題が修正されました。内部の判定ロジックが||から??に変更され、明示的なfalseが尊重されます。
修正後の正しい使い方:
import * as rds from 'aws-cdk-lib/aws-rds';
const instance = new rds.DatabaseInstanceFromSnapshot(this, 'Instance', {
engine: rds.DatabaseInstanceEngine.postgres({
version: rds.PostgresEngineVersion.VER_16,
}),
snapshotIdentifier: 'my-snapshot',
vpc,
// 明示的に false を指定すれば、他のPIプロパティがあっても無効化される
enablePerformanceInsights: false,
// 以下のプロパティは enablePerformanceInsights: false なら無視される
performanceInsightRetention: rds.PerformanceInsightRetention.DEFAULT,
});
spec2cdk: 未登録の大文字prefix検出時にエラーをthrow (#37283)
CloudFormationイベントパターンのメソッド名生成時、未登録の大文字prefix(新しいサービス略語など)を検出すると、従来は警告ログのみ出力していましたが、これをthrowに変更。kMSCMKDeletionPatternのような誤った命名を防ぎ、新しいprefixの明示的なレビューを強制します。
Alphaモジュール (2.245.0-alpha.0)
s3tables-alpha: Iceberg パーティション仕様・ソート順・テーブルプロパティに対応 (#36811)
Tableコンストラクトに、Icebergのパーティション仕様、ソート順、テーブルプロパティ、スキーマフィールドID等の設定が追加されました。クエリパフォーマンスとデータ編成の最適化に不可欠な機能です。
追加されたインターフェース:
| インターフェース | 説明 |
|---|---|
IcebergPartitionField | パーティションカラムの定義(sourceId, transform, name, fieldId?) |
IcebergPartitionSpec | パーティション仕様(fields, specId?) |
IcebergSortField | ソートフィールド(sourceId, transform, direction, nullOrder) |
IcebergSortOrder | ソート順(fields, orderId?) |
TablePropertyEntry | テーブルプロパティのキー/値ペア |
使用例(シンプルなパーティション付きテーブル):
import { Table, OpenTableFormat, IcebergTransform } from '@aws-cdk/aws-s3tables-alpha';
const partitionedTable = new Table(this, 'PartitionedTable', {
tableName: 'partitioned_table',
namespace,
openTableFormat: OpenTableFormat.ICEBERG,
icebergMetadata: {
icebergSchema: {
schemaFieldList: [
{ name: 'event_date', type: 'date', required: true },
{ name: 'event_name', type: 'string' },
],
},
// 新機能: パーティション仕様
icebergPartitionSpec: {
fields: [
{
sourceId: 1, // スキーマのソースフィールドID
transform: IcebergTransform.IDENTITY, // 変換関数(IDENTITY/bucket/trunc等)
name: 'date_partition', // パーティションフィールド名
// fieldId: 省略時はS3 Tablesが自動割当(1000から)
},
],
// specId: 省略時は 0
},
},
});
使用例(パーティション + ソート順 + テーブルプロパティ):
import { Table, OpenTableFormat, IcebergTransform, SortDirection, NullOrder } from '@aws-cdk/aws-s3tables-alpha';
const advancedTable = new Table(this, 'AdvancedTable', {
tableName: 'advanced_table',
namespace,
openTableFormat: OpenTableFormat.ICEBERG,
icebergMetadata: {
icebergSchema: {
schemaFieldList: [
{ id: 1, name: 'event_date', type: 'date', required: true }, // 新機能: idの明示指定
{ id: 2, name: 'user_id', type: 'string', required: true },
],
},
icebergPartitionSpec: {
specId: 0,
fields: [
{
sourceId: 1,
transform: IcebergTransform.IDENTITY,
name: 'date_partition',
fieldId: 1000,
},
],
},
// 新機能: ソート順
icebergSortOrder: {
orderId: 1,
fields: [
{
sourceId: 2,
transform: IcebergTransform.IDENTITY,
direction: SortDirection.ASC, // ASC / DESC
nullOrder: NullOrder.NULLS_FIRST, // NULLS_FIRST / NULLS_LAST
},
],
},
// 新機能: テーブルプロパティ(任意のキー/値)
tableProperties: [
{ key: 'write.format.default', value: 'parquet' },
],
},
});
バリデーション追加: withoutMetadataとicebergMetadataの同時指定時にエラー(MutuallyExclusiveProps)。
s3tables-alpha: TableBucketにメトリクス設定対応 (#37275)
TableBucketでCloudWatchリクエストメトリクスの有効/無効を設定できるようになりました。
追加されたプロパティ:
| プロパティ | 型 | デフォルト |
|---|---|---|
requestMetricsStatus | RequestMetricsStatus | メトリクス無効 |
RequestMetricsStatus.ENABLED | - | 有効化 |
RequestMetricsStatus.DISABLED | - | 明示的に無効化 |
使用例:
import { TableBucket, RequestMetricsStatus } from '@aws-cdk/aws-s3tables-alpha';
const tableBucketWithMetrics = new TableBucket(this, 'TableBucketWithMetrics', {
tableBucketName: 'metrics-enabled-bucket',
// 新機能: CloudWatchリクエストメトリクスを有効化
requestMetricsStatus: RequestMetricsStatus.ENABLED,
});
s3tables-alpha: TableBucketとTableがITaggableV2を実装 (#37277)
TableBucketとTableのL2コンストラクトが正式にITaggableV2を実装するようになりました。これにより、Tags.of()を使ったタグ付けがCDKコンストラクトとして明示的に認識されるようになります(L1レベルではもともとタグ伝搬は動作していましたが、L2としての型情報が欠けていました)。
使用例:
import { Tags } from 'aws-cdk-lib';
import { TableBucket, Table } from '@aws-cdk/aws-s3tables-alpha';
// 個別のコンストラクトにタグを付与
Tags.of(tableBucket).add('Environment', 'Production');
Tags.of(table).add('Team', 'DataEngineering');
// スタックレベルのタグは全リソースに伝搬
Tags.of(stack).add('Project', 'DataLake');
まとめ
AWS CDK v2.245.0は、複数のL2コンストラクトへの実用的な機能追加と、開発者体験の改善が特徴のリリースです。
主なポイント:
- AutoScaling Instance Lifecycle Policy: インスタンス終了ライフサイクルフック放棄時の挙動を制御可能に
- S3
blockedEncryptionTypes: 2026年4月のSSE-Cデフォルトブロックに向けた対応機能 - ECR Assets
buildContexts: Docker--build-context対応で外部ディレクトリの参照が可能に - CloudFront Functions 2.0デフォルト化(フィーチャーフラグ): 新規プロジェクトでは有効化を推奨
- EKS検証強化: 分離サブネットでの無限タイムアウトを、synth時のハードエラーに変更
- エラー表示の改善: 構築エラーが読みやすくなり、デバッグが容易に
- L1プロパティソーストラッキング:
CDK_DEBUG=1で変更箇所を追跡可能
アップグレード時の注意:
- CloudFront Functionsを使用している場合、フィーチャーフラグ
@aws-cdk/aws-cloudfront:defaultFunctionRuntimeV2_0の有効化を検討してください - S3バケットを作成している場合、
blockedEncryptionTypes設定を確認しておくと、2026年4月以降の挙動変更に備えられます - EKSで
PRIVATE_ISOLATEDサブネットのみを使用している場合、synth時にエラーになるため、PRIVATE_WITH_EGRESSへの切り替えかVPCエンドポイントの設定が必要です