如何避免CDK Synth生成的CloudFormation模板包含EKS资产参数
如何避免CDK生成的CloudFormation模板中出现EKS相关资产参数
你遇到的问题核心是**eks.EksOptimizedImage会触发CDK创建自定义资产(包含节点启动脚本)**,这些资产对应的S3 Bucket参数在直接用AWS CLI部署导出模板时无法被自动填充,导致部署失败。要解决这个问题,我们可以绕过CDK的资产机制,直接使用AWS官方托管的EKS优化AMI,具体修改如下:
步骤1:替换EksOptimizedImage为SSM参数获取的官方AMI
首先在你的lib/eks.ts中,去掉对eks.EksOptimizedImage的依赖,改用AWS Systems Manager(SSM)参数来获取官方EKS优化AMI的ID——这是AWS提供的公共参数,不需要CDK生成额外资产。
修改代码:
- 先给EKS集群指定明确的Kubernetes版本(或者从集群对象中获取版本):
// 在clusterProps中添加版本配置,根据你的需求调整版本号 const clusterProps = { clusterName: current_env+eksClusterName, defaultCapacity: 0, vpc: vpc, mastersRole: clusterAdmin, version: eks.KubernetesVersion.V1_29 // 示例版本,可替换为你需要的版本 } const cluster = new eks.Cluster(this, eksClusterName, clusterProps);
- 通过SSM参数获取对应版本的EKS优化AMI:
// 根据集群版本构建SSM参数路径 const eksAmiParameter = `/aws/service/eks/optimized-ami/${cluster.version}/amazon-linux-2/recommended/image_id`; // 从SSM参数加载AMI const eksAmiId = ec2.MachineImage.fromSsmParameter(eksAmiParameter);
- 修改AutoScalingGroup的
machineImage配置,替换之前的nodeGroupMachineImage:
const rcAsg = new asg.AutoScalingGroup(this, current_env+'ASG', { vpc: vpc, instanceType: nodeGroupInstanceType, machineImage: eksAmiId, // 这里用新的AMI配置 // 以下原有配置保持不变 minCapacity: nodeGroupMinCapacity, maxCapacity: nodeGroupMaxCapacity, desiredCapacity: nodeGroupDesiredCapacity, updateType: asg.UpdateType.ROLLING_UPDATE, vpcSubnets: {subnetType: ec2.SubnetType.PRIVATE} });
步骤2:验证修改效果
重新运行cdk synth生成CloudFormation模板,你会发现模板中不再出现那些以AssetParameter开头的参数了——因为我们现在直接使用AWS托管的AMI,不需要CDK创建和管理额外的资产文件。
之后你就可以正常导出模板,用AWS CLI命令(比如aws cloudformation deploy)部署了。
额外说明
- 如果你需要使用GPU优化的EKS AMI,只需要修改SSM参数路径为
/aws/service/eks/optimized-ami/${cluster.version}/amazon-linux-2-gpu/recommended/image_id即可。 cluster.addAutoScalingGroup({ mapRole: true })会自动帮你配置节点的IAM角色权限,确保节点能正常加入EKS集群,这部分无需额外修改。
内容的提问来源于stack exchange,提问作者Tamizharasan
相关产品推荐
相关产品推荐

