概要
AWS CDK v2.236.0では、ECSサービスのLinear/Canaryデプロイメント戦略のサポート、ManagedInstancesCapacityProviderでのSpotインスタンスサポート、CloudWatch Logsの削除保護設定など、複数の重要な新機能が追加されました。また、Alphaモジュールでは、Bedrock AgentCoreにEpisodic Memory StrategyとGateway Interceptorsが追加されています。
新機能
ECS: Linear/Canaryデプロイメント戦略のサポート (#35981)
ECSサービスに組み込みのLinear(段階的)およびCanary(カナリア)デプロイメント戦略が追加されました。これにより、本番環境への段階的かつ制御されたデプロイが可能になります。
Linearデプロイメント
指定した間隔で一定の割合ずつトラフィックを新しいバージョンに移行します。
import * as ecs from 'aws-cdk-lib/aws-ecs';
declare const cluster: ecs.Cluster;
declare const taskDefinition: ecs.FargateTaskDefinition;
const service = new ecs.FargateService(this, 'FargateService', {
cluster,
taskDefinition,
// Linearデプロイメント戦略の設定
deploymentStrategy: ecs.DeploymentStrategy.LINEAR,
linearConfiguration: {
linearPercent: 10, // 各ステップで移行するトラフィックの割合(%)
linearInterval: 1, // ステップ間の間隔(分)
},
});
Canaryデプロイメント
最初に少量のトラフィックを新しいバージョンに移行し、問題がなければ残りのトラフィックを一度に移行します。
import * as ecs from 'aws-cdk-lib/aws-ecs';
declare const cluster: ecs.Cluster;
declare const taskDefinition: ecs.FargateTaskDefinition;
const service = new ecs.FargateService(this, 'FargateService', {
cluster,
taskDefinition,
// Canaryデプロイメント戦略の設定
deploymentStrategy: ecs.DeploymentStrategy.CANARY,
canaryConfiguration: {
canaryPercent: 10, // 最初のステップで移行するトラフィックの割合(%)
canaryInterval: 5, // 残りのトラフィックを移行するまでの待機時間(分)
},
});
ECS: ManagedInstancesCapacityProviderでSpotインスタンスをサポート (#36497)
ManagedInstancesCapacityProviderにcapacityOptionTypeプロパティが追加され、EC2インスタンスの購入オプションとしてSpotインスタンスを選択できるようになりました。
import * as ecs from 'aws-cdk-lib/aws-ecs';
declare const cluster: ecs.Cluster;
declare const autoScalingGroup: autoscaling.AutoScalingGroup;
const capacityProvider = new ecs.ManagedInstancesCapacityProvider(this, 'ManagedInstancesCapacity', {
autoScalingGroup,
// EC2インスタンスの購入オプション
capacityOptionType: ecs.CapacityOptionType.SPOT, // ON_DEMAND(デフォルト)またはSPOT
});
cluster.addCapacityProvider(capacityProvider);
capacityOptionTypeの設定オプション
| 値 | 説明 |
|---|---|
ON_DEMAND | オンデマンドインスタンスを使用(デフォルト) |
SPOT | Spotインスタンスを使用(コスト削減に有効) |
この値を変更するとCapacity Providerが置き換えられます。
CloudWatch Logs: 削除保護の設定サポート (#36583)
CloudWatch Logsのロググループに削除保護を設定できるようになりました。これにより、重要なロググループが誤って削除されることを防ぐことができます。
import * as logs from 'aws-cdk-lib/aws-logs';
const logGroup = new logs.LogGroup(this, 'MyLogGroup', {
logGroupName: '/aws/lambda/my-function',
retention: logs.RetentionDays.ONE_MONTH,
// 削除保護の設定
deletionProtectionEnabled: true, // trueで削除保護を有効化
});
削除保護が有効な場合、ロググループを削除する前に明示的に削除保護を無効化する必要があります。
バグ修正
API Gateway V2: fromDomainNameAttributesでインポートしたドメイン名の参照を修正 (#36710)
DomainName.fromDomainNameAttributes()でインポートしたカスタムドメイン名が、リージョナルドメイン名ではなくカスタムドメイン名を正しく使用するように修正されました。
import * as apigwv2 from 'aws-cdk-lib/aws-apigatewayv2';
// 修正後は正しくカスタムドメイン名が使用される
const importedDomain = apigwv2.DomainName.fromDomainNameAttributes(this, 'ImportedDomain', {
name: 'api.example.com', // カスタムドメイン名
regionalDomainName: 'd-xxxxxxxx.execute-api.us-east-1.amazonaws.com',
regionalHostedZoneId: 'Z1234567890ABC',
});
Batch: useOptimalInstanceClassesプロパティの非推奨を取り消し (#36353)
v2.220で非推奨となったuseOptimalInstanceClassesプロパティの非推奨が取り消されました。defaultInstanceClassesだけではoptimalインスタンスタイプを除外する方法がなかったため、このプロパティが再び有効になりました。
import * as batch from 'aws-cdk-lib/aws-batch';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
declare const vpc: ec2.Vpc;
// optimalインスタンスを除外し、特定のインスタンスタイプのみを使用
const computeEnv = new batch.ManagedEc2EcsComputeEnvironment(this, 'ComputeEnv', {
vpc,
instanceClasses: [ec2.InstanceClass.R4], // R4インスタンスのみを使用
useOptimalInstanceClasses: false, // optimalインスタンスを除外
});
Scheduler: ARNからインポートした際にscheduleNameがundefinedを返す問題を修正 (#36400)
Schedule.fromScheduleArn()でスケジュールをインポートした際に、scheduleNameプロパティがundefinedを返す問題が修正されました。
import * as scheduler from 'aws-cdk-lib/aws-scheduler';
// ARNからスケジュールをインポート
const importedSchedule = scheduler.Schedule.fromScheduleArn(
this,
'ImportedSchedule',
'arn:aws:scheduler:us-east-1:123456789012:schedule/my-group/my-schedule'
);
// 修正後は正しくスケジュール名を取得できる
console.log(importedSchedule.scheduleName); // 'my-schedule'
Core: リソースのインスタンス化時に不要な文字列トークンを割り当てる問題を修正 (#36692)
L1/L2リソースのコンストラクタでToken.asString()、getResourceNameAttribute、getResourceArnAttributeが不必要に呼び出されていた問題が修正されました。これらの処理がgetterに移動され、実際に値が使用される場合のみ実行されるようになりました。
この変更により、大規模なアプリケーションでメモリ使用量が大幅に削減されます(10,000コンストラクトのプロジェクトで約50MB/30%の削減)。
Core: tree.jsonにテレメトリメタデータが意図せず含まれる問題を修正 (#36748)
tree.jsonファイルにテレメトリメタデータが誤って含まれていた問題が修正されました。tree.jsonはコンストラクトの基本情報(fqnとversion)のみを含むべきですが、テレメトリ用のメタデータが混入していました。
CloudWatch: IAlarmActionインターフェースの変更による後方互換性の問題を修正 (#36695)
最近の変更でIAlarmActionインターフェースのbindメソッドのシグネチャが変更され、既存の実装が壊れる問題がありました。この変更は元に戻されました。
// IAlarmActionのbindメソッドは以前のシグネチャに戻された
export interface IAlarmAction {
bind(scope: Construct, alarm: IAlarm): AlarmActionConfig; // IAlarmRefではなくIAlarm
}
Alphaモジュール (2.236.0-alpha.0)
Bedrock AgentCore: Episodic Memory Strategyの追加 (#36591)
Bedrock AgentCoreのMemoryに新しいEpisodic Memory Strategyが追加されました。エピソード記憶は、ユーザーとシステムのインタラクションの意味のあるスライスを取り込み、関連性のある形でコンテキストを呼び起こすことができます。
import * as agentcore from '@aws-cdk/aws-bedrock-agentcore-alpha';
// ビルトインのEpisodic Memory Strategyを使用
const memory1 = new agentcore.Memory(this, 'Memory1', {
strategies: [
agentcore.MemoryStrategy.usingBuiltInEpisodic(), // デフォルト設定
],
});
// カスタム設定でEpisodic Memory Strategyを使用
const memory2 = new agentcore.Memory(this, 'Memory2', {
strategies: [
agentcore.MemoryStrategy.usingEpisodic({
namespaces: ['conversation', 'context'], // カスタム名前空間
reflectionConfiguration: {
reflectionEnabled: true, // リフレクションを有効化
reflectionNamespace: 'reflection', // リフレクション用の名前空間
},
}),
],
});
Bedrock AgentCore: Gateway Interceptorsの追加 (#36604)
Bedrock AgentCoreのGatewayにインターセプター機能が追加されました。Lambda関数を使用して、リクエストの検証、レスポンスの変換、カスタム認可などを実行できます。
import * as agentcore from '@aws-cdk/aws-bedrock-agentcore-alpha';
import * as lambda from 'aws-cdk-lib/aws-lambda';
declare const requestInterceptorFn: lambda.Function;
declare const responseInterceptorFn: lambda.Function;
declare const target: agentcore.IGatewayTarget;
// Gatewayにインターセプターを設定
const gateway = new agentcore.Gateway(this, 'Gateway', {
targets: [target],
// インターセプター設定
interceptorConfigurations: [
{
interceptor: agentcore.LambdaInterceptor.request(requestInterceptorFn),
interceptionPoint: agentcore.InterceptionPoint.REQUEST, // リクエスト時に実行
},
{
interceptor: agentcore.LambdaInterceptor.response(responseInterceptorFn),
interceptionPoint: agentcore.InterceptionPoint.RESPONSE, // レスポンス時に実行
},
],
});
// または、メソッドを使用して追加
gateway.addRequestInterceptor(requestInterceptorFn);
gateway.addResponseInterceptor(responseInterceptorFn);
Gatewayのサービスロールには、自動的にインターセプターLambda関数のlambda:InvokeFunction権限が付与されます。
Bedrock AgentCore: 物理名プロパティをオプション化 (#36354)
Bedrock AgentCoreの各リソース(Gateway、Runtime、RuntimeEndpoint、Memory、BrowserCustom、CodeInterpreterCustom、GatewayTargetなど)で、物理名プロパティがオプションになりました。名前を省略すると、CDKが自動的に一意の名前を生成します。
import * as agentcore from '@aws-cdk/aws-bedrock-agentcore-alpha';
// 名前を指定しない場合、自動生成される
const memory = new agentcore.Memory(this, 'Memory', {
// memoryName は省略可能
strategies: [
agentcore.MemoryStrategy.usingBuiltInSemantic(),
],
});
// 明示的に名前を指定する場合
const memory2 = new agentcore.Memory(this, 'Memory2', {
memoryName: 'my-custom-memory-name', // カスタム名を指定
strategies: [
agentcore.MemoryStrategy.usingBuiltInSemantic(),
],
});
mixins-preview: BucketPolicyStatementsMixinの公開 (#36771)
BucketPolicyStatementsMixinがプライベートディレクトリから公開され、既存のBucketPolicyリソースにPolicyStatementを追加できるようになりました。
import * as mixins from '@aws-cdk/mixins-preview';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as iam from 'aws-cdk-lib/aws-iam';
declare const bucket: s3.Bucket;
// BucketPolicyにステートメントを追加
const bucketPolicyMixin = new mixins.BucketPolicyStatementsMixin(bucket.policy!);
bucketPolicyMixin.addToResourcePolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
principals: [new iam.ServicePrincipal('logs.amazonaws.com')],
actions: ['s3:PutObject'],
resources: [bucket.arnForObjects('*')],
}));
SageMaker: EndpointConfigにcontainerStartupHealthCheckTimeoutInSecondsを追加 (#35626)
SageMakerのエンドポイント設定で、コンテナの起動ヘルスチェックタイムアウトを設定できるようになりました。初期化に時間がかかるモデルに対して、適切なヘルスチェックタイムアウトを指定できます。
import * as sagemaker from '@aws-cdk/aws-sagemaker-alpha';
import * as cdk from 'aws-cdk-lib';
declare const model: sagemaker.IModel;
const endpointConfig = new sagemaker.EndpointConfig(this, 'EndpointConfig', {
instanceProductionVariants: [{
variantName: 'my-variant',
model: model,
// コンテナ起動ヘルスチェックのタイムアウト設定
containerStartupHealthCheckTimeout: cdk.Duration.minutes(5), // 60秒〜3600秒の範囲
}],
});
タイムアウト値は60秒(1分)から3600秒(1時間)の範囲で指定できます。
EKS v2: kubectlプロバイダーのアクセスエントリが下流リソースの依存関係に含まれるように修正 (#36734)
kubectlプロバイダーのAccessEntryがkubectl ready barrierの明示的な依存関係として追加されるようになりました。これにより、kubectlを使用するリソースが正しい順序でデプロイされます。
まとめ
AWS CDK v2.236.0は、ECSのLinear/Canaryデプロイメント戦略、Spotインスタンスサポート、CloudWatch Logsの削除保護など、本番環境での運用に役立つ機能が追加されたリリースです。
特に、ECSのデプロイメント戦略の追加により、ブルー/グリーンデプロイメントに代わる段階的なデプロイオプションが利用可能になりました。また、CloudWatch Logsの削除保護は、重要なログデータの保護に有効です。
Alphaモジュールでは、Bedrock AgentCoreの機能が大幅に拡張され、Episodic Memory StrategyやGateway Interceptorsが追加されました。これらの機能は、AIエージェントの構築において柔軟性を提供します。