Back to Releases
v2.180.0 2025年2月21日

AWS CDK v2.180.0 リリース解説

CloudFrontでgRPCとVPCオリジンのサポート、Kinesisストリームコンシューマーの追加など、複数のサービスで重要な新機能が追加されました。

cloudfrontkinesissescodepipelineglue

AWS CDK v2.180.0がリリースされました。このバージョンでは、CloudFrontでのgRPCサポートとVPCオリジン機能、Kinesisストリームコンシューマー、SES ConfigurationSetの新しい宛先サポートなど、多くの新機能が追加されています。

新機能

CloudFront: gRPCサポート

CloudFront DistributionでgRPCプロトコルをサポートする機能が追加されました。BehaviorOptionsenableGrpcプロパティを指定することで、gRPCトラフィックを有効化できます。

import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import * as origins from 'aws-cdk-lib/aws-cloudfront-origins';

const distribution = new cloudfront.Distribution(this, 'MyDistribution', {
  defaultBehavior: {
    origin: new origins.HttpOrigin('example.com'),
    enableGrpc: true,  // gRPCを有効化
  },
  additionalBehaviors: {
    '/api/*': {
      origin: new origins.HttpOrigin('api.example.com'),
      enableGrpc: true,  // 特定のパスでgRPCを有効化
    },
  },
});

関連PR: #32535

CloudFront: VPCオリジン

CloudFrontからVPC内のプライベートリソース(ALB、NLB、EC2インスタンス)に直接アクセスできるVPCオリジン機能が追加されました。

VPCOriginリソースの作成

cloudfront.VpcOriginコンストラクトを使用して、VPCオリジンリソースを明示的に作成できます。

import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';

// EC2インスタンスをエンドポイントとして指定
const vpcOrigin = new cloudfront.VpcOrigin(this, 'VpcOrigin', {
  endpoint: cloudfront.VpcOriginEndpoint.fromEc2Instance(instance),
  vpcOriginName: 'MyVpcOrigin',       // VPCオリジンの名前(オプション)
  httpPort: 80,                       // HTTPポート(デフォルト: 80)
  httpsPort: 443,                     // HTTPSポート(デフォルト: 443)
  protocolPolicy: cloudfront.OriginProtocolPolicy.MATCH_VIEWER,  // プロトコルポリシー
  originSslProtocols: [cloudfront.OriginSslPolicy.TLSV1_2],      // SSLプロトコル
});

// Application Load Balancerをエンドポイントとして指定
const albVpcOrigin = new cloudfront.VpcOrigin(this, 'AlbVpcOrigin', {
  endpoint: cloudfront.VpcOriginEndpoint.fromApplicationLoadBalancer(alb),
});

// Network Load Balancerをエンドポイントとして指定
const nlbVpcOrigin = new cloudfront.VpcOrigin(this, 'NlbVpcOrigin', {
  endpoint: cloudfront.VpcOriginEndpoint.fromNetworkLoadBalancer(nlb),
});

// ARNからエンドポイントを指定(インポートされたリソース用)
const importedVpcOrigin = new cloudfront.VpcOrigin(this, 'ImportedVpcOrigin', {
  endpoint: new cloudfront.VpcOriginEndpoint({ endpointArn: 'arn:aws:...' }),
});

Distributionでの使用

cloudfront_origins.VpcOriginクラスを使用して、DistributionにVPCオリジンを設定できます。

import * as origins from 'aws-cdk-lib/aws-cloudfront-origins';

// EC2インスタンスをVPCオリジンとして使用
const distribution = new cloudfront.Distribution(this, 'Distribution', {
  defaultBehavior: {
    origin: origins.VpcOrigin.withEc2Instance(instance, {
      domainName: 'internal.example.com',           // ドメイン名(デフォルト: インスタンスのPrivateDnsName)
      readTimeout: cdk.Duration.seconds(30),        // 読み取りタイムアウト
      keepaliveTimeout: cdk.Duration.seconds(5),    // キープアライブタイムアウト
      // VPCオリジンリソース設定
      vpcOriginName: 'MyVpcOrigin',
      httpPort: 80,
      httpsPort: 443,
      protocolPolicy: cloudfront.OriginProtocolPolicy.MATCH_VIEWER,
      originSslProtocols: [cloudfront.OriginSslPolicy.TLSV1_2],
      // 共通のオリジン設定
      connectionTimeout: cdk.Duration.seconds(10),  // 接続タイムアウト
      connectionAttempts: 3,                        // 接続試行回数
      customHeaders: { 'X-Custom-Header': 'value' },
      originShieldRegion: 'us-east-1',              // Origin Shieldのリージョン
      originShieldEnabled: true,
      originId: 'my-vpc-origin',
    }),
  },
});

