在CloudFormation中使用Sub函数是否会阻碍bash脚本的正常执行?
解决方案
实现合理性判断
你当前的实现思路没有问题,不属于不良实践,但存在两处语法错误和一处不规范写法,是导致第三条命令无法执行的核心原因:
- Bash侧的
$符号未转义,被!Sub函数错误解析!Sub默认会识别字符串中所有$开头的变量标识,你第三行的$(curl)和$(cat)中的$没有转义,CloudFormation会尝试将其解析为平台侧变量,解析失败后该行会被丢弃,自然不会执行。 - 执行脚本时未使用绝对路径
你将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
相关产品推荐
相关产品推荐

