概要
AWS CDK v2.248.0は、EKSクラスターのPRIVATE_ISOLATEDサブネット使用時のバリデーション挙動を修正したパッチリリースです。v2.246.0で追加された厳格なバリデーションが、AWSが公式にサポートする完全プライベートEKSクラスターのパターンをブロックしていた問題を解消します。
バグ修正
EKS: isolatedサブネットのバリデーションをエラーから警告にダウングレード (#37500)
v2.246.0で導入された、kubectl用にPRIVATE_ISOLATEDサブネットを使用した場合にValidationError(ハードエラー)をスローする挙動が修正されました。このエラーは、AWSが公式ドキュメントで明示的にサポートしている構成をブロックしてしまっていました。
問題の背景:
AWSでは、適切なVPCエンドポイント(STS、EKS、ECR、S3、CloudWatch Logsなど)を構成することで、isolatedサブネット上で完全プライベートなEKSクラスターを実行できます。しかし、v2.246.0以降ではこの正当な構成がCDKシンセス時にエラーとなり、合成できませんでした。
修正内容:
aws-eksおよびaws-eks-v2の両クラスター実装で、ValidationErrorをAnnotations.addWarningV2に変更- 警告ID:
@aws-cdk/aws-eks:isolatedSubnetsForKubectlPrivateSubnets PRIVATE_WITH_EGRESSサブネットおよびisolatedサブネットを持つインポート済みVPCの既存テストは従来通り動作
修正後の使い方: isolatedサブネット上の完全プライベートEKSクラスター
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as eks from 'aws-cdk-lib/aws-eks';
import { KubectlV32Layer } from '@aws-cdk/lambda-layer-kubectl-v32';
// isolatedサブネットのみを持つVPCを作成
const vpc = new ec2.Vpc(this, 'PrivateVpc', {
maxAzs: 3,
subnetConfiguration: [
{
name: 'isolated',
subnetType: ec2.SubnetType.PRIVATE_ISOLATED, // NAT Gatewayなしの完全プライベート
cidrMask: 24,
},
],
});
// プライベートクラスターに必要なVPCエンドポイントを追加
vpc.addInterfaceEndpoint('StsEndpoint', {
service: ec2.InterfaceVpcEndpointAwsService.STS,
});
vpc.addInterfaceEndpoint('EksEndpoint', {
service: ec2.InterfaceVpcEndpointAwsService.EKS,
});
vpc.addInterfaceEndpoint('EcrEndpoint', {
service: ec2.InterfaceVpcEndpointAwsService.ECR,
});
vpc.addInterfaceEndpoint('EcrDockerEndpoint', {
service: ec2.InterfaceVpcEndpointAwsService.ECR_DOCKER,
});
vpc.addInterfaceEndpoint('CloudWatchLogsEndpoint', {
service: ec2.InterfaceVpcEndpointAwsService.CLOUDWATCH_LOGS,
});
vpc.addGatewayEndpoint('S3Endpoint', {
service: ec2.GatewayVpcEndpointAwsService.S3,
});
// PRIVATE_ISOLATED サブネット上にEKSクラスターを作成
// v2.248.0以降はエラーではなく警告となり、合成が可能
const cluster = new eks.Cluster(this, 'PrivateCluster', {
version: eks.KubernetesVersion.V1_32,
kubectlLayer: new KubectlV32Layer(this, 'KubectlLayer'),
vpc,
vpcSubnets: [
{ subnetType: ec2.SubnetType.PRIVATE_ISOLATED }, // isolatedサブネットを指定可能に
],
endpointAccess: eks.EndpointAccess.PRIVATE, // APIエンドポイントもプライベートに
});
影響範囲:
- v2.246.0または2.247.0からアップグレードする場合、これまで
ValidationErrorで失敗していたスタックが合成できるようになります - 警告は引き続き表示されるため、VPCエンドポイントの構成不備に気付くきっかけにはなります
- 警告を抑制したい場合は、以下のように明示的に無効化できます
import { Annotations } from 'aws-cdk-lib';
// 警告を抑制(必要なVPCエンドポイントが揃っていることを確認した上で)
Annotations.of(cluster).acknowledgeWarning(
'@aws-cdk/aws-eks:isolatedSubnetsForKubectlPrivateSubnets',
'VPC endpoints for STS, EKS, ECR, S3, and CloudWatch Logs are configured',
);
Alphaモジュール (2.248.0-alpha.0)
このリリースではAlphaモジュールに特筆すべき変更はありません。
まとめ
AWS CDK v2.248.0は、EKS isolatedサブネット利用時のバリデーション修正に焦点を当てたパッチリリースです。
主なポイント:
- EKSバリデーション緩和:
PRIVATE_ISOLATEDサブネットでのkubectl使用がハードエラーから警告に変更され、完全プライベートクラスター構成が再び利用可能に - AWSサポートパターンの尊重: AWS公式ドキュメントで記載されている構成がCDKでも問題なくデプロイできるようになりました
アップグレード推奨:
- v2.246.0または2.247.0で
PRIVATE_ISOLATEDサブネットを使ったEKSクラスターがエラーで合成できなかった場合、本リリースへのアップグレードにより解消します