AWS CloudFormation模板Fn::Sub结合Bash参数替换失效问题
问题根因
你写的CFNREPO相关两行代码所在的模板块没有被!Sub内置函数处理,CloudFormation不会自动解析替换块内的${URL}参数占位符,导致这部分内容原样输出到UserData中,而bash执行时没有定义URL变量,无法完成预期的字符串替换。
解决方案
方案1:合并为单个!Sub块(更简洁,推荐)
直接把所有UserData逻辑放在同一个!Sub块内,无需用!Join拼接多段,注意bash的变量占位符需要用反斜杠转义$,避免被CloudFormation误解析:
UserData: Fn::Base64: !Sub | #!/bin/bash set -o xtrace . . git clone ${URL} # 将CloudFormation参数值赋值给bash变量 URL="${URL}" # 转义$符,让bash执行字符串替换 CFNREPO=\${URL/aws.*/aws-cfn.git} git clone \${CFNREPO} GITHUBURL: ${githubURL} . .
方案2:保留原有!Join结构修改
给第二段代码块也加上!Sub修饰,同时转义bash变量的$符:
UserData: Fn::Base64: !Join - '' - - !Sub | #!/bin/bash set -o xtrace . . git clone ${URL} - !Sub | URL="${URL}" CFNREPO=\${URL/aws.*/aws-cfn.git} git clone \${CFNREPO} - !Sub | GITHUBURL: ${githubURL} . .
内容的提问来源于stack exchange,提问作者B Poorva
相关产品推荐
相关产品推荐