// ALBをVPCオリジンとして使用
const albDistribution = new cloudfront.Distribution(this, 'AlbDistribution', {
  defaultBehavior: {
    origin: origins.VpcOrigin.withApplicationLoadBalancer(alb, {
      domainName: 'internal-alb.example.com',  // デフォルト: ALBのDNSName
      readTimeout: cdk.Duration.seconds(30),
      keepaliveTimeout: cdk.Duration.seconds(5),
    }),
  },
});

// NLBをVPCオリジンとして使用
const nlbDistribution = new cloudfront.Distribution(this, 'NlbDistribution', {
  defaultBehavior: {
    origin: origins.VpcOrigin.withNetworkLoadBalancer(nlb, {
      domainName: 'internal-nlb.example.com',  // デフォルト: NLBのDNSName
      readTimeout: cdk.Duration.seconds(30),
      keepaliveTimeout: cdk.Duration.seconds(5),
    }),
  },
});

// 明示的に作成したVPCオリジンリソースを使用
const sharedDistribution = new cloudfront.Distribution(this, 'SharedDistribution', {
  defaultBehavior: {
    origin: origins.VpcOrigin.withVpcOrigin(vpcOrigin, {
      domainName: 'internal.example.com',      // vpcOriginがdomainNameなしで作成された場合は必須
      readTimeout: cdk.Duration.seconds(30),
      keepaliveTimeout: cdk.Duration.seconds(5),
    }),
  },
});

関連PR: #33318

CloudFront Origins: バージョン管理されたオブジェクトへの読み取りアクセス

S3バケットオリジンのOrigin Access Control (OAC)で、バージョン管理されたオブジェクトへのアクセスをサポートする新しいアクセスレベルREAD_VERSIONEDが追加されました。

import * as cloudfront from 'aws-cdk-lib/aws-cloudfront';
import * as origins from 'aws-cdk-lib/aws-cloudfront-origins';
import * as s3 from 'aws-cdk-lib/aws-s3';

// バージョン管理が有効なS3バケット
const bucket = new s3.Bucket(this, 'MyBucket', {
  versioned: true,
});

const distribution = new cloudfront.Distribution(this, 'Distribution', {
  defaultBehavior: {
    origin: origins.S3BucketOrigin.withOriginAccessControl(bucket, {
      originAccessLevels: [
        origins.AccessLevel.READ,             // 通常の読み取りアクセス
        origins.AccessLevel.READ_VERSIONED,   // バージョン管理されたオブジェクトへの読み取りアクセス
      ],
    }),
  },
});

この設定により、S3バケットポリシーにs3:GetObjectVersion権限が自動的に追加され、CloudFrontがオブジェクトの過去のバージョンにアクセスできるようになります。

関連PR: #33038

Kinesis: ストリームコンシューマーのサポート

Kinesis Data StreamsのEnhanced Fan-Out機能を使用するストリームコンシューマーをL2コンストラクトで作成できるようになりました。クロスアカウントでのストリーム利用もサポートされています。

StreamConsumerの作成

import * as kinesis from 'aws-cdk-lib/aws-kinesis';

// Kinesisストリームの作成
const stream = new kinesis.Stream(this, 'MyStream', {
  shardCount: 1,
});

// ストリームコンシューマーの作成
const consumer = new kinesis.StreamConsumer(this, 'MyConsumer', {
  stream: stream,
  consumerName: 'my-consumer',
});

// コンシューマーのARNを取得
const consumerArn = consumer.consumerArn;

リソースポリシーの設定

// コンシューマーにリソースポリシーを追加
consumer.addToResourcePolicy(new iam.PolicyStatement({
  effect: iam.Effect.ALLOW,
  principals: [new iam.AccountPrincipal('123456789012')],  // 他のAWSアカウント
  actions: [
    'kinesis:DescribeStreamConsumer',
    'kinesis:SubscribeToShard',
  ],
  resources: [consumer.consumerArn],
}));

