通过CloudFormation UserData安装CodeDeploy Agent时Fn::Sub报错如何解决
问题原因
你使用!Sub(CloudFormation Fn::Sub 函数的简写)包裹了整个UserData脚本,Fn::Sub会默认解析脚本中所有${变量名}格式的内容,尝试将其替换为CloudFormation模板中定义的参数、资源属性或伪参数。
而你脚本中的${PLAT}、${REGION}、${AUTOUPDATE}都是运行在EC2实例内部的bash脚本变量,不属于CloudFormation侧的可替换变量,因此linter会抛出找不到对应参数的E1019错误。
控制台直接填入UserData可正常运行,是因为该场景下内容不会经过CloudFormation Fn::Sub函数的解析处理,${}语法会原样保留交给bash执行,不存在变量匹配校验的问题。
解决方法
方法1:转义bash侧的变量符号
如果你需要在UserData中同时使用CloudFormation侧的变量替换能力,只需要给所有bash脚本变量的$符号添加反斜杠转义,告诉Fn::Sub不要解析这些内容:
- 将
${PLAT}修改为\${PLAT} - 将
${REGION}修改为\${REGION} - 将
${AUTOUPDATE}修改为\${AUTOUPDATE}
修改完成后Fn::Sub只会解析你没有转义的${}内容,转义后的内容会原样输出到UserData中交给bash执行。
方法2:移除不需要的!Sub函数
如果你整个UserData脚本中不需要用到任何CloudFormation侧的变量替换,直接去掉!Sub修饰即可:
UserData: 'Fn::Base64': | # 后面直接跟你的原始bash脚本,不需要做任何修改
此时CloudFormation不会解析脚本中的${}语法,自然不会触发参数不存在的报错。
内容的提问来源于stack exchange,提问作者Franchise
相关产品推荐
相关产品推荐

