概要
AWS CDK v2.179.0では、API GatewayのプライベートAPI向けリソースポリシー設定の簡素化、Cognitoのパスワードレス認証とPasskey認証のサポート、EKS Hybrid Nodesの新しいL2コンストラクト、CodePipeline Commandsアクション、RDS Database Insightsなど、多数の新機能とバグ修正が含まれています。特にEKSモジュールでは、kubectlLayerプロパティが必須になる破壊的変更があります。
破壊的変更(BREAKING CHANGES)
eks: kubectlLayerプロパティが必須に (#32930)
EKSのClusterおよびFargateClusterコンストラクトで、kubectlLayerプロパティが必須になりました。従来のデフォルト値が古くなったため削除され、Kubernetesバージョンに応じて明示的に指定する必要があります。
移行方法:
import * as eks from 'aws-cdk-lib/aws-eks';
import { KubectlV32Layer } from '@aws-cdk/lambda-layer-kubectl-v32';
const cluster = new eks.Cluster(this, 'MyCluster', {
version: eks.KubernetesVersion.V1_32,
// 必須: kubectlLayerを明示的に指定
kubectlLayer: new KubectlV32Layer(this, 'KubectlLayer'),
});
新機能
API Gateway: プライベートAPI向けリソースポリシー設定の簡素化 (#32719)
プライベートAPIを作成する際のリソースポリシー設定が簡素化されました。addToResourcePolicy()とgrantInvokeToVpcEndpoint()メソッドが追加されました。
従来の方法:
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
import * as iam from 'aws-cdk-lib/aws-iam';
new apigateway.RestApi(this, 'PrivateRestApi', {
endpointTypes: [apigateway.EndpointType.PRIVATE],
handler: fn,
policy: new iam.PolicyDocument({
statements: [
new iam.PolicyStatement({
principals: [new iam.AnyPrincipal],
actions: ['execute-api:Invoke'],
resources: ['execute-api:/*'],
effect: iam.Effect.DENY,
conditions: {
StringNotEquals: {
"aws:SourceVpce": vpcEndpoint.vpcEndpointId
}
}
}),
new iam.PolicyStatement({
principals: [new iam.AnyPrincipal],
actions: ['execute-api:Invoke'],
resources: ['execute-api:/*'],
effect: iam.Effect.ALLOW
})
]
})
});
新しい方法:
import * as apigateway from 'aws-cdk-lib/aws-apigateway';
const api = new apigateway.RestApi(this, 'PrivateRestApi', {
endpointTypes: [apigateway.EndpointType.PRIVATE],
handler: fn,
});
// 特定のVPCエンドポイントからのアクセスを許可
api.grantInvokeToVpcEndpoint(vpcEndpoint);
addToResourcePolicy()を使用してカスタムポリシーを追加することも可能です:
api.addToResourcePolicy(
new iam.PolicyStatement({
principals: [new iam.AccountPrincipal('123456789012')],
actions: ['execute-api:Invoke'],
resources: ['execute-api:/*'],
effect: iam.Effect.ALLOW,
})
);
API Gateway v2: Stageで詳細メトリクスの有効化 (#33267)
HTTP APIとWebSocket APIのステージで、詳細メトリクスを有効化するdetailedMetricsEnabledプロパティが追加されました。
import * as apigatewayv2 from 'aws-cdk-lib/aws-apigatewayv2';
const httpApi = new apigatewayv2.HttpApi(this, 'HttpApi');
new apigatewayv2.HttpStage(this, 'Stage', {
httpApi,
stageName: 'prod',
// 詳細メトリクスを有効化(デフォルト: false)
detailedMetricsEnabled: true,
});
WebSocket APIでも同様に使用できます:
const webSocketApi = new apigatewayv2.WebSocketApi(this, 'WebSocketApi', {
connectRouteOptions: { integration: connectIntegration },
});
new apigatewayv2.WebSocketStage(this, 'Stage', {
webSocketApi,
stageName: 'prod',
// 詳細メトリクスを有効化
detailedMetricsEnabled: true,
});
API Gateway v2 Integrations: SQS統合のサポート (#29646)
HTTP APIでAmazon SQSとの統合がサポートされました。EventBridgeを経由せずに、HTTP APIから直接SQSキューにメッセージを送信できます。
import * as apigatewayv2 from 'aws-cdk-lib/aws-apigatewayv2';
import { HttpSqsIntegration } from 'aws-cdk-lib/aws-apigatewayv2-integrations';
import * as sqs from 'aws-cdk-lib/aws-sqs';
const queue = new sqs.Queue(this, 'Queue');
const httpApi = new apigatewayv2.HttpApi(this, 'HttpApi');
httpApi.addRoutes({
path: '/message',
methods: [apigatewayv2.HttpMethod.POST],
// SQSキューへの統合
integration: new HttpSqsIntegration('SqsIntegration', queue),
});
CodeBuild: Fleet向け属性ベースのコンピュートタイプ (#32251)
CodeBuild Fleetで属性ベースのコンピュートタイプが使用できるようになりました。最小のvCPU、ディスク、メモリサイズを指定すると、CodeBuildが自動的にインスタンスタイプを選択します。
import * as codebuild from 'aws-cdk-lib/aws-codebuild';
const fleet = new codebuild.Fleet(this, 'Fleet', {
// 属性ベースのコンピュート設定
computeConfiguration: {
vCpu: 4, // 最小vCPU数
memory: 8192, // 最小メモリ(MiB)
disk: 50, // 最小ディスクサイズ(GiB)
},
environmentType: codebuild.EnvironmentType.LINUX_CONTAINER,
baseCapacity: 1,
});
// Fleetを使用するプロジェクト
new codebuild.Project(this, 'Project', {
fleet,
buildSpec: codebuild.BuildSpec.fromObject({
version: '0.2',
phases: {
build: {
commands: ['echo "Hello from Fleet"'],
},
},
}),
});
特定のコンピュートタイプを指定する従来の方法も引き続き使用できます:
const fleet = new codebuild.Fleet(this, 'Fleet', {
computeType: codebuild.ComputeType.SMALL, // 従来の方法
environmentType: codebuild.EnvironmentType.LINUX_CONTAINER,
baseCapacity: 1,
});
CodePipeline: Commandsアクションのサポート (#31667)
CodePipelineで新しい汎用コンピュートアクション「Commands」がサポートされました。任意のシェルコマンドをパイプライン内で実行できます。
import * as codepipeline from 'aws-cdk-lib/aws-codepipeline';
import * as codepipeline_actions from 'aws-cdk-lib/aws-codepipeline-actions';
import * as s3 from 'aws-cdk-lib/aws-s3';
const sourceOutput = new codepipeline.Artifact();
const buildOutput = new codepipeline.Artifact();
const pipeline = new codepipeline.Pipeline(this, 'Pipeline');
pipeline.addStage({
stageName: 'Source',
actions: [
new codepipeline_actions.S3SourceAction({
actionName: 'S3Source',
bucket: sourceBucket,
bucketKey: 'source.zip',
output: sourceOutput,
}),
],
});
pipeline.addStage({
stageName: 'Build',
actions: [
// 新機能: Commandsアクション
new codepipeline_actions.CommandsAction({
actionName: 'CustomBuild',
input: sourceOutput,
outputs: [buildOutput],
// 実行するコマンド
commands: [
'npm install',
'npm run build',
'npm test',
],
// コンピュート設定(オプション)
computeConfiguration: {
vCpu: 4, // vCPU数(デフォルト: 2)
memory: 8192, // メモリ(MiB、デフォルト: 4096)
disk: 50, // ディスクサイズ(GiB、デフォルト: 20)
},
// タイムアウト(オプション、デフォルト: 1時間)
timeout: Duration.hours(2),
// 環境変数(オプション)
environmentVariables: {
NODE_ENV: { value: 'production' },
},
}),
],
});
Cognito: ユーザープールクライアントでのAnalytics設定 (#32862)
Cognito UserPoolClientで、Amazon PinpointまたはKinesis Data Firehoseを使用した分析設定がサポートされました。
import * as cognito from 'aws-cdk-lib/aws-cognito';
const userPool = new cognito.UserPool(this, 'UserPool');
const client = userPool.addClient('Client', {
// Amazon Pinpoint統合
analytics: {
applicationId: 'pinpoint-app-id',
applicationArn: 'arn:aws:mobiletargeting:us-east-1:123456789012:apps/pinpoint-app-id',
externalId: 'external-id', // Pinpointアプリケーションの外部ID
roleArn: 'arn:aws:iam::123456789012:role/CognitoAnalyticsRole',
userDataShared: true, // ユーザーデータを共有(デフォルト: false)
},
});
Kinesis Data Firehoseへのストリーミングも可能です:
const client = userPool.addClient('Client', {
analytics: {
applicationId: 'firehose-stream',
applicationArn: 'arn:aws:firehose:us-east-1:123456789012:deliverystream/my-stream',
userDataShared: false,
},
});
Cognito: パスワードレス認証とPasskey認証のサポート (#32369)
Cognitoユーザープールで、パスワードレス認証(EMAIL_OTPまたはSMS_OTP)とPasskey(WebAuthn)認証がサポートされました。
パスワードレス認証(EMAIL_OTP):
import * as cognito from 'aws-cdk-lib/aws-cognito';
const userPool = new cognito.UserPool(this, 'UserPool', {
// メール認証を有効化
signInAliases: {
email: true,
},
// 許可する第一認証要素
allowedFirstAuthFactors: [
cognito.SignInAuthenticationFactor.EMAIL_OTP, // メールOTP認証
],
});
const client = userPool.addClient('Client', {
authFlows: {
userAuth: true, // USER_AUTHフローを有効化
},
});
Passkey認証(WebAuthn):
const userPool = new cognito.UserPool(this, 'UserPool', {
signInAliases: {
email: true,
},
allowedFirstAuthFactors: [
cognito.SignInAuthenticationFactor.WEB_AUTHN, // Passkey認証
cognito.SignInAuthenticationFactor.EMAIL_OTP, // フォールバック
],
// Passkey設定
passkeyRelyingPartyId: 'example.com', // 認証ドメイン
passkeyUserVerification: cognito.UserVerification.REQUIRED, // ユーザー検証レベル(REQUIRED または PREFERRED)
});
const client = userPool.addClient('Client', {
authFlows: {
userAuth: true, // USER_AUTHフローを有効化
},
});
複数の認証方法を組み合わせることも可能です:
const userPool = new cognito.UserPool(this, 'UserPool', {
signInAliases: {
email: true,
},
allowedFirstAuthFactors: [
cognito.SignInAuthenticationFactor.WEB_AUTHN, // Passkey
cognito.SignInAuthenticationFactor.EMAIL_OTP, // メールOTP
cognito.SignInAuthenticationFactor.PASSWORD, // パスワード
cognito.SignInAuthenticationFactor.PASSWORD_SRP, // パスワードSRP
],
});
EKS: Hybrid Nodesのサポート (#32389)
オンプレミス環境のノードをEKSクラスターに追加できるEKS Hybrid Nodesをサポートする新しいL2コンストラクトが追加されました。
import * as eks from 'aws-cdk-lib/aws-eks';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
const cluster = new eks.Cluster(this, 'Cluster', {
version: eks.KubernetesVersion.V1_32,
kubectlLayer: new KubectlV32Layer(this, 'KubectlLayer'),
// リモートノード用のネットワーク設定
remoteNodeNetworks: [
{
cidrs: ['10.100.0.0/16'], // オンプレミスノードのCIDR範囲
},
],
// リモートPod用のネットワーク設定(オプション)
remotePodNetworks: [
{
cidrs: ['10.200.0.0/16'], // オンプレミスPodのCIDR範囲
},
],
});
注意: リモートノードとPodのCIDR範囲は、VPCのCIDR範囲やEKSクラスターのサービスCIDR範囲と重複しないように設定する必要があります。
EKS: Kubernetes 1.32のサポート (#33339)
EKSでKubernetes 1.32がサポートされました。
import * as eks from 'aws-cdk-lib/aws-eks';
const cluster = new eks.Cluster(this, 'Cluster', {
version: eks.KubernetesVersion.V1_32, // Kubernetes 1.32
kubectlLayer: new KubectlV32Layer(this, 'KubectlLayer'),
});
Elastic Load Balancing v2: 最小LCU予約のサポート (#32382)
Application Load BalancerとNetwork Load Balancerで、最小Load Balancer Capacity Unit (LCU)の予約がサポートされました。予測可能なトラフィックパターンがある場合に、コストを最適化できます。
Application Load Balancer:
import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';
const alb = new elbv2.ApplicationLoadBalancer(this, 'ALB', {
vpc,
internetFacing: true,
// 最小LCU予約数(1〜1000)
minimumCapacityUnit: 50, // 50 LCUを予約
});
Network Load Balancer:
const nlb = new elbv2.NetworkLoadBalancer(this, 'NLB', {
vpc,
internetFacing: true,
// 最小LCU予約数(1〜1000)
minimumCapacityUnit: 100, // 100 LCUを予約
});
最小LCU予約により、トラフィックの急増に備えた容量を確保し、より予測可能な請求を実現できます。
EventBridge Targets: ECSタスクの全てのTaskOverridesをサポート (#32344)
EventBridgeルールのECSタスクターゲットで、全てのTaskOverrideプロパティがサポートされました。従来はcontainerOverridesのみでしたが、cpu、memory、taskRoleArnなども指定できるようになりました。
import * as events from 'aws-cdk-lib/aws-events';
import * as targets from 'aws-cdk-lib/aws-events-targets';
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as iam from 'aws-cdk-lib/aws-iam';
const rule = new events.Rule(this, 'Rule', {
schedule: events.Schedule.rate(Duration.hours(1)),
});
rule.addTarget(new targets.EcsTask({
cluster,
taskDefinition,
// 全てのTaskOverridesを指定可能
taskOverrides: {
cpu: '512', // CPUユニットをオーバーライド
memory: '1024', // メモリ(MiB)をオーバーライド
taskRoleArn: customRole.roleArn, // タスクロールをオーバーライド
executionRoleArn: execRole.roleArn, // 実行ロールをオーバーライド
// コンテナオーバーライド
containerOverrides: [{
containerName: 'web',
command: ['npm', 'run', 'scheduled-task'],
environment: [
{ name: 'TASK_TYPE', value: 'scheduled' },
],
cpu: 256,
memory: 512,
}],
},
}));
CloudWatch Logs: JSONメトリクスフィルターでの正規表現サポート (#30741)
CloudWatch LogsのJSONメトリクスフィルターで正規表現パターンがサポートされました。
import * as logs from 'aws-cdk-lib/aws-logs';
import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
const logGroup = new logs.LogGroup(this, 'LogGroup');
new logs.MetricFilter(this, 'MetricFilter', {
logGroup,
// 正規表現パターンを使用(%で囲む)
filterPattern: logs.JsonPattern.regexString(
'$.eventType',
'%ERROR.*%' // eventTypeフィールドがERRORで始まる場合にマッチ
),
metricNamespace: 'MyApp',
metricName: 'ErrorCount',
metricValue: '1',
});
通常の文字列パターンと組み合わせることも可能です:
new logs.MetricFilter(this, 'MetricFilter', {
logGroup,
filterPattern: logs.JsonPattern.all(
logs.JsonPattern.stringValue('$.status', '=', 'failed'),
logs.JsonPattern.regexString('$.message', '%timeout.*%'),
),
metricNamespace: 'MyApp',
metricName: 'TimeoutFailures',
metricValue: '1',
});
RDS: Aurora DatabasesでのDatabase Insightsサポート (#32851)
Amazon CloudWatch Database Insightsのサポートが追加されました。StandardモードとAdvancedモードが利用可能です。
Standardモード(デフォルト):
import * as rds from 'aws-cdk-lib/aws-rds';
const cluster = new rds.DatabaseCluster(this, 'Cluster', {
engine: rds.DatabaseClusterEngine.auroraPostgres({
version: rds.AuroraPostgresEngineVersion.VER_16_0,
}),
writer: rds.ClusterInstance.provisioned('writer'),
vpc,
// Database Insightsはデフォルトで有効
});
Advancedモード:
Advancedモードを使用するには、Performance Insightsを有効化し、保持期間を465日に設定する必要があります。
const cluster = new rds.DatabaseCluster(this, 'Cluster', {
engine: rds.DatabaseClusterEngine.auroraPostgres({
version: rds.AuroraPostgresEngineVersion.VER_16_0,
}),
writer: rds.ClusterInstance.provisioned('writer', {
// Performance Insightsを有効化
enablePerformanceInsights: true,
// 465日保持(Advancedモードに必須)
performanceInsightRetention: rds.PerformanceInsightRetention.LONG_TERM,
}),
vpc,
// Advancedモードを有効化
databaseInsightsMode: rds.DatabaseInsightsMode.ADVANCED,
});
Step Functions Tasks: CallAwsServiceでのリージョンオーバーライド (#33252)
Step FunctionsのCallAwsServiceタスクで、リージョンをオーバーライドできるようになりました。
import * as sfn from 'aws-cdk-lib/aws-stepfunctions';
import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';
const task = new tasks.CallAwsService(this, 'GetObject', {
service: 's3',
action: 'getObject',
parameters: {
Bucket: 'my-bucket',
Key: 'my-key',
},
iamResources: ['*'],
// リージョンをオーバーライド
region: 'us-west-2', // デフォルト: 現在のリージョン
});
Alphaモジュール
eks-v2-alpha: Kubernetes 1.32のサポート (#33344)
Alpha版のEKS v2モジュールでもKubernetes 1.32がサポートされました。
ivs-alpha: Multitrack Videoのサポート (#33370)
IVS(Interactive Video Service)でMultitrack Video機能がサポートされました。複数の音声/映像トラックを配信できます。
import * as ivs from '@aws-cdk/aws-ivs-alpha';
const channel = new ivs.Channel(this, 'Channel', {
// コンテナフォーマット
containerFormat: ivs.ContainerFormat.FRAGMENTED_MP4, // fMP4形式
// マルチトラック入力設定
multitrackInputConfiguration: {
enabled: true, // マルチトラック入力を有効化
maximumResolution: ivs.MaximumResolution.FULL_HD, // 最大解像度(STANDARD_DEFINITION, STANDARD_PORTRAIT, FULL_HD)
policy: ivs.MultitrackPolicy.ALLOW, // ポリシー(ALLOW または REQUIRE)
},
});
cognito-identitypool-alpha: RoleAttachmentコンストラクトの削除 (#33305)
破壊的変更: IdentityPoolRoleAttachmentコンストラクトとIdentityPool.addRoleMappings()関数が削除されました。Identity Poolごとに1つのロールアタッチメントのみ存在できることを明確にするための変更です。
ロールマッピングが必要な場合は、IdentityPool作成時に指定してください:
import * as cognito from '@aws-cdk/aws-cognito-identitypool-alpha';
const identityPool = new cognito.IdentityPool(this, 'IdentityPool', {
identityPoolName: 'MyIdentityPool',
// ロールマッピングをIdentityPool作成時に指定
roleMappings: [
{
mappingKey: 'userpool',
providerUrl: cognito.IdentityPoolProviderUrl.userPool(userPool),
resolveAmbiguousRoles: false,
rules: [
{
claim: 'isAdmin',
claimValue: 'true',
mappedRole: adminRole,
},
],
},
],
});
integ-tests-alpha: HTTPリクエストのflattenResponse (#30361)
統合テストのHTTPアサーションで、レスポンスをフラット化する機能が修正されました。
msk-alpha: SASL/SCRAMとIAM認証の両方を許可 (#31743)
Amazon MSKクラスターで、SASL/SCRAM認証とIAM認証を同時に有効化できるようになりました。
import * as msk from '@aws-cdk/aws-msk-alpha';
const cluster = new msk.Cluster(this, 'Cluster', {
clusterName: 'MyCluster',
kafkaVersion: msk.KafkaVersion.V3_4_0,
vpc,
// SASL/SCRAMとIAM認証を両方有効化
clientAuthentication: msk.ClientAuthentication.saslIam({
iam: true,
scram: true,
}),
});
バグ修正
CLI
cdk diffがデプロイロールでタグを要求する場合に失敗する問題を修正 (#33340)- プラグインによって更新された認証情報が表示されないように修正 (#33398)
- initテンプレートが異なるバージョンを想定する問題を修正 (#33449)
- ガベージコレクション時に古いsetIntervalがクリアされない問題を修正 (#32985)
EKS
cluster.addHelmChartでskipCrdsオプションが無視される問題を修正 (#31832)
OpenSearch Service
- IOPS制限チェックが誤っている問題を修正 (#33401)
CDK Import
- CDK Import時にバンドル処理がスキップされて失敗する問題を修正 (#33322)
Lambda Event Sources
- NPMシンボリックリンクワークスペースで
SelfManagedKafkaEventSourceが使用できない問題を修正 (#32937)
Step Functions Tasks
CallAwsServiceCrossRegionがWAIT_FOR_TASK_TOKENで動作しない問題を修正 (#32807)
VPC
- VPCエンドポイントのPayment Cryptographyのタイポを修正 (#33018)
まとめ
AWS CDK v2.179.0は、API Gateway、Cognito、EKS、CodeBuild、CodePipeline、RDSなど、多くのサービスで新機能が追加された大規模なリリースです。特に以下の機能が注目されます:
- API Gateway: プライベートAPI設定の簡素化とSQS統合
- Cognito: パスワードレス認証とPasskey認証のサポート
- EKS: Hybrid Nodesサポートとkubectl必須化
- CodePipeline: 汎用Commandsアクション
- RDS: Database Insightsサポート
EKSユーザーは、kubectlLayerプロパティが必須になる破壊的変更に注意が必要です。その他のモジュールでは、エラーハンドリングの改善(ValidationErrorへの移行)も進んでいます。
詳細は公式リリースノートを参照してください。