権限の付与

import * as lambda from 'aws-cdk-lib/aws-lambda';

const fn = new lambda.Function(this, 'MyFunction', {
  runtime: lambda.Runtime.NODEJS_20_X,
  handler: 'index.handler',
  code: lambda.Code.fromInline('exports.handler = async () => {}'),
});

// コンシューマーへの読み取り権限を付与
consumer.grantRead(fn);

// コンシューマーへの完全な権限を付与
consumer.grant(fn,
  'kinesis:DescribeStreamConsumer',
  'kinesis:SubscribeToShard'
);

Lambdaイベントソースとしての使用

import * as lambda_events from 'aws-cdk-lib/aws-lambda-event-sources';

// ストリームコンシューマーをLambdaのイベントソースとして使用
fn.addEventSource(new lambda_events.KinesisEventSource(consumer, {
  startingPosition: lambda.StartingPosition.TRIM_HORIZON,  // 読み取り開始位置
  batchSize: 100,                                           // バッチサイズ(デフォルト: 100)
  maxBatchingWindow: cdk.Duration.seconds(5),               // バッチングウィンドウ
  parallelizationFactor: 10,                                // 並列化係数
  retryAttempts: 3,                                         // リトライ回数
  onFailure: new destinations.SqsDestination(deadLetterQueue),  // 失敗時の宛先
}));

関連PR: #32087

SES: ConfigurationSetでEventBridgeとKinesis Data Firehoseのサポート

SES ConfigurationSetのイベント送信先として、デフォルトのEventBusとKinesis Data Firehoseがサポートされました。

EventBridgeへのイベント送信

import * as ses from 'aws-cdk-lib/aws-ses';

const configSet = new ses.ConfigurationSet(this, 'ConfigSet', {
  configurationSetName: 'my-config-set',
});

// デフォルトのEventBusにイベントを送信
configSet.addEventDestination('EventBridge', {
  destination: ses.EventDestination.eventBridge(),  // デフォルトのEventBus
  events: [
    ses.EmailSendingEvent.SEND,        // 送信イベント
    ses.EmailSendingEvent.DELIVERY,    // 配信イベント
    ses.EmailSendingEvent.BOUNCE,      // バウンスイベント
    ses.EmailSendingEvent.COMPLAINT,   // 苦情イベント
    ses.EmailSendingEvent.REJECT,      // 拒否イベント
    ses.EmailSendingEvent.OPEN,        // 開封イベント
    ses.EmailSendingEvent.CLICK,       // クリックイベント
  ],
});

Kinesis Data Firehoseへのイベント送信

import * as firehose from 'aws-cdk-lib/aws-kinesisfirehose';
import * as iam from 'aws-cdk-lib/aws-iam';

// Firehose配信ストリームの作成
const deliveryStream = new firehose.CfnDeliveryStream(this, 'DeliveryStream', {
  deliveryStreamName: 'ses-events-stream',
  // ...配信ストリームの設定
});

// SESがFirehoseに書き込むためのIAMロール
const firehoseRole = new iam.Role(this, 'FirehoseRole', {
  assumedBy: new iam.ServicePrincipal('ses.amazonaws.com'),
});

deliveryStream.grantPutRecords(firehoseRole);

// ConfigurationSetにFirehose送信先を追加
configSet.addEventDestination('Firehose', {
  destination: ses.EventDestination.firehose(deliveryStream, {
    role: firehoseRole,  // SESがFirehoseに書き込むためのロール
  }),
  events: [
    ses.EmailSendingEvent.SEND,
    ses.EmailSendingEvent.DELIVERY,
    ses.EmailSendingEvent.BOUNCE,
    ses.EmailSendingEvent.COMPLAINT,
  ],
});

関連PR: #33093

CodePipeline: ManualApprovalActionのタイムアウトサポート

CodePipelineの手動承認アクションにtimeoutプロパティが追加され、承認待ちのタイムアウト時間をカスタマイズできるようになりました。

import * as codepipeline from 'aws-cdk-lib/aws-codepipeline';
import * as codepipeline_actions from 'aws-cdk-lib/aws-codepipeline-actions';
import * as cdk from 'aws-cdk-lib';

