概要
AWS CDK v2.184.0では、Lambda Event SourcesでのS3障害時送信先サポート、Aurora DBインスタンスのアベイラビリティーゾーン指定、型安全なValidationErrorの導入など、重要な機能追加とバグ修正が行われました。特にLambdaとRDSの機能拡張により、より柔軟なインフラストラクチャ設計が可能になっています。
新機能
Lambda: Kinesis/DynamoDB Event SourceでS3 OnFailureDestinationのサポート
LambdaのKinesisおよびDynamoDB Event Source Mappingで、失敗したイベントをS3バケットに送信する機能がサポートされました。これにより、処理に失敗したイベントの詳細な分析やリトライが可能になります。
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as kinesis from 'aws-cdk-lib/aws-kinesis';
import { KinesisEventSource } from 'aws-cdk-lib/aws-lambda-event-sources';
import { S3OnFailureDestination } from 'aws-cdk-lib/aws-lambda-destinations';
const stream = new kinesis.Stream(this, 'MyStream');
const failureBucket = new s3.Bucket(this, 'FailureBucket');
const fn = new lambda.Function(this, 'MyFunction', {
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
});
// Kinesisイベントソースに失敗時のS3送信先を設定
fn.addEventSource(new KinesisEventSource(stream, {
batchSize: 100,
startingPosition: lambda.StartingPosition.TRIM_HORIZON,
// 処理に失敗したイベントをS3バケットに送信
onFailure: new S3OnFailureDestination(failureBucket),
}));
DynamoDB Streamsでも同様に設定可能です:
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
import { DynamoEventSource } from 'aws-cdk-lib/aws-lambda-event-sources';
const table = new dynamodb.Table(this, 'MyTable', {
partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING },
stream: dynamodb.StreamViewType.NEW_AND_OLD_IMAGES,
});
const failureBucket = new s3.Bucket(this, 'DynamoFailureBucket');
fn.addEventSource(new DynamoEventSource(table, {
batchSize: 50,
startingPosition: lambda.StartingPosition.LATEST,
// DynamoDB Streamsの失敗したイベントもS3に送信可能
onFailure: new S3OnFailureDestination(failureBucket),
}));
この機能により、以下が実現できます:
- 失敗したイベントの永続的な保存
- 後からのバッチ処理やリトライ
- 失敗パターンの分析と監視
- データロスの防止
RDS: Aurora DBインスタンスのアベイラビリティーゾーン指定
Aurora DatabaseクラスターのDBインスタンスに対して、アベイラビリティーゾーン(AZ)を明示的に指定できるようになりました。これにより、同一AZにEC2インスタンスとAuroraインスタンスを配置してレイテンシを削減したり、開発環境でのコスト最適化が可能になります。
import * as rds from 'aws-cdk-lib/aws-rds';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
const vpc = new ec2.Vpc(this, 'MyVpc');
const cluster = new rds.DatabaseCluster(this, 'MyCluster', {
engine: rds.DatabaseClusterEngine.auroraMysql({
version: rds.AuroraMysqlEngineVersion.VER_3_05_2,
}),
vpc,
writer: rds.ClusterInstance.provisioned('Writer', {
instanceType: ec2.InstanceType.of(
ec2.InstanceClass.T3,
ec2.InstanceSize.MEDIUM,
),
// ライターインスタンスのAZを指定
availabilityZone: 'us-east-1a',
}),
readers: [
rds.ClusterInstance.provisioned('Reader1', {
instanceType: ec2.InstanceType.of(
ec2.InstanceClass.T3,
ec2.InstanceSize.MEDIUM,
),
// リーダーインスタンスのAZも指定可能
availabilityZone: 'us-east-1b',
}),
],
});
Aurora Serverless v2でも同様に指定可能です:
const serverlessCluster = new rds.DatabaseCluster(this, 'ServerlessCluster', {
engine: rds.DatabaseClusterEngine.auroraPostgres({
version: rds.AuroraPostgresEngineVersion.VER_15_5,
}),
vpc,
writer: rds.ClusterInstance.serverlessV2('ServerlessWriter', {
// Serverless v2インスタンスのAZも指定可能
availabilityZone: 'us-east-1a',
}),
readers: [
rds.ClusterInstance.serverlessV2('ServerlessReader', {
availabilityZone: 'us-east-1b',
// スケーリング設定
scaleWithWriter: true,
}),
],
});
この機能は以下のユースケースで有用です:
- 同一AZ内のEC2インスタンスとRDSインスタンスの配置によるレイテンシ削減
- 開発環境でのシングルAZ構成によるコスト削減
- 特定のAZへのワークロード配置要件への対応
ECR: ValidationErrorの導入
ECRモジュールで、型なしのErrorからValidationErrorへの移行が実施されました。これにより、リポジトリ設定のバリデーションエラーがより明確になり、エラーハンドリングの型安全性が向上しました。
import * as ecr from 'aws-cdk-lib/aws-ecr';
try {
const repository = new ecr.Repository(this, 'MyRepo', {
repositoryName: 'invalid-name!', // 無効な文字を含む
});
} catch (error) {
// ValidationErrorとして型安全にキャッチ可能
if (error instanceof ValidationError) {
console.error('Repository validation failed:', error.message);
}
}
バグ修正
CodePipeline: ステージロールの信頼ポリシー改善
フィーチャーフラグ@aws-cdk/pipelines:reduceStageRoleTrustScopeを有効にすると、パイプラインのステージロールの信頼ポリシーが改善されます。従来はアカウントルートプリンシパルが信頼関係に含まれていましたが、このフラグを有効にすると、代わりに現在のパイプラインロールのみが信頼されるようになります。
import * as pipelines from 'aws-cdk-lib/pipelines';
import * as cdk from 'aws-cdk-lib';
const app = new cdk.App({
context: {
// フィーチャーフラグを有効化
'@aws-cdk/pipelines:reduceStageRoleTrustScope': true,
},
});
const pipeline = new pipelines.CodePipeline(this, 'Pipeline', {
synth: new pipelines.ShellStep('Synth', {
input: pipelines.CodePipelineSource.gitHub('owner/repo', 'main'),
commands: ['npm ci', 'npm run build', 'npx cdk synth'],
}),
});
この変更により、以下のセキュリティ上の利点があります:
- 過度に広範な信頼ポリシーの削減
- 最小権限の原則に沿った設定
- アカウントルートへの不要なアクセス防止
Core: トークンを含むアノテーションメッセージの出力修正
CDKコア機能で、トークンを含むアノテーションメッセージが正しく出力されない問題が修正されました。これにより、動的な値を含む警告やエラーメッセージが適切に表示されるようになります。
Events Targets: LogGroupTargetInput.fromObjectV2()メソッドの追加
EventBridgeのログターゲットで、型の不一致を解決するために新しいfromObjectV2()メソッドが追加されました。従来のfromObject()メソッドはRuleTargetInputを返していましたが、LogGroupTargetInput型が必要な場合に型エラーが発生していました。
import * as events from 'aws-cdk-lib/aws-events';
import * as targets from 'aws-cdk-lib/aws-events-targets';
import * as logs from 'aws-cdk-lib/aws-logs';
const rule = new events.Rule(this, 'Rule', {
eventPattern: {
source: ['aws.ec2'],
},
});
const logGroup = new logs.LogGroup(this, 'LogGroup');
// fromObjectV2()を使用して正しい型を返す
rule.addTarget(new targets.CloudWatchLogGroup(logGroup, {
logEvent: targets.LogGroupTargetInput.fromObjectV2({
timestamp: events.EventField.fromPath('$.time'),
message: events.EventField.fromPath('$.detail.message'),
}),
}));
fromObject()メソッドは非推奨となり、fromObjectV2()の使用が推奨されます。
Alpha モジュール (2.184.0-alpha.0)
破壊的変更
Glue Alpha: Workflowメソッド名の修正
Glue Alphaモジュールで、Workflow.addconditionalTrigger()メソッドの名前が正しいキャメルケースのWorkflow.addConditionalTrigger()に変更されました。
移行方法:
// 変更前(非推奨)
workflow.addconditionalTrigger('Trigger', {
// 設定...
});
// 変更後(推奨)
workflow.addConditionalTrigger('Trigger', {
// 設定...
});
この変更により、APIの一貫性が向上し、TypeScriptの命名規則に準拠します。既存のコードは更新が必要です。
まとめ
AWS CDK v2.184.0では、LambdaのS3障害送信先サポートとAuroraのAZ指定機能により、より柔軟で堅牢なインフラストラクチャ設計が可能になりました。また、ValidationErrorの導入やCodePipelineのセキュリティ改善により、開発体験とセキュリティが向上しています。
Alpha モジュールでは、Glueのメソッド名修正という破壊的変更がありますが、より一貫性のあるAPIを提供します。
詳細な変更内容については、公式リリースノートをご確認ください。