概要
AWS CDK v2.190.0 では、API Gateway V2でのアクセスロギング対応、RDSインスタンスのLookup機能、S3レプリケーション設定の柔軟化、Network Load BalancerのSubnet Mappings対応など、多数の機能追加が行われました。また、Alphaモジュールでは、EC2のIPv6/Dualstackサポートが追加されました。
新機能
API Gateway V2: HttpStageでのアクセスロギング対応
API Gateway HTTP APIのステージで、CloudWatch Logsへのアクセスロギングを設定できるようになりました。API Gateway V1と同様のロジックで実装されています。
import * as logs from 'aws-cdk-lib/aws-logs';
import * as apigwv2 from 'aws-cdk-lib/aws-apigatewayv2';
// CloudWatch Logs ロググループの作成
const logGroup = new logs.LogGroup(this, 'ApiLogs', {
retention: logs.RetentionDays.ONE_WEEK,
});
// HTTP APIの作成
const httpApi = new apigwv2.HttpApi(this, 'HttpApi');
// アクセスロギングを有効化したステージ
new apigwv2.HttpStage(this, 'Stage', {
httpApi,
stageName: 'prod',
// アクセスロギングの設定
accessLogSettings: {
destinationArn: logGroup.logGroupArn, // ログの出力先
format: apigwv2.AccessLogFormat.jsonWithStandardFields({
caller: true,
httpMethod: true,
ip: true,
protocol: true,
requestTime: true,
resourcePath: true,
responseLength: true,
status: true,
user: true,
}),
},
});
関連PR: #33977
RDS: DatabaseInstance.fromLookup() の追加
既存のRDSインスタンスを識別子から検索し、参照できる新しいメソッド fromLookup() が追加されました。Cloud Control APIを使用してインスタンス情報を取得します。
import * as rds from 'aws-cdk-lib/aws-rds';
import * as iam from 'aws-cdk-lib/aws-iam';
// 既存のRDSインスタンスを検索
const existingDb = rds.DatabaseInstance.fromLookup(this, 'ExistingDB', {
instanceIdentifier: 'my-database-instance-1', // RDSインスタンス識別子
});
// 検索したインスタンスのエンドポイント情報を利用可能
console.log(existingDb.dbInstanceEndpointAddress);
console.log(existingDb.dbInstanceEndpointPort);
// IAMロールに接続権限を付与
const role = new iam.Role(this, 'Role', {
assumedBy: new iam.ServicePrincipal('lambda.amazonaws.com'),
});
existingDb.grantConnect(role, 'dbUser'); // データベースユーザーに接続権限を付与
注意事項:
- Cloud Control APIの実行権限が必要です
- デプロイ時にAWS環境から実際のインスタンス情報を取得します
関連PR: #33258
S3: レプリケーション用のカスタムIAMロール指定
S3バケットのレプリケーション設定で、カスタムIAMロールを指定できるようになりました。これにより、外部で管理されているIAMロールを使用したり、複数のスタックやアカウント間でロールを再利用することが可能になります。
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as iam from 'aws-cdk-lib/aws-iam';
// レプリケーション先バケット
const destinationBucket = new s3.Bucket(this, 'DestinationBucket', {
bucketName: 'my-destination-bucket',
});
// カスタムレプリケーションロールの作成
const replicationRole = new iam.Role(this, 'ReplicationRole', {
assumedBy: new iam.ServicePrincipal('s3.amazonaws.com'),
});
// 必要な権限を手動で付与
replicationRole.addToPolicy(new iam.PolicyStatement({
actions: [
's3:GetReplicationConfiguration',
's3:ListBucket',
],
resources: ['arn:aws:s3:::my-source-bucket'],
}));
replicationRole.addToPolicy(new iam.PolicyStatement({
actions: [
's3:GetObjectVersionForReplication',
's3:GetObjectVersionAcl',
],
resources: ['arn:aws:s3:::my-source-bucket/*'],
}));
replicationRole.addToPolicy(new iam.PolicyStatement({
actions: [
's3:ReplicateObject',
's3:ReplicateDelete',
],
resources: ['arn:aws:s3:::my-destination-bucket/*'],
}));
// ソースバケットにカスタムロールを指定
const sourceBucket = new s3.Bucket(this, 'SourceBucket', {
bucketName: 'my-source-bucket',
versioned: true, // レプリケーションにはバージョニングが必要
// カスタムレプリケーションロールの指定
replicationRole: replicationRole,
// レプリケーションルールの定義
replicationRules: [{
destination: destinationBucket,
priority: 1,
}],
});
重要な注意事項:
- カスタムロールを指定した場合、CDKは自動的に権限を付与しません
- レプリケーションに必要なIAMポリシーは、ユーザーが手動で設定する必要があります
replicationRoleを指定する場合、replicationRulesも必ず定義する必要があります
関連PR: #33978
Elastic Load Balancing V2: Network Load Balancerのサブネットマッピング対応
Network Load Balancerで、より詳細なサブネット設定が可能な subnetMappings プロパティが追加されました。CloudFormationの SubnetMapping プロパティに相当する機能で、IPv4/IPv6アドレスの指定やSource NAT IPv6プレフィックスの設定が可能です。
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';
const vpc = new ec2.Vpc(this, 'VPC');
// Elastic IPの作成
const eip1 = new ec2.CfnEIP(this, 'EIP1');
const eip2 = new ec2.CfnEIP(this, 'EIP2');
// サブネットマッピングを使用したNLB作成
const nlb = new elbv2.NetworkLoadBalancer(this, 'NLB', {
vpc,
internetFacing: true,
// 詳細なサブネットマッピング設定
subnetMappings: [
{
subnetId: vpc.publicSubnets[0].subnetId, // サブネットID
allocationId: eip1.attrAllocationId, // Elastic IPの割り当てID(オプション)
privateIPv4Address: '10.0.1.100', // プライベートIPv4アドレス(オプション)
ipv6Address: '2001:db8::1', // IPv6アドレス(オプション)
},
{
subnetId: vpc.publicSubnets[1].subnetId,
allocationId: eip2.attrAllocationId,
privateIPv4Address: '10.0.2.100',
},
],
});
// Source NAT IPv6プレフィックスを使用した例
const nlbWithSourceNat = new elbv2.NetworkLoadBalancer(this, 'NLBWithSourceNat', {
vpc,
internetFacing: true,
subnetMappings: [
{
subnetId: vpc.publicSubnets[0].subnetId,
// Source NAT IPv6プレフィックスの設定
sourceNatIpv6Prefixes: [
elbv2.SourceNatIpv6Prefix.amazonProvided(), // AWS提供のプレフィックス
],
},
{
subnetId: vpc.publicSubnets[1].subnetId,
sourceNatIpv6Prefixes: [
elbv2.SourceNatIpv6Prefix.byoip('2001:db8::/64'), // BYOIP(Bring Your Own IP)プレフィックス
],
},
],
});
注意事項:
subnetMappingsとsubnetsを同時に指定することはできません- 各サブネットに対して1つのマッピングのみ指定可能です
関連PR: #33736
Step Functions: Distributed MapのResultWriterにWriterConfig対応
Step FunctionsのDistributed Mapで、ResultWriterに新しい WriterConfig プロパティが追加され、出力タイプや変換設定をカスタマイズできるようになりました。
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
import * as s3 from 'aws-cdk-lib/aws-s3';
// 結果出力用バケット
const resultBucket = new s3.Bucket(this, 'ResultBucket');
const distributedMap = new sfn.DistributedMap(this, 'DistributedMap', {
// ResultWriterV2を使用(フィーチャーフラグが必要)
resultWriter: sfn.ResultWriterV2.s3({
bucket: resultBucket,
prefix: 'results',
// WriterConfigの設定
writerConfig: {
outputType: sfn.OutputType.JSON, // 出力タイプ: JSON または JSONL(デフォルト: JSON)
transformation: {
expression: '$.output', // JSONata式による変換(オプション)
},
},
}),
itemsPath: sfn.JsonPath.stringAt('$.items'),
});
// ItemReaderにJSONL型も追加されました
const mapWithJsonlReader = new sfn.DistributedMap(this, 'MapWithJsonl', {
itemReader: sfn.S3JsonItemReader.create({
bucket: resultBucket,
key: 'input.jsonl',
inputType: sfn.InputType.JSONL, // 新規追加: JSONL形式のサポート
}),
resultWriter: sfn.ResultWriterV2.s3({
bucket: resultBucket,
prefix: 'results',
}),
});
重要な変更点:
- 新しい
ResultWriterV2クラスが追加されました(破壊的変更を避けるため) - 使用するには、フィーチャーフラグ
@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2をtrueに設定する必要があります WriterConfigのみを指定した場合、S3への書き込み権限は自動的に付与されません
// cdk.json での設定例
{
"context": {
"@aws-cdk/aws-stepfunctions:useDistributedMapResultWriterV2": true
}
}
関連PR: #33831
Bedrock: Amazon Nova Sonic 1.0 のサポート
Amazon Bedrock で新しいモデル Amazon Nova Sonic 1.0 がサポートされました。
関連PR: #34134
CloudFront: 列挙型値の追加
CloudFrontモジュールで、不足していた列挙型の値が追加されました。
関連PR: #34075
エラーハンドリングの改善
以下のモジュールで、型指定されていないエラーの代わりに ValidationError をスローするように改善されました:
- cognito-identitypool: より明確なバリデーションエラー(#34109)
- fsx: より明確なバリデーションエラー(#34120)
- ses: より明確なバリデーションエラー(#34098)
Alphaモジュールの新機能
EC2: IPv6/Dualstackサポート (Alpha)
EC2モジュールに、IPv6とDualstack(IPv4/IPv6両対応)をサポートする機能が追加されました。XRay、WAFv2、WorkMailなどのサービスでVPCエンドポイントのIPv6サポートが開始されたことに対応します。
import * as ec2 from '@aws-cdk/aws-ec2-alpha';
const vpc = new ec2.VpcV2(this, 'VPC', {
primaryAddressBlock: ec2.IpAddresses.ipv4('10.0.0.0/16'),
// IPv6 CIDRブロックの追加
secondaryAddressBlocks: [
ec2.IpAddresses.amazonProvidedIpv6({
cidrBlockName: 'AmazonIpv6',
}),
],
});
// Dualstack対応のVPCエンドポイント
const endpoint = vpc.addInterfaceEndpoint('XRayEndpoint', {
service: ec2.InterfaceVpcEndpointAwsService.XRAY,
// IPアドレスタイプの指定
ipAddressType: ec2.IpAddressType.DUALSTACK, // DUALSTACK, IPV4, IPV6 から選択
});
// IPv6対応のサブネット
const subnet = new ec2.SubnetV2(this, 'Subnet', {
vpc,
availabilityZone: 'us-east-1a',
ipv4CidrBlock: new ec2.IpCidr('10.0.1.0/24'),
// IPv6の自動割り当て
assignIpv6AddressOnCreation: true, // サブネット内のインスタンスにIPv6アドレスを自動割り当て(デフォルト: false)
ipv6CidrBlock: new ec2.IpCidr(Fn.select(0, Fn.cidr(
Fn.select(0, vpc.ipv6CidrBlocks),
256,
'64',
))),
});
対応しているIPアドレスタイプ:
IPV4: IPv4のみ(デフォルト)IPV6: IPv6のみDUALSTACK: IPv4とIPv6の両方
注意事項:
- VPCエンドポイントサービスによって対応しているIPアドレスタイプが異なります
- 詳細はAWSドキュメントを参照してください
関連PR: #33898
Neptune Alpha: エンジンバージョン v1.4.5.0 まで追加
Neptune Alphaモジュールで、エンジンバージョン v1.4.5.0 までがサポートされました。
関連PR: #33989
EC2 Alpha: ValidationErrorsの導入
EC2 Alphaモジュールで、型指定されていないエラーの代わりに ValidationError をスローするように改善されました。
関連PR: #34127
バグ修正
CloudFront: 未解決トークンのwebAclId検証を修正
webAclIdパラメータに未解決のトークンが渡された場合の検証エラーが修正されました。
関連PR: #34102
Core: Aspectの適用順序の修正
暗黙的なAspect適用が、カスタムAspect適用を上書きしない問題が修正されました。
関連PR: #34132
Custom Resources: パラメータ名のタイポ修正
Custom Resource設定の addLogRetentionLifetime パラメータのタイポが修正されました。
関連PR: #34090
ECS: FluentdLogDriverの非推奨オプション更新
FluentdLogDriverで、非推奨の asyncConnect オプションの代わりに async オプションが使用されるようになりました。
関連PR: #34059
S3 Deployment: 大きなファイルのメモリ使用量最適化
S3デプロイメントで、大きなファイルを扱う際のメモリ使用量が最適化されました。
関連PR: #34020
EC2 Alpha: NAT Gatewayの複数追加時の問題を修正
addNatGateway メソッドを使用して複数のNAT Gatewayを追加する際の問題が修正されました。
関連PR: #34094
EC2 Alpha: IPv6アドレス自動割り当てのデフォルト設定を更新
サブネットの assignIpv6AddressOnCreation プロパティのデフォルト設定が更新されました。
関連PR: #34116
破壊的変更(実験的機能)
CloudFormation: L1リソースの更新
CloudFormationリソース定義の更新により、一部のL1リソースで破壊的変更が発生しています:
- backup:
AWS::Backup::RestoreTestingPlanからScheduleStatusプロパティが削除されました - eks:
AWS::EKS::PodIdentityAssociationからDisableSessionTags、TargetRoleArnプロパティとExternalId属性が削除されました - neptune:
AWS::Neptune::DBSubnetGroupからId属性が削除されました - rds:
AWS::RDS::DBInstanceからCertificateDetailsとEndpointプロパティが削除されました - redshiftserverless:
AWS::RedshiftServerless::WorkgroupからWorkgroup.BaseCapacity属性が削除されました
S3 Deployment: JSONエスケープ動作の変更
Source.jsonData() で自動的に行われていたJSONエスケープが、オプトイン方式になりました。JSONファイル内の特殊文字を扱うためにエスケープ機能を使用していた場合は、第3引数に { escape: true } を明示的に渡す必要があります。
import * as s3deploy from 'aws-cdk-lib/aws-s3-deployment';
// 以前(自動的にエスケープされていた)
s3deploy.Source.jsonData('data.json', { key: 'value with "quotes"' });
// v2.190.0以降(明示的にescapeオプションを指定)
s3deploy.Source.jsonData('data.json', { key: 'value with "quotes"' }, { escape: true });
関連PR: #33698
EC2 Alpha: NAT Gateway追加時の論理ID変更
addNatGateways メソッドで定義されたNAT Gatewayの論理IDが変更され、NAT GatewayとElastic IPが再作成されます。また、EIPのドメインが vpc に設定されるようになりました。
関連PR: #34094
まとめ
AWS CDK v2.190.0 は、API Gateway V2のアクセスロギング、RDSインスタンスのLookup機能、S3レプリケーション設定の柔軟化など、実用的な機能が多数追加されたリリースです。また、Alphaモジュールでは、IPv6/Dualstackサポートが追加され、最新のAWSサービス要件に対応できるようになりました。
一部のL1リソースとS3 Deploymentのエスケープ動作に破壊的変更が含まれているため、アップグレード時には影響範囲を確認してください。