const pipeline = new codepipeline.Pipeline(this, 'Pipeline');

const approvalStage = pipeline.addStage({
  stageName: 'Approval',
});

approvalStage.addAction(new codepipeline_actions.ManualApprovalAction({
  actionName: 'ManualApproval',
  timeout: cdk.Duration.days(5),  // タイムアウト時間(5分〜60日の範囲で設定可能)
  notificationTopic: topic,        // 承認通知用のSNSトピック(オプション)
  additionalInformation: 'Please review and approve this deployment.',  // 追加情報
}));

設定可能な範囲:

  • 最小値: 5分
  • 最大値: 60日(86,400分)
  • デフォルト: 7日(アカウントレベルのデフォルト)

関連PR: #33472

CloudWatch: ValidationErrorsの導入

CloudWatchモジュールで、型付けされていない汎用的なErrorの代わりにValidationErrorsをスローするように改善されました。これにより、エラーハンドリングがより明確になります。

関連PR: #33456

Alphaモジュール

Glue (Alpha): PySparkジョブでの追加JARサポート

Glue PySparkジョブL2コンストラクトで、追加のJARファイル依存関係を指定できるextraJarsパラメータが追加されました。

import * as glue from '@aws-cdk/aws-glue-alpha';
import * as s3 from 'aws-cdk-lib/aws-s3';

const bucket = new s3.Bucket(this, 'JarBucket');

// PySparkジョブに追加のJARを指定
const etlJob = new glue.PySparkEtlJob(this, 'PySparkJob', {
  script: glue.Code.fromBucket(bucket, 'scripts/etl.py'),
  role: role,
  extraJars: [
    glue.Code.fromBucket(bucket, 'jars/custom-lib.jar'),     // カスタムライブラリ
    glue.Code.fromBucket(bucket, 'jars/data-connector.jar'), // データコネクタ
  ],
});

// PySparkストリーミングジョブでも同様に使用可能
const streamingJob = new glue.PySparkStreamingJob(this, 'StreamingJob', {
  script: glue.Code.fromBucket(bucket, 'scripts/streaming.py'),
  role: role,
  extraJars: [
    glue.Code.fromBucket(bucket, 'jars/streaming-lib.jar'),
  ],
});

// Flex ETLジョブでも同様
const flexJob = new glue.PySparkFlexEtlJob(this, 'FlexJob', {
  script: glue.Code.fromBucket(bucket, 'scripts/flex-etl.py'),
  role: role,
  extraJars: [
    glue.Code.fromBucket(bucket, 'jars/flex-lib.jar'),
  ],
});

関連PR: #33238

バグ修正

Core: プロパティ上書き時の警告追加

CDKコアモジュールで、プロパティが上書きされる際に警告が表示されるようになりました。これにより、意図しない設定の上書きを早期に検出できます。

関連PR: #33507

Lambda: addToRolePolicyの循環依存修正

LambdaのaddToRolePolicyメソッドで、循環依存の可能性がある問題が修正されました。この修正はフィーチャーフラグで制御されています。

関連PR: #33291

Logs: DataProtectionPolicyのテンプレートキー修正

CloudWatch LogsのDataProtectionPolicyで、テンプレートキーがPascalCase(大文字始まり)になるように修正されました。

関連PR: #33462

Step Functions: ログ無効時のLogGroup要件修正

Step Functionsでログを無効にした場合でも、LogGroupが必要とされる問題が修正されました。

関連PR: #30816

Step Functions: JSONataクエリ言語の修正

Step FunctionsでのJSONataクエリ言語の複数の問題が修正されました。

関連PR: #33404

まとめ

AWS CDK v2.180.0では、CloudFrontのgRPCサポートとVPCオリジン機能、Kinesisストリームコンシューマー、SES ConfigurationSetの新しい宛先サポートなど、多くの実用的な新機能が追加されました。特にCloudFrontのVPCオリジン機能により、VPC内のプライベートリソースへの直接アクセスが可能になり、アーキテクチャの柔軟性が大幅に向上します。

また、CodePipelineの手動承認タイムアウトのカスタマイズや、Glue PySparkジョブでの追加JAR指定など、細かい改善も含まれており、より柔軟なインフラストラクチャ構築が可能になっています。

詳細なリリースノートはGitHubのリリースページをご確認ください。