AWS CDK创建EC2启动模板时自动生成额外用户数据,如何移除?
解决AWS CDK自动生成额外用户数据的问题
我之前也碰到过一模一样的情况!CDK悄悄给LaunchTemplate塞了一堆安装CodeDeploy Agent和AWS CLI的脚本,结果在RHEL上因为包名不兼容直接报错。下面分两种场景给你解决方案:
场景1:你的栈中用到了CodeDeploy部署组
如果是因为你在栈里创建了ServerDeploymentGroup并关联了这个LaunchTemplate,CDK会默认自动添加安装CodeDeploy Agent的脚本到用户数据里。要关闭这个自动行为,只需要在创建ServerDeploymentGroup时加上installAgent: false参数:
new aws_codedeploy.ServerDeploymentGroup(this, 'MyDeploymentGroup', { // 其他必要参数(比如关联的EC2实例标签、服务角色等) installAgent: false, // 关键:禁用CDK自动安装CodeDeploy Agent的逻辑 });
设置之后,CDK就不会再给你的LaunchTemplate追加那些自动生成的冗余脚本,你可以完全自主控制UserData的内容。
场景2:未使用CodeDeploy但仍自动生成脚本
如果你的栈里根本没涉及CodeDeploy,那大概率是CDK的默认逻辑在暗中追加内容。这时候你可以直接用自定义用户数据彻底覆盖默认行为,把ec2.UserData.forLinux()换成ec2.UserData.custom(),确保只有你编写的命令会被加入:
// 使用custom()创建完全自定义的用户数据,开头记得加#!/bin/bash指定解释器 const userData = ec2.UserData.custom(`#!/bin/bash yum -y update # 在这里添加你自己的CodeDeploy Agent安装命令,比如适配RHEL的版本: yum install -y ruby cd /home/ec2-user aws s3 cp s3://aws-codedeploy-us-east-1/latest/install . --region us-east-1 chmod +x ./install ./install auto `); new aws_ec2.LaunchTemplate(this, 'LaunchTemplate', { machineImage: ec2.MachineImage.lookup({ name: 'RHEL-8.6.0_HVM-20220503-x86_64-2-Hourly2-GP2', }), userData: userData, // 其他配置参数... });
额外提示
如果你之前已经部署过栈,修改UserData后不用担心更新问题——CDK默认会把UserData的变化视为需要替换LaunchTemplate(userDataCausesReplacement默认值为true),部署时会自动创建新的LaunchTemplate版本,旧版本不会影响新实例的启动。
内容的提问来源于stack exchange,提问作者Varid Vaya
相关产品推荐
相关产品推荐

