概要
AWS CDK v2.239.0では、DynamoDBでクロスアカウントグローバルテーブルレプリケーションがサポートされ、異なるAWSアカウント間でのテーブルレプリケーションが可能になりました。Kinesis Firehoseではダイナミックパーティショニングがサポートされ、レコードの内容に基づいたS3バケット内の自動パーティショニングが実現できます。また、L1リソース向けにリソースポリシーと暗号化リソースラッパーが追加され、L1コンストラクトでもL2と同様の権限付与が可能になりました。
新機能
DynamoDB: クロスアカウントグローバルテーブルレプリケーションのサポート (#36895)
DynamoDBグローバルテーブルで、異なるAWSアカウント間でのテーブルレプリケーションがサポートされました。マルチテナントアーキテクチャ、組織境界、ディザスタリカバリシナリオに対応できます。
新しいTableV2MultiAccountReplicaコンストラクトと、自動的な権限管理が追加されました。
import * as cdk from 'aws-cdk-lib';
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
import * as kms from 'aws-cdk-lib/aws-kms';
// ソースアカウントのスタック(アカウントA、us-east-1)
const sourceStack = new cdk.Stack(app, 'SourceStack', {
env: { account: '111111111111', region: 'us-east-1' },
});
// ソーステーブルの作成
const sourceTable = new dynamodb.TableV2(sourceStack, 'SourceTable', {
tableName: 'MyGlobalTable',
partitionKey: { name: 'pk', type: dynamodb.AttributeType.STRING },
billing: dynamodb.Billing.onDemand(),
});
// レプリカアカウントのスタック(アカウントB、us-west-2)
const replicaStack = new cdk.Stack(app, 'ReplicaStack', {
env: { account: '222222222222', region: 'us-west-2' },
});
// 新機能: クロスアカウントレプリカの作成
const replica = new dynamodb.TableV2MultiAccountReplica(replicaStack, 'Replica', {
sourceTable, // ソーステーブルへの参照
tableName: 'MyGlobalTable', // レプリカテーブル名(ソースと同じ名前が必要)
// テーブル設定のレプリケーションモードを指定
settingsReplicationMode: dynamodb.SettingsReplicationMode.ALL, // ALL: すべての設定をレプリケート
});
権限管理の自動化:
- ソーステーブルのリソースポリシーでレプリカアカウントに
dynamodb:AssociateTableReplicaを付与 - DynamoDBレプリケーションサービスプリンシパルに読み取り/書き込み権限を自動付与
- KMS暗号化キーの権限も自動設定
クロスアカウント権限付与のためのメソッド:
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
// ソーステーブルとレプリカテーブルの権限付与
// TableGrantsクラスを使用
const grants = dynamodb.TableGrants.fromTable(sourceTable);
// レプリカアカウントへのレプリケーション権限を付与
grants.multiAccountReplicationTo(
replicaStack.account, // レプリカアカウントID
replicaStack.region, // レプリカリージョン
);
// ソーステーブルからのレプリケーション受信権限を付与(レプリカ側で実行)
const replicaGrants = dynamodb.TableGrants.fromTable(replica);
replicaGrants.multiAccountReplicationFrom(
sourceStack.account, // ソースアカウントID
sourceStack.region, // ソースリージョン
);
Kinesis Firehose: ダイナミックパーティショニングのサポート (#35903)
Kinesis FirehoseでS3バケットへのダイナミックパーティショニングがサポートされました。レコードの内容に基づいてS3バケット内でデータを自動的にパーティション分割できます。
import * as firehose from 'aws-cdk-lib/aws-kinesisfirehose';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as lambda from 'aws-cdk-lib/aws-lambda';
const bucket = new s3.Bucket(this, 'DataBucket');
const processorFunction = new lambda.Function(this, 'ProcessorFunction', {
// Lambda関数の設定...
runtime: lambda.Runtime.NODEJS_20_X,
handler: 'index.handler',
code: lambda.Code.fromAsset('lambda'),
});
// 新機能: ダイナミックパーティショニングを有効にしたS3送信先
const s3Destination = new firehose.S3Bucket(bucket, {
// ダイナミックパーティショニングを有効化
dynamicPartitioning: {
enabled: true, // ダイナミックパーティショニングを有効化
},
// データプロセッサの設定
processors: [
// マルチレコードデアグリゲーション(JSONレコードの分割)
firehose.RecordDeAggregationProcessor.json(),
// JQ-1.6を使用したインラインメタデータ抽出
firehose.MetadataExtractionProcessor.jq16({
customer_id: '.customer_id', // JSONフィールドから顧客IDを抽出
device: '.type.device', // ネストされたフィールドからデバイス情報を抽出
year: '.event_timestamp|strftime("%Y")', // タイムスタンプから年を抽出
}),
// Lambda関数によるカスタム処理(オプション)
new firehose.LambdaFunctionProcessor(processorFunction),
],
// パーティションキーを含むS3出力プレフィックス
dataOutputPrefix: '!{partitionKeyFromQuery:year}/!{partitionKeyFromQuery:device}/!{partitionKeyFromQuery:customer_id}/!{partitionKeyFromLambda:lambda_key}/',
// エラー出力プレフィックス(dataOutputPrefixに式が含まれる場合は必須)
errorOutputPrefix: '!{firehose:error-output-type}/!{timestamp:yyyy/MM}/',
});
const deliveryStream = new firehose.DeliveryStream(this, 'DeliveryStream', {
destination: s3Destination,
});
利用可能なデータプロセッサ:
RecordDeAggregationProcessor.json(): JSONレコードのマルチレコードデアグリゲーションRecordDeAggregationProcessor.delimiter(delimiter): 区切り文字ベースのデアグリゲーションMetadataExtractionProcessor.jq16(queries): JQ-1.6クエリによるインラインメタデータ抽出LambdaFunctionProcessor: Lambda関数によるカスタム処理
L1リソース向けリソースポリシーと暗号化リソースラッパー (#36849)
L1(CloudFormation)リソースに対して、L2コンストラクトと同様にリソースポリシーや暗号化設定の権限付与ができるようになりました。新しい「トレイト」パターンとトレイトファクトリが導入されています。
import * as cdk from 'aws-cdk-lib';
import * as kms from 'aws-cdk-lib/aws-kms';
import * as iam from 'aws-cdk-lib/aws-iam';
// 新機能: ResourceWithPolicies を使用してL1リソースにリソースポリシーを追加
const cfnKey = new kms.CfnKey(this, 'L1Key', {
keyPolicy: {
Version: '2012-10-17',
Statement: [],
},
});
// L1リソースに対してリソースポリシーを追加
iam.ResourceWithPolicies.of(cfnKey).addToResourcePolicy(
new iam.PolicyStatement({
actions: ['kms:Encrypt', 'kms:Decrypt'],
principals: [new iam.ServicePrincipal('logs.amazonaws.com')],
resources: ['*'],
}),
);
// KeyGrantsクラスを使用した権限付与
// L1/L2どちらでも同じように動作
const grants = kms.KeyGrants.fromKey(cfnKey);
grants.decrypt(new iam.ServicePrincipal('lambda.amazonaws.com'));
サポートされるリソースタイプ:
リソースポリシーファクトリ(IResourceWithPolicyV2):
- S3バケット
- KMSキー
- CloudWatch Logsロググループ
- SQSキュー
- DynamoDBテーブル
- SNSトピック
暗号化リソースファクトリ(IEncryptedResource):
- S3バケット
- SQSキュー
- DynamoDBテーブル
- SNSトピック
フィーチャーフラグ:
デフォルト実装を無効にしたい場合は、@aws-cdk/core:automaticL1Traitsフィーチャーフラグをfalseに設定します。
L1 CloudFormationリソース定義の更新 (#36923, #36997, #37031)
最新のAWS CloudFormationリソース仕様に基づいてL1コンストラクトが更新されました。
バグ修正
aws-cdk-lib: peer dependency conflictを解決するためにcloud-assembly-schemaを更新 (#36953)
cloud-assembly-schemaパッケージのバージョンが更新され、依存関係の競合が解決されました。
aws-cdk-lib: CVEスキャナーをトリガーするajvのバージョンをアップグレード (#37022)
ajvパッケージがバージョン8.18.0にアップグレードされました。このバージョンはReDoS攻撃に対する脆弱性が修正されています。
CDK自体には実際の脆弱性はありませんでした(入力が攻撃者によって制御されないため)が、CVEスキャナーがこの問題を検出することがありました。
EC2: 一部の隔離リージョンにVPCエンドポイント命名規則を追加 (#36794)
AWS隔離リージョンに対して正しいVPCエンドポイントプレフィックスが追加されました:
us-iso-east-1,us-iso-west-1:gov.ic.c2sus-isob-east-1,us-isob-west-1:gov.sgov.sc2sus-isof-south-1,us-isof-east-1:gov.ic.hci.csp
これにより、隔離リージョンでのVPCエンドポイント作成時に正しいサービス名が使用されます。
RDS: 非推奨バージョンのマークと新しいエンジンバージョンの追加 (#36937)
RDSエンジンバージョンクラスが更新され、AWSでサポートされなくなったバージョンに@deprecatedタグが追加されました。また、新しく利用可能になったバージョンが追加されました。
追加された新バージョンの例:
- MySQL:
VER_8_0_45,VER_8_4_8 - PostgreSQL: 各メジャーバージョンの最新マイナーバージョン
- Aurora MySQL:
VER_3_04_6,VER_3_10_3
非推奨としてマークされたバージョン: AWS RDS APIで利用できなくなったバージョンが非推奨としてマークされています。IDEでこれらのバージョンを使用すると警告が表示されます。
import * as rds from 'aws-cdk-lib/aws-rds';
// 推奨: 利用可能な最新バージョンを使用
const instance = new rds.DatabaseInstance(this, 'Instance', {
engine: rds.DatabaseInstanceEngine.postgres({
version: rds.PostgresEngineVersion.VER_16_11, // 最新の利用可能バージョン
}),
instanceType: ec2.InstanceType.of(ec2.InstanceClass.T3, ec2.InstanceSize.MICRO),
vpc,
});
Alphaモジュール (2.239.0-alpha.0)
新機能
Bedrock AgentCore: fromCodeAssetメソッドの追加 (#36472)
AgentRuntimeArtifact.fromCodeAsset()メソッドが追加され、ローカルコードアセットから直接ランタイムアーティファクトを作成できるようになりました。S3バケットの手動管理が不要になります。
import * as bedrock from '@aws-cdk/aws-bedrock-agentcore-alpha';
// 新機能: ローカルコードアセットからランタイムアーティファクトを作成
const artifact = bedrock.AgentRuntimeArtifact.fromCodeAsset('path/to/agent-code');
const runtime = new bedrock.BedrockAgentRuntime(this, 'Runtime', {
artifact, // S3への自動アップロード
// その他の設定...
});
Bedrock AgentCore: API Gatewayターゲットタイプの追加 (#36841)
AgentCore GatewayのターゲットとしてAmazon API Gateway REST APIがサポートされました。既存のAPI GatewayをAIエージェントのツールとして公開できます。
import * as bedrock from '@aws-cdk/aws-bedrock-agentcore-alpha';
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
// 既存のREST API
const api = new apigateway.RestApi(this, 'MyApi', {
restApiName: 'my-service',
});
// 新機能: API Gatewayをターゲットとして使用
const target = bedrock.GatewayTarget.fromApiGateway(api, {
name: 'my-api-target',
description: 'My API Gateway target',
});
const gateway = new bedrock.Gateway(this, 'Gateway', {
targets: [target],
});
自動付与される権限:
apigateway:GET: REST APIのOpenAPI定義を取得execute-api:Invoke: REST APIエンドポイントの呼び出し(IAM認証時)
Mixins Preview: ECS ClusterSettingsMixinの追加 (#36796)
ECSクラスターの設定をMixinsパターンで適用できるClusterSettingsMixinが追加されました。Container Insightsの拡張モードなどを設定できます。
import * as ecs from 'aws-cdk-lib/aws-ecs';
import { ClusterSettingsMixin } from '@aws-cdk/mixins-preview';
// L1クラスターにMixinを適用
new ecs.CfnCluster(this, 'L1Cluster', { clusterName: 'test' })
.with(new ClusterSettingsMixin([
{ name: 'containerInsights', value: 'enhanced' }, // Container Insights拡張モードを有効化
]));
// L2クラスターにも同様に適用可能
new ecs.Cluster(this, 'L2Cluster', { vpc, clusterName: 'test' })
.with(new ClusterSettingsMixin([
{ name: 'containerInsights', value: 'enhanced' },
]));
Mixins Preview: S3 BucketBlockPublicAccessミックスインの追加 (#36905)
S3バケットのパブリックアクセスブロック設定をMixinsパターンで適用できるBucketBlockPublicAccessが追加されました。
import * as s3 from 'aws-cdk-lib/aws-s3';
import { BucketBlockPublicAccess } from '@aws-cdk/mixins-preview';
// デフォルト: BLOCK_ALL(すべてのパブリックアクセスをブロック)
new s3.CfnBucket(this, 'Bucket')
.with(new BucketBlockPublicAccess());
// カスタム設定
new s3.CfnBucket(this, 'CustomBucket')
.with(new BucketBlockPublicAccess(s3.BlockPublicAccess.BLOCK_ACLS));
Mixins Preview: Vended LogsのtoDestination()メソッドの追加 (#36896)
Vended Logsで事前作成されたDeliveryDestinationにログを送信できるtoDestination()メソッドが追加されました。クロスアカウントログ配信に対応しています。
import * as logs from 'aws-cdk-lib/aws-logs';
import { VendedLogs } from '@aws-cdk/mixins-preview';
// 事前作成されたDeliveryDestination
const destination = new logs.CfnDeliveryDestination(this, 'Destination', {
name: 'my-destination',
// 設定...
});
// 新機能: 任意のDeliveryDestinationにログを送信
const vendedLogs = new VendedLogs(this, 'VendedLogs');
vendedLogs.toDestination(destination, sourceResource);
バグ修正(破壊的変更を含む)
Redshift Alpha: デフォルトノードタイプをDC2_LARGEからRA3_LARGEに変更 (#36516)
破壊的変更: RedshiftクラスターのデフォルトノードタイプがDC2_LARGEからRA3_LARGEに変更されました。
AWSはDC2インスタンスタイプの新規作成をサポートしなくなったため、現在推奨されているRA3_LARGEがデフォルトになりました。
import * as redshift from '@aws-cdk/aws-redshift-alpha';
// 変更前: デフォルトはDC2_LARGE(現在は非サポート)
// 変更後: デフォルトはRA3_LARGE(AWS推奨)
const cluster = new redshift.Cluster(this, 'Redshift', {
masterUser: {
masterUsername: 'admin',
},
vpc,
// nodeType を指定しない場合、RA3_LARGE が使用される
});
// 明示的にノードタイプを指定する場合
const customCluster = new redshift.Cluster(this, 'CustomRedshift', {
masterUser: {
masterUsername: 'admin',
},
vpc,
nodeType: redshift.NodeType.RA3_XLPLUS, // 明示的に指定
});
破壊的変更
L1リソースの必須プロパティ変更
CloudFormationリソーススキーマの更新により、以下のL1リソースで必須プロパティが変更されました:
LicenseManager:
AWS::LicenseManager::License:Beneficiaryプロパティが必須になりましたAWS::LicenseManager::License:ProductSKUプロパティが必須になりました
SageMaker:
AWS::SageMaker::Cluster:Orchestrator.Eksプロパティがimmutable(変更不可)になりました
これらのリソースを使用している場合は、必須プロパティが設定されていることを確認してください。
まとめ
AWS CDK v2.239.0は、データベースとストリーミングの分野で大きな機能強化が行われたリリースです。
主なハイライト:
- DynamoDBクロスアカウントレプリケーション: 異なるAWSアカウント間でのグローバルテーブルレプリケーションが可能に
- Firehoseダイナミックパーティショニング: レコード内容に基づくS3への自動パーティショニング
- L1リソースの権限付与改善: L1コンストラクトでもL2と同様のGrants APIが利用可能に
Alphaモジュール:
- Bedrock AgentCoreでローカルコードアセットとAPI Gatewayターゲットをサポート
- Mixins PreviewでECS、S3、CloudWatch Logsの新しいミックスインを追加
- Redshiftのデフォルトノードタイプが
RA3_LARGEに変更(破壊的変更)
L1リソースの必須プロパティ変更に該当する場合は、デプロイ前にコードを確認してください。