CDK部署EKS集群时Custom资源ETIMEDOUT超时失败求助
问题原因与解决方案
核心原因
你的问题根源在于CDK通过Vpc.fromLookup识别子网类型时的逻辑限制:
- CDK默认根据子网路由表判断类型:仅指向互联网网关(IGW)的子网被标记为
Public,指向NAT网关的为Private,无上述路由的则被归类为Isolated。 - 你的子网通过中转网关(Transit Gateway)实现互联网访问,不符合CDK默认的子网类型判定规则,因此被误标记为
Isolated。
这种误判导致CDK在部署EKS集群的自定义资源(如负责配置AwsAuth的Lambda函数)时,做出了错误的网络配置:
- 为Lambda函数分配的安全组默认不允许对外出站访问;
- 由于子网被标记为
Isolated,CDK不为Lambda分配弹性公网IP(EIP); - 最终Lambda无法通过中转网关访问所需的AWS服务端点(如STS、EKS控制平面),触发
ETIMEDOUT错误(你看到的34.223.18.133是AWS服务的公共端点IP,大概率是STS或EKS相关服务)。
解决方法
方法1:手动指定子网类型
在通过Subnet.fromSubnetId获取子网时,手动指定子网类型为PRIVATE_WITH_EGRESS,覆盖CDK的自动判定:
const az1Subnet = aws_ec2.Subnet.fromSubnetId( this, "az1Subnet", "subnet-abc", { subnetType: aws_ec2.SubnetType.PRIVATE_WITH_EGRESS } ); const az2Subnet = aws_ec2.Subnet.fromSubnetId( this, "az2Subnet", "subnet-xyz", { subnetType: aws_ec2.SubnetType.PRIVATE_WITH_EGRESS } );
这样CDK会将子网视为具有出站访问能力的私有子网,为Lambda函数配置正确的网络权限。
方法2:为自定义资源Lambda添加出站权限
显式配置EKS集群的自定义资源Lambda的安全组,允许HTTPS(443端口)出站访问:
const cluster = new aws_eks.Cluster(this, "MyCluster", { // 保留现有配置... kubectlLambdaRole: new aws_iam.Role(this, "KubectlRole", { assumedBy: new aws_iam.ServicePrincipal("lambda.amazonaws.com"), managedPolicies: [ aws_iam.ManagedPolicy.fromAwsManagedPolicyName("service-role/AWSLambdaVPCAccessExecutionRole") ] }), kubectlSecurityGroup: new aws_ec2.SecurityGroup(this, "KubectlSG", { vpc: existingVpc, allowAllOutbound: true // 可按需限制到AWS服务IP范围,增强安全性 }) });
同时确保子网的路由表已配置通过中转网关访问互联网的规则,且安全组允许与中转网关的通信。
方法3:调整EKS端点访问配置
将endpointAccess设为PUBLIC_AND_PRIVATE,并确保:
- EKS集群的公共端点访问控制列表(ACL)允许Lambda所在子网的IP范围;
- Lambda所在子网能通过中转网关访问互联网。
额外注意事项
- 修改配置后,需清理
cdk.context.json中的旧VPC信息,重新运行cdk synth获取正确的VPC元数据; - 若启用工作节点,需确保节点安全组允许与EKS控制平面通信,且节点能通过中转网关拉取容器镜像。
内容的提问来源于stack exchange,提问作者Roby
相关产品推荐
相关产品推荐

