Terraform配置AWS LaunchTemplate UserData Bash脚本执行报错排查
问题根因
报错核心是Bash脚本变量赋值语法不符合Shell规范,同时对Terraform templatefile 函数的渲染逻辑存在认知偏差:
templatefile会在Terraform执行plan/apply阶段,直接把模板中所有未转义的${变量名}占位符替换为传入的实际字面量值,不存在“脚本运行时接收Terraform参数”的过程,AWS控制台看到的UserData内容就是已经完成全部替换的最终脚本。- 参数替换正确但依然报
app_name: command not found,是因为脚本中对应位置的变量赋值语句等号两侧加了空格。Shell会把等号前的字符串识别为要执行的命令,而非赋值操作。比如脚本里写了app_name = ${app_name},渲染后变成app_name = test-app,Shell执行时会直接尝试运行app_name命令,自然抛出command not found错误。 - 脚本中用
$${变量名}的写法逻辑正确:templatefile会把$$转义为单个$,渲染后就是Shell可识别的${变量名}变量引用语法,这部分无需修改。
修复方案
修正脚本变量赋值语法
Shell变量赋值的固定规则是变量名=值,等号两侧绝对不能加空格,把脚本中所有接收Terraform传入值的赋值行调整为如下格式:
#!/bin/bash set -x # 正确赋值写法,等号无空格,建议给变量值加双引号避免特殊字符解析问题 app_name="${app_name}" environment="${environment}" max_memory_perc="${max_memory_perc}" min_memory_perc="${min_memory_perc}" # 后续扩缩容规则名称拼接逻辑,保持原有$${变量名}写法即可,例如模板中写: # scaling_rule_name="$${app_name}-$${environment}-memory-autoscaling" # 渲染后会生成Shell可正常执行的: # scaling_rule_name="${app_name}-${environment}-memory-autoscaling"
本地提前校验渲染结果
不用等EC2启动才排查问题,可在Terraform项目目录本地执行校验:
- 执行
terraform console进入Terraform交互控制台 - 输入对应资源的user_data解析命令(替换为你实际的资源名),直接输出渲染完成的最终脚本:
base64decode(aws_launch_template.your_launch_template_name.user_data) - 把输出的脚本保存到本地文件,执行
bash -n 脚本文件名.sh做Shell语法校验,可提前发现绝大多数语法错误。
可选优化:增加脚本严格错误检查
在脚本set -x行后增加set -euo pipefail配置,脚本遇到错误会直接退出,不会继续执行后续逻辑,降低排错成本:
#!/bin/bash set -x set -euo pipefail # 后续业务逻辑
内容的提问来源于stack exchange,提问作者Sylvain.M
相关产品推荐
相关产品推荐

