如何通过AWS CDK在堡垒主机创建持久化Shell脚本?
解决CDK创建EC2堡垒主机时自动生成持久化Shell脚本的问题
你的核心需求是通过CDK创建堡垒主机时自动生成不会消失的Shell脚本,当前CFN.init配置未生效的主要原因有两点:
- CFN.init默认以
root用户执行,你指定的~对应root的家目录,而通过SSM连接堡垒主机默认使用ec2-user,因此无法看到该脚本 - 未正确设置文件的所有权,导致ec2-user无权限访问
以下是修正后的CDK代码及说明:
this.bastionHost = new BastionHostLinux(this, "BastionHost", { vpc: inspireStack.vpc, subnetSelection: { subnetType: SubnetType.PRIVATE_WITH_NAT }, instanceType: InstanceType.of(InstanceClass.T2, InstanceSize.MICRO), init: CloudFormationInit.fromConfigSets({ configSets: { default: ["install"], }, configs: { install: new InitConfig([ // 直接指定ec2-user的家目录路径,避免用户上下文混淆 InitFile.fromString("/home/ec2-user/jomar.sh", "testing 123"), // 赋予脚本执行权限 InitCommand.shellCommand("chmod +x /home/ec2-user/jomar.sh"), // 将文件所有权转移给ec2-user,确保登录后能正常访问 InitCommand.shellCommand("chown ec2-user:ec2-user /home/ec2-user/jomar.sh"), ]), }, }) });
关键改动说明:
- 移除无用的
cd ~命令,直接使用绝对路径/home/ec2-user/jomar.sh创建文件,确保脚本出现在SSM登录用户的家目录下 - 添加
chown命令将文件所有权设置为ec2-user,避免权限问题导致无法访问 - 确保CFN.init在实例创建阶段自动执行这些操作,脚本会随堡垒主机实例持久化存在(除非实例被销毁重建,此时CDK重新部署会自动重新生成脚本)
验证方法:
通过SSM连接堡垒主机后,直接执行ls /home/ec2-user即可看到jomar.sh,或者直接运行./jomar.sh执行脚本。若仍未生成,可查看CFN.init日志确认执行情况:
cat /var/log/cfn-init.log
内容的提问来源于stack exchange,提问作者Jordin Vell
相关产品推荐
相关产品推荐

