You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:40:34