概要
AWS CDK v2.251.0では、policyValidationBeta1が正式版policyValidationに昇格し、新しいValidationsクラスが追加されました。Lambdaのruby 4.0ランタイム、ECS Service Connectのアクセスログ、Route53 パブリックホストゾーンの高速リカバリ、Syntheticsのキャナリーグループなど実用的な新機能が多数追加されています。Alphaモジュールではついに @aws-cdk/aws-dsql-alpha(Aurora DSQL)のL2コンストラクトが初登場し、Bedrock AgentCoreにはCedarポリシーや観測性機能が追加されました。
破壊的変更
L1リソースがCloudFormationリソーススキーマに合わせて自動更新された結果、aws-elasticloadbalancing(Classic Load Balancer)で以下の型が削除されています。
AWS::ElasticLoadBalancing::LoadBalancerのSourceSecurityGroup属性PolicyItem型SourceSecurityGroup型
Classic Load Balancer(CLB)を直接利用している場合のみ影響します。CLBを使い続けているユーザーはALB/NLBへの移行を検討するのが良いタイミングかもしれません。
新機能
lambda: Ruby 4.0 ランタイムのサポート (#37650)
近日リリース予定のAWS Lambda Ruby 4.0ランタイムが Runtime.RUBY_4_0 として追加されました。
import * as lambda from 'aws-cdk-lib/aws-lambda';
new lambda.Function(this, 'RubyFunction', {
runtime: lambda.Runtime.RUBY_4_0, // 新規追加: Ruby 4.0 ランタイム
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
});
core: 新しい Validations クラスで検証プラグインを登録 (#37611)
ポリシー検証プラグインを登録するための新しいAPIとして Validations クラスが追加されました。これまでは AppProps の policyValidationBeta1 プロパティでしか指定できませんでしたが、今後はアスペクトのように Validations.of(app).addPlugin() で任意のタイミングでプラグインを追加できます。
import { App, Validations } from 'aws-cdk-lib';
import { CfnGuardValidator } from '@cdklabs/cdk-validator-cfnguard';
const app = new App();
// 新API: AppのスコープにValidationプラグインを追加
Validations.of(app).addPlugin(new CfnGuardValidator({
rules: ['my-rule-set'],
}));
core: policyValidationBeta1 インターフェースを policyValidation に昇格 (#37613)
IPolicyValidationPluginBeta1 / IPolicyValidationContextBeta1 などベータ版のインターフェース群が、beta1 サフィックスを外した正式版として提供されるようになりました。既存のBeta1インターフェースは非推奨(deprecated)扱いとなり、引き続き動作しますが、新規実装では正式版の利用が推奨されます。
// 非推奨(動作はする)
import { IPolicyValidationPluginBeta1 } from 'aws-cdk-lib';
// 推奨: 正式版
import { IPolicyValidationPlugin } from 'aws-cdk-lib';
なお、AppProps.policyValidationBeta1 の入り口は引き続き IPolicyValidationPluginBeta1 を期待する互換API(これは後続リリースで整理予定)です。新規コードは上記の Validations.of(app).addPlugin() を使うのが将来的にも安心です。
ecs: Service Connect のアクセスログ設定に対応 (#36067)
ECS Service Connectにアクセスログの出力設定が追加されました。ServiceConnectProps に accessLogConfiguration プロパティが新設されています。
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as logs from 'aws-cdk-lib/aws-logs';
const logGroup = new logs.LogGroup(this, 'ServiceConnectLogs');
new ecs.FargateService(this, 'Service', {
cluster,
taskDefinition,
serviceConnectConfiguration: {
namespace: 'my-namespace',
services: [
{
portMappingName: 'api',
dnsName: 'api',
port: 80,
},
],
// 新機能: Service Connect プロキシのアクセスログ設定
accessLogConfiguration: {
logDriver: ecs.LogDrivers.awsLogs({
streamPrefix: 'service-connect',
logGroup,
}),
// ログフォーマット(JSON形式 または テキスト形式)
format: ecs.ServiceConnectAccessLogFormat.JSON,
},
},
});
ServiceConnectAccessLogFormat には JSON と TEXT の2種類が定義されており、用途に応じて選択できます。
route53: パブリックホストゾーンでAccelerated Recoveryを有効化 (#36358)
Route53のパブリックホストゾーンで Accelerated Recovery をCDKから有効化できるようになりました。PublicHostedZoneProps に enableAcceleratedRecovery が追加されています。
import * as route53 from 'aws-cdk-lib/aws-route53';
new route53.PublicHostedZone(this, 'HostedZone', {
zoneName: 'example.com',
// 新機能: Accelerated Recoveryを有効化(デフォルト: false)
enableAcceleratedRecovery: true,
});
大規模障害時のフェイルオーバー所要時間を短縮したいDNSワークロードで有効です。
synthetics: Canary Group をサポート (#35689)
CloudWatch Syntheticsの Canary Group が新しいL2コンストラクト synthetics.Group として利用できるようになりました。複数のキャナリーをまとめて管理したり、グループ単位でCloudWatchメトリクスを集計したりする用途で便利です。
import * as synthetics from 'aws-cdk-lib/aws-synthetics';
// 新しいL2: キャナリーグループの作成
const group = new synthetics.Group(this, 'MyGroup', {
groupName: 'my-canary-group', // グループ名(省略時は自動生成)
});
const canary = new synthetics.Canary(this, 'MyCanary', {
schedule: synthetics.Schedule.rate(Duration.minutes(5)),
test: synthetics.Test.custom({
code: synthetics.Code.fromAsset('canary'),
handler: 'index.handler',
}),
runtime: synthetics.Runtime.SYNTHETICS_NODEJS_PUPPETEER_9_1,
});
// キャナリーをグループに関連付け
group.addCanary(canary);
既存のグループをインポートする場合は Group.fromGroupName() を利用できます。
その他: L1 リソース定義の更新 (#37684, #37644)
CloudFormationリソーススキーマに追随するL1定義の自動更新です。冒頭の破壊的変更はこの更新の一部として取り込まれています。
バグ修正
core: Stage.policyValidationBeta1 が意図せず書き換え可能だった (#37612)
App.policyValidationBeta1 は本来 AppProps で設定する唯一の入り口のはずでしたが、公開された配列に対して push で追加できてしまう状態でした。内部的に private プロパティとgetterに変更され、想定外のミューテーションを防止しています。
// 非推奨(動作しなくなる)
const app = new App();
app.policyValidationBeta1.push(new CfnGuardValidator()); // 今後はNG
// 推奨: AppPropsで渡すか、新APIを使う
const app2 = new App({
policyValidationBeta1: [new CfnGuardValidator()],
});
// もしくは
Validations.of(app2).addPlugin(new CfnGuardValidator());
core: ポリシー検証時に cdk synth の標準出力が有効なYAMLにならない (#37597)
単一スタックに対して cdk synth > template.yml でテンプレートを保存しようとした際、ポリシー検証ログがstdoutに混入してYAMLとして無効になる問題を修正しました。検証ログはstderrに送られるようになり、リダイレクトしたテンプレートはそのまま利用可能です。
# 修正後: stdoutは純粋なYAMLテンプレートのみ
cdk synth MyStack > template.yml
# 検証ログは必要に応じてstderrから取得
cdk synth MyStack 2> validation.log > template.yml
core: Construct作成時のスタックトレースが暗黙的だった (#37643)
これまでConstruct生成時のスタックトレースは aws:cdk:logicalId メタデータに紐付く形で暗黙的に保存されていました。今回の修正で、Construct生成時のスタックトレースを aws:cdk:creationStack として明示的に保存するようになり、“Just My Code” 機能(CDKライブラリ自身のフレームを除外する機能)も効くようになります。トラブルシュート時のスタックトレースが読みやすくなります。
core: --debug モードでTokenのスタックトレース収集が重い (#37642)
CDK_DEBUG=1 時に1万個以上作られることもあるTokenごとにスタックトレースを収集しており、デバッグモードの実行が著しく遅くなっていました。Tokenのスタックトレース収集を非推奨化・無効化し、デバッグモードの速度を大きく改善しています。通常実行も若干高速化します。
core: tree.json のメタデータに論理IDが含まれていなかった (#37630)
cdk.out/tree.json のL1情報にリソースタイプやプロパティは含まれていたものの、論理IDが欠落していた問題を修正しました。tree.jsonを解析するツールが論理IDベースでCloudFormationテンプレートと突き合わせられるようになります。
ec2: eu-isoe-west-1 リージョンのVPCエンドポイントが誤っていた (#37596)
隔離リージョン eu-isoe-west-1 (UK Europe ADC-E)ではエンドポイント名のプレフィックスが uk.adc-e.cloud である必要がありますが、CDKは常に com.amazonaws を生成していたため、VPCエンドポイント作成がCloudFormationで失敗していました。以下のサービスで正しいプレフィックスが付与されるようになります。
uk.adc-e.cloud.eu-isoe-west-1.ebsuk.adc-e.cloud.eu-isoe-west-1.ecr.apiuk.adc-e.cloud.eu-isoe-west-1.ecr.dkruk.adc-e.cloud.eu-isoe-west-1.execute-api
events-targets: LogGroupTargetInput のJSII互換性修正 (#37451)
LogGroupTargetInput.fromObjectV2() は戻り値が FieldAwareEventInput と型付けされており、TypeScriptでは構造的型付けで通っていたものの、PythonやJavaなどJSII経由の言語ではnominal型チェックにより TypeError が発生していました。修正後は LogGroupTargetInput が RuleTargetInput を正しく継承し、Python/Javaでも fromObjectV2() を使えるようになります。
// PythonやJavaでも動作するようになった
new events.Rule(this, 'Rule', {
eventPattern: { source: ['aws.ec2'] },
targets: [
new targets.CloudWatchLogGroup(logGroup, {
logEvent: targets.LogGroupTargetInput.fromObjectV2({
timestamp: events.EventField.fromPath('$.time'),
message: events.EventField.fromPath('$.detail'),
}),
}),
],
});
なお、副作用として非推奨の LogGroupTargetInput.fromObject() の options 引数が必須(従来はオプショナル)になる破壊的変更が含まれます。非推奨APIなので新しい fromObjectV2() への移行が推奨されます。
lambda: provisionedPollerConfig のTokenバリデーションを修正 (#37197)
EventSourceMapping や StreamEventSource の provisionedPollerConfig.minimumPollers / maximumPollers に CfnParameter や Lazy.number() などの未解決Tokenを渡すと、合成時にバリデーションエラーが出ていた問題を修正。Token.isUnresolved() ガードが入り、すでに maxConcurrency や tumblingWindow で使われているパターンに合わせられました。
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as sources from 'aws-cdk-lib/aws-lambda-event-sources';
const minPollers = new CfnParameter(this, 'MinPollers', { type: 'Number' });
new lambda.EventSourceMapping(this, 'Mapping', {
target: fn,
eventSourceArn: stream.streamArn,
// CfnParameterを渡しても合成時エラーにならない
provisionedPollerConfig: {
minimumPollers: minPollers.valueAsNumber,
maximumPollers: 10,
},
});
stepfunctions-tasks: CallAwsServiceCrossRegion の endpoint が state input から解決される場合に警告 (#37646)
CallAwsServiceCrossRegion の endpoint に JsonPath.stringAt('$.endpoint') などの実行時解決式を渡すと、ステートマシン実行開始時に攻撃者が任意のエンドポイントを差し込める可能性がある(認証済みリクエストをリレーされる)というセキュリティ上の懸念に対し、cdk synth 時に警告が出るようになりました。
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';
import { Annotations } from 'aws-cdk-lib';
const task = new tasks.CallAwsServiceCrossRegion(this, 'CallS3', {
service: 's3',
action: 'listBuckets',
region: 'us-east-1',
endpoint: sfn.JsonPath.stringAt('$.endpoint'), // 警告対象
iamResources: ['*'],
});
// 意図的に使用している場合は警告を抑制できる
Annotations.of(task).acknowledgeWarning(
'@aws-cdk/aws-stepfunctions-tasks:crossRegionEndpointSsrfRisk',
);
実行を開始できるプリンシパルを完全に信頼している場合のみ、明示的に acknowledgeWarning で抑制してください。
Alphaモジュール (2.251.0-alpha.0)
dsql-alpha: Aurora DSQL の初期L2コンストラクト (#34599)
Amazon Aurora DSQL向けに新しいalphaモジュール @aws-cdk/aws-dsql-alpha が追加されました。DSQLクラスターのL2コンストラクトが初登場です。
import * as dsql from '@aws-cdk/aws-dsql-alpha';
// 単一リージョンのDSQLクラスター
const cluster = new dsql.Cluster(this, 'DsqlCluster', {
deletionProtectionEnabled: true, // 削除保護
});
bedrock-agentcore-alpha: Policy と PolicyEngine のL2コンストラクト (#37238)
Amazon Bedrock AgentCoreのCedarベース認可ポリシーをCDKから扱うためのL2コンストラクト Policy と PolicyEngine が追加されました。
import * as agentcore from '@aws-cdk/aws-bedrock-agentcore-alpha';
import * as kms from 'aws-cdk-lib/aws-kms';
// ポリシーエンジン
const engine = new agentcore.PolicyEngine(this, 'Engine', {
description: 'Authorization engine for MyAgent',
encryptionKey: new kms.Key(this, 'EngineKey'),
});
// Raw Cedar式でポリシーを定義
const rawPolicy = new agentcore.Policy(this, 'RawPolicy', {
policyEngine: engine,
definition: `
permit(principal, action, resource)
when { principal.department == "engineering" };
`,
// バリデーションモード: FAIL_ON_ANY_FINDINGS(デフォルト) or IGNORE_ALL_FINDINGS
validationMode: agentcore.PolicyValidationMode.FAIL_ON_ANY_FINDINGS,
});
// 型安全なPolicyStatement Builder経由(Cedar言語に不慣れな人向け)
const statement = new agentcore.PolicyStatement({
effect: agentcore.PolicyEffect.PERMIT,
// principal / action / resource の条件を構造化して定義
});
engine.addPolicy('TypedPolicy', { statements: [statement] });
// 付与できる権限
engine.grantRead(role); // bedrock-agentcore:GetPolicyEngine
engine.grantEvaluate(role); // AuthorizeAction / PartiallyAuthorizeActions
rawPolicy.grantRead(role); // bedrock-agentcore:GetPolicy
Cedar言語に不慣れなユーザーでも、PolicyStatement ビルダーを利用してフォーム的にポリシーを組み立てられます。
bedrock-agentcore-alpha: Runtimeの観測性(Observability)設定 (#36689)
Bedrock AgentCore Runtime に X-Rayトレーシングとログ配信の設定が追加されました。
import * as agentcore from '@aws-cdk/aws-bedrock-agentcore-alpha';
import * as logs from 'aws-cdk-lib/aws-logs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as firehose from 'aws-cdk-lib/aws-kinesisfirehose';
const logGroup = new logs.LogGroup(this, 'AgentLogs');
const bucket = new s3.Bucket(this, 'UsageLogsBucket');
new agentcore.Runtime(this, 'Runtime', {
// ...既存プロパティ
// 新機能: X-Rayトレーシングを有効化
tracingEnabled: true,
// 新機能: ログ配信の設定
loggingConfigs: [
{
logType: agentcore.LogType.APPLICATION_LOGS, // アプリケーションログ
destination: agentcore.LoggingDestination.cloudWatchLogs(logGroup),
},
{
logType: agentcore.LogType.USAGE_LOGS, // 利用状況ログ
destination: agentcore.LoggingDestination.s3(bucket),
},
// Kinesis Data Firehoseへの配信も可能
// destination: agentcore.LoggingDestination.firehose(deliveryStream),
],
});
IAMポリシーは各送信先に応じて delivery.logs.amazonaws.com に対して自動的に設定され、aws:SourceAccount / aws:SourceArn によるスコープ制限も自動付与されます。
bedrock-agentcore-alpha: AgentCore Gateway のNo Authorizationをサポート (#36610)
GatewayAuthorizerType に NONE が追加され、Gateway自体の認証を無効化できるようになりました。パブリックMCPサーバーの構築や、Gateway Interceptorsを使ったツール実行レベルの認証に委ねるケースで有用です。
import * as agentcore from '@aws-cdk/aws-bedrock-agentcore-alpha';
new agentcore.Gateway(this, 'Gateway', {
// ...
authorizerType: agentcore.GatewayAuthorizerType.NONE, // 認証なし
});
まとめ
AWS CDK v2.251.0は coreのValidations API刷新、複数L2の新機能追加、Alphaモジュールの大幅拡充 が揃った、盛りだくさんなリリースです。
主なポイント:
- core:
Validations.of(app).addPlugin()が新しい推奨APIに。policyValidationBeta1は非推奨化(互換性は維持) - lambda: Ruby 4.0ランタイムに対応(Lambda側のリリースに合わせて使用可能)
- ecs / route53 / synthetics: Service Connectアクセスログ、Accelerated Recovery、Canary Groupなど実運用でよく求められていた機能が追加
- Alpha: Aurora DSQLのL2が初登場、Bedrock AgentCoreにCedarポリシー・Observability・No Auth Gatewayが追加
- バグ修正:
cdk synthのYAML出力、tree.jsonの論理ID欠落、CallAwsServiceCrossRegionのSSRF警告など、日常的に刺さりやすい問題が修正
アップグレード時の注意:
- Classic Load Balancer (
aws-elasticloadbalancing) のSourceSecurityGroup属性を参照しているコードは、L1定義更新の破壊的変更の影響を受けます events-targetsのLogGroupTargetInput.fromObject()を使っている場合、非推奨APIであるもののoptions引数が必須化される点に注意- ポリシー検証プラグインを使っている場合は、
Validationsクラスへの移行を検討してください