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

在CloudFormation中使用Sub函数是否会阻碍bash脚本的正常执行?

解决方案

实现合理性判断

你当前的实现思路没有问题,不属于不良实践,但存在两处语法错误和一处不规范写法,是导致第三条命令无法执行的核心原因:

  1. Bash侧的$符号未转义,被!Sub函数错误解析
    !Sub默认会识别字符串中所有$开头的变量标识,你第三行的$(curl)和$(cat)中的$没有转义,CloudFormation会尝试将其解析为平台侧变量,解析失败后该行会被丢弃,自然不会执行。
  2. 执行脚本时未使用绝对路径
    你将script.sh下载到了/home/ubuntu目录下,但执行时直接写bash script.sh,系统会在当前工作目录(默认是/root)查找文件,找不到自然执行失败。

修复方案

按照如下写法修改即可,同时增加了错误校验和日志输出逻辑,方便后续排查问题:

Fn::Base64: 
  !Sub 
    - |
      #!/bin/bash
      # 开启错误退出和执行日志,日志会输出到/var/log/cloud-init-output.log
      set -euxo pipefail
      echo ${EBS} > /home/ubuntu/test.txt
      aws s3 cp s3://s3url/script.sh /home/ubuntu/
      # 给脚本加执行权限,避免权限不足
      chmod +x /home/ubuntu/script.sh
      # bash侧的$前加$$转义,避免被!Sub解析,同时使用脚本的绝对路径
      bash /home/ubuntu/script.sh "$$(curl http://169.254.169.254/latest/meta-data/local-ipv4)" "$$(cat /home/ubuntu/test.txt)"
    - {EBS: !Ref DevEBS} 

cloud-boothook导致SSH无法登录的原因

cloud-boothook是cloud-init执行的最早阶段,此时实例的SSH密钥、用户目录权限还未完成初始化,如果在这个阶段操作/home/ubuntu目录、修改sshd相关配置,都会导致后续密钥注入失败,你不需要使用这个标识,默认的#!/bin/bash格式的UserData会在实例网络、SSH配置都初始化完成后执行,不会影响SSH登录。


内容的提问来源于stack exchange,提问作者StackPro_1111

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 23:54